算法—输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分, 并保证奇数和奇数,偶数和偶数之间的相对位置不变

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;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值