【剑指Offer】【数组】调整数组顺序使奇数位于偶数前
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
A1: 从头到尾扫描数字,若为偶数则移到数组的尾端
A2:双指针,起始指针向后找偶数,尾部指针向前找奇数,当start > end时停止扫描 ===> 不稳定,会改变数组顺序,案例不通过
A3:从头到尾扫描奇数,保存到新创建的数组中,再从头到尾扫描偶数,保存到新创建的数组中 ===> 感觉时间复杂度会比较大,空间复杂度也会比较大
//从头到尾扫描,遇到偶数则移到数组尾
class Solution { public: void reOrderArray(vector<int> &array) { if(array.empty()) { return; } vector<int>::iterator it = array.begin(); for(int i = 0; i < array.size(); i++) { if((*it & 0x1) == 0) { int tmp = *it; array.erase(it); array.push_back(tmp); } else { it++; } } } };
//双指针,交换前面的偶数和后面的奇数
不符合测试用例
//扫描两边数组
class Solution { public: void reOrderArray(vector<int> &array) { if(array.empty()) { return; } vector<int> tmp; for(int i = 0; i < array.size(); i++) { if((array[i] & 0x1) != 0) { tmp.push_back(array[i]); } } for(int i = 0; i < array.size(); i++) { if((array[i] & 0x1) == 0) { tmp.push_back(array[i]); } } array = tmp; } };
相关题目:
数组操作:输入一个无序整数数组,调整数组中数字的顺序, 所有偶数位于数组的前半部分,使得所有奇数位于数组的后半部分。要求时间复杂度为O(n)。
回文数组:对于一个给定的正整数组成的数组 a[] ,如果将 a 倒序后数字的排列与 a 完全相同,我们称这个数组为“回文”的。例如, [1, 2, 3, 2, 1] 的倒序是他自己,所以是一个回文的数组;而 [1, 2, 3, 1, 2] 的倒序是 [2, 1, 3, 2, 1] ,所以不是一个回文的数组。对于任意一个正整数数组,如果我们向其中某些特定的位置插入一些正整数,那么我们总是能构造出一个回文的数组。
中位数:小M给你一个长度为n的数组,我们定义median数为该数组从小到大排序后,下标为(n-1)/2的数字。下标从0开始,(n-1)/2表示整数除法,即向下取整。现在我们已经得到了一个初始的数组,我们希望这个数组的median数是一个给定数字x。所以我们需要加入一些数到数组中从而完成我们的目标。数组中的元素可以重复,请问,最少需要加入多少个数字才能达成这个目标。