华为招聘机试整理7:给定一个数组input[]
华为招聘机试整理7:给定一个数组input[]
题目:给定一个数组intput[]
假设数组长度n为奇数。则将数组中最大的元素放到 output[] 数组最中间的位置,假设数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上。然后再按从大到小的顺序,依次在第一个位置的两边。依照一左一右的顺序,依次存放剩下的数。
比如:input[] = {3, 6, 1, 9, 7} output[] = {3, 7, 9, 6, 1};
input[] = {3, 6, 1, 9, 7, 8} output[] = {1, 6, 8, 9, 7, 3}
题目分析:
该题主要考察数组之间数据的排列和数组与数组直接数据的传送与接收。
算法思路:
①首先将输入的整型数据按升序排列 这里没有必要用冒泡法直接用#include<algorithm>中的sort
②找出中间位置middle,而且将最大的数据放进middle
③之后一个for循环。
1)当n为奇数时,我们能够直接以middle为中界限。循环去向左向右去查找,i 从1->middle
因为左边比右边大,所以将大的放入左边。次大的放入右边。
2)当n为偶数时,我们以middle为中界限,这里就要注意了,输出数据中第一位数据无法循环到,所以我们i 仅仅能从1->middle-1了,并且最后直接将输入最小的数值放入输出数组的第一位上面。
这里须要注意一个小技巧就是,数组直接数据的传输,我们最好设置一个新的变量k。
===============================================================================
參考代码:
//给定一个数组input[]
//2014.7.10 hepanhui
#include <iostream>
#include <algorithm>
const int maxn = 100;
using namespace std;
void sort(int input[], int n, int output[])
{
int middle;
int k = 1;
sort(input,input + n);
//n为奇数时
if(n%2)
{
middle = (n-1)/2;
output[middle] = input[n-1];
for(int i = 1; i <= middle; i++)
{
output[middle - i] = input[n - 1 - k];
output[middle + i] = input[n - 2 - k];
k = k + 2;
}
}
else
{
middle = n/2;
output[middle] = input[n-1];
for(int i = 1; i < middle; i++)
{
output[middle - i] = input[n - 1 - k];
output[middle + i] = input[n - 2 - k];
k = k+2;
}
output[0] = input[0];
}
}
int main()
{
int n;
cin >> n;
int input[maxn], output[maxn];
for(int i = 0 ;i < n; i++)
{
cin >> input[i];
}
sort(input, n, output);
for(int i = 0; i < n-1; i++)
{
cout << output[i] << ",";
}
cout << output[n-1] << endl;
return 0;
}
调试中易犯错误的地方:
①我们这里不须要#include<string>整型数组输入的时候,我们一般都会告诉数组有多大。我们不能用strlen来測其大小,由于strlen是用来測量字符串。
②for循环的时候要注意i是从1開始的,而不是0.由于我们中间最大的已经赋值了。
③数组间数据传送,我们有时候採用如果一个新的变量,这样会方便些。