调整数组顺序使奇数位于偶数前面
- 参与人数:3497时间限制:1秒空间限制:32768K
- 通过比例:17.74%
- 最佳记录:0 ms|0K(来自 zhb186)
题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
1 /* C++ 2 如果题目要求保证奇数和奇数、偶数和偶数之间的相对位置不变, 3 就可以使用vector的erase和push_back进行操作。 4 顺序遍历数组arr,遇到偶数,则删除该值,并将该值push到arr数组的末尾。 5 时间复杂度为O(n)。 6 注意:需要设置一个index,控制处理的数值个数,当处理次数等于数组大小时结束, 7 否则当已将所有偶数放在数组后面时,将进入死循环。 8 */ 9 10 void reOrderArray(vector<int> &arr){ 11 int tmp; 12 int index = 0; 13 for (vector<int>::iterator it = arr.begin(); it != arr.end(); ){ 14 index++; 15 if ( (*it & 1) == 0){ // 偶数 16 tmp = *it; 17 it = arr.erase(it); 18 arr.push_back(tmp); 19 } 20 else 21 it++; 22 if (index == arr.size()) 23 return; 24 } 25 }
1 /* C 2 如果不要求保证奇数和奇数、偶数和偶数之间的相对位置不变! 3 1、最简单的思路: 4 与上面的C++方法一样,但是在C中,从头扫描数组,每碰到一个偶数, 5 就拿出该数字,把该数字后面的所有数字往前移动1位,然后把该数字放在数组末尾。 6 时间复杂度为O(n^2)。 7 2、另一种思路: 8 设置两个指针p1、p2,分别指向数组的第一个和最后一个数字,p1只向后移动,p2指向前移动。 9 如果p1指向的为偶数,且p2指向的为奇数,则交换这两个数字。 10 时间复杂度为:O(n)。 11 在实现中,使用了函数指针,这样就给出了一个模型,可以解决一系列同类型的问题。 12 eg:所有负数都放在非负数前面;能被3整除的数放在不能被3整除的数前面,等等。 13 */ 14 bool isEven(int n){ 15 return (n & 1) == 0; 16 } 17 void reOrderArray(int *a, int len, bool (*func)(int)){ 18 if (a == NULL || len == 0) 19 return; 20 int p1 = 0, p2 = len-1; 21 while(p1 < p2){ 22 while(p1 < len && !func(a[p1])) // 向后移动p1,直到p1指向偶数 23 p1++; 24 while(p2 >= 0 && func(a[p2])) // 向前移动p2,直到p2指向奇数 25 p2--; 26 if (p1 < p2){ 27 int tmp = a[p1]; 28 a[p1] = a[p2]; 29 a[p2] = tmp; 30 } 31 } 32 } 33 int main(){ 34 int a[] = {1,2,3,4,5,6,7}; 35 reOrderArray(a, 7, isEven); 36 for (int i = 0; i < 7;i++) 37 cout << a[i] << endl; 38 return 0; 39 }