在线题目链接:调整数组顺序使奇数位于偶数前面
1 题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
2 题目分析
2.1 方法1
这道题很简单,常规的做法是开一个数组arr,遍历两边原数组,第一遍找到所有的奇数,依次存入arr,第二遍找到所有的偶数,依次存到arr。
注意:如果这道题没有要求奇数和奇数,偶数和偶数之间的相对位置不变,则可以使用前后两个指针向中间遍历,前指针遇到偶数则与后指针的数交换,同理后指针遇到奇数则与前指针的数交换
2.11 Java代码
import java.util.ArrayList;
import java.util.List;
public class Solution {
public void reOrderArray(int [] array) {
List<Integer> arr = new ArrayList<Integer>();
for(int i=0;i<array.length;i++){
if(array[i]%2==1)arr.add(array[i]);
}
for(int i=0;i<array.length;i++){
if(array[i]%2==0)arr.add(array[i]);
}
for(int i=0;i<array.length;i++)
array[i]=arr.get(i);
}
}
2.12 C++代码
class Solution {
public:
void reOrderArray(vector<int> &array) {
vector<int> arr;
int size=array.size();
for(int i=0;i<size;i++){
if(array[i]%2==1)arr.push_back(array[i]);
}
for(int i=0;i<size;i++){
if(array[i]%2==0)arr.push_back(array[i]);
}
array.swap(arr);
}
};
2.2 方法2
实际上,这道题的解法,还可以使用类似于冒泡排序的算法,只不过在这里当我们遇到相邻两个数的前一个数为偶数后一个数为奇数时,就交换两数。(这与冒泡排序中前一个数大于后一个数则交换很相似,所以称为类冒泡法)
这种方法也很好写,直接写两个for循环即可,注意数组不要越界即可
2.21 Java代码
public class Solution {
public void reOrderArray(int [] array) {
for(int i = 0;i < array.length;i++){
for(int j = 0;j< array.length-i-1;j++){
if(array[j]%2==0&& array[j+1]%2==1){
int t = array[j];
array[j]=array[j+1];
array[j+1]=t;
}
}
}
}
}
2.22 C++代码
class Solution {
public:
void reOrderArray(vector<int> &array) {
for(int i = 0;i < array.size();i++){
for(int j = 0;j< array.size()-i-1;j++){
if(array[j]%2==0&& array[j+1]%2==1){
int t = array[j];
array[j]=array[j+1];
array[j+1]=t;
}
}
}
}
};
还可以使用C++STL中的stable_partition函数:
class Solution{
public:
static bool cmp(int n){
return ((n & 1) == 1);
}
void reOrderArray(vector<int> &array){
stable_partition(array.begin(),array.end(),cmp); //把奇数排在前面
}
};
3 总结
注意考虑交换后奇数与奇数,偶数与偶数的相对位置保持不变。
探讨学习加:
个人qq:1126137994
个人微信:liu1126137994