目录
- 问题描述
- 示例
- 具体思路
- 思路一
- 代码实现
问题描述
输入一个长度为 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)
题目链接: https://www.nowcoder.com/practice/ef1f53ef31ca408cada5093c8780f44b?tpId=13&tqId=1374930&ru=%2Fpractice%2F0c1b486d987b4269b398fee374584fc8&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&sourceUrl=
示例
示例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;
}
};