赞
踩
输入一个长度为 n 整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
数据范围:0≤n≤5000,数组中每个数的值:0≤val≤10000
要求:时间复杂度: O ( n ) O(n) O(n),空间复杂度: O ( n ) O(n) O(n)
进阶:时间复杂度: O ( n 2 ) O(n^2) O(n2),空间复杂度: O ( 1 ) O(1) O(1)
示例1
输入:[1,2,3,4]
返回值:[1,3,2,4]
示例2
输入:[2,4,6,5,7]
返回值:[5,7,2,4,6]
示例3
输入:[1,3,5,6,7]
返回值:[1,3,5,7,6]
首先可以考虑相对位置可以变化的情况
题目链接: 牛客JZ81:https://www.nowcoder.com/practice/0c1b486d987b4269b398fee374584fc8?tpId=13&tqId=2221866&ru=%2Fpractice%2Fef1f53ef31ca408cada5093c8780f44b&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&sourceUrl=
可以通过左右下标的方法,left下标找到偶数,right下标找到奇数,然后进行交换,left是奇数就++left,right是偶数就–right,一次类推完成所有数据的交换,但是这种方式是无法保证奇数和奇数,还有偶数和偶数的相对位置不变的。
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param array int整型vector * @return int整型vector */ vector<int> reOrderArrayTwo(vector<int>& array) { // write code here int left =0; int right=array.size()-1; while(left<right) { while(left<right&&(array[left]&1)) //左指针找偶数 { left++; } while(left<right&&!(array[right]&1)) //右指针找奇数 { right--; } if(left<right) //进行奇数和偶数的交换 { int tmp=array[left]; array[left]=array[right]; array[right]=tmp; } } return array; //返回整个数组 } };
首先遍历整个数组,查找数组中的奇数,找到后将它临时保存起来,然后将该奇数位置之前的所有偶数都向后移动一位,最后将该奇数放到移动后的空闲位置处,依次类推,就可以完成不改变顺序的奇数在前偶数在后的数组排序。
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param array int整型vector * @return int整型vector */ vector<int> reOrderArray(vector<int>& array) { // write code here if(array.empty()) { return {}; } int k=0; for(int i=0;i<array.size();i++) { if((array[i]&1)==1) //判断是否为奇数 { int tmp=array[i]; //保存奇数的值 int j=i; while(j>k) { array[j]=array[j-1]; //将k后面的偶数各向后移动一位 j--; } array[k++]=tmp; //将奇数放入移动后空闲的位置 } } return array; } };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。