题目—:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分
思路:
1.明确了题目需求,使得奇数位于左边,偶数位于右边;
当左边的元素位奇数,继续;
当右边元素为偶数,继续;
当这两个条件同时都不满足,也就是左边为偶数,右边为奇数,那么就调换两个元素位置。
考虑使用位运算,奇数&1必然=1,偶数&1必然等于0,以此区分是奇数还是偶数。
代码实现:
public static void reOrderArray(int [] array) {
int i=0;
int j=array.length-1;
int temp=0;
while(i<j){
if ((array[i]&1)==1){
i++;
continue;
}
if ((array[j]&1)==0) {
j--;
continue;
}
temp=array[i];
array[i]=array[j];
array[j]=temp;
i++;
j--;
}
for (int ii=0;ii<array.length;ii++){
System.out.print(array[ii]+",");
System.out.println();
}
}
题目二:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分 ,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路:
1.从前往后遍历,第一个元素如果是偶数,记住这个 偶数的角标位。如果不是偶数,啥也不干。
2.当遇到偶数的时候,判断这是不是第一个偶数,如果是 记住角标位。
3.当遇到奇数的时候,判断其前面有没有偶数,如果有,则将前面的连续的多个偶数,顺序往后移动一位,然后将奇数插入第一个偶数位置。
具体步骤如下例子:
2,1,8,3,4,9 //index=0
index>=0 奇数1 和2 交换位置 然后修改index=1
1,2,8,3,4,9 //index=1
1,3,2,8,4,9 //index=2
index>=0 奇数3存入临时变量,然后元素2 和8 依次后移,之后将3存入2位置。
1,3,9,2,8,4 //index=3
index>=0 奇数9存入临时变量,然后元素2 ,8和4 依次后移,之后将9存入2位置。
代码实现:
public static void reOrderArray2(int [] array) {
int i=0;
int j=array.length;
int index=-1;
if (array.length==0){ //数组为空,啥也不干!
return;
}
while(i<j){
if ((array[i]&1)==1){
if (index>=0){
//和index位置元素交换
int ss=array[i];
for (int in=i;in>index;in--)
array[in]=array[in-1];
array[index]=ss;
index++;
}
i++;
continue;
}else{
//这里很关键,需要记住从左边开始的第一个偶数的位置,如果第一个元素就是偶数,这个临界值一定要考虑到。
//如果第一个元素不是偶数,那当遍历到第一个偶数的时候,开始记住其角标。
if(i==0)
index=0;
if (index<0)
index=i;
i++;
continue;
}
}