题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
归类:数组,筛选
思路
1·排除特殊情况:数组长度为0 or 不存在
if(array==null || array.length ==0)
2·(思路)需要给出初始、判断循环、终止
- 两个游标i,j相邻,j = i+1
- i后移,i为偶数时,j右移,j指向奇数时,将j所指的数左移(j-i)次,至i的前面,然后i从j+1开始继续此循环
- 当j右移直到n-1没有奇数,结束循环
3.(思路)相比于每次判断偶数时交换,不如判断两个奇数中间有间隔时交换,这样可以可以对连续偶数的情况,实现快速处理。 - 定义三个游标:i负责遍历,j负责交换时移位,m负责存储第m个奇数的位置
- 每次循环执行顺序,tmp=array[i],j=i,
- 每次循环执行选择,当j=i>m+1时,循环移位array[j] = array[j-1],array[m] = tmp
- 每次循环执行顺序,m=j+1
代码实现
链接:https://www.nowcoder.com/questionTerminal/beb5aa231adc45b2a5dcc5b62c93f593?answerType=1&f=discussion
来源:牛客网
public class Solution {
public void reOrderArray(int [] array) {
//(选择)特殊情况剔除
if(array==null || array.length ==0){
return ;
}
//(顺序)定义一个游标m,存放上一个奇数的位置
int m = 0;
//(循环)循环数组长度次,判断为奇数时进入分支,
for(int i=0;i<array.length;i++){
//(选择)当为连续奇数的时候,不改变,当跳过了偶数,j=i>m时,则交换
if((Math.abs(array[i])) % 2 != 0){
int tmp = array[i];
int j=i;
//(循环)循环移位操作,把偶数移至i左边
while(j>m){
array[j] = array[j-1];
j--;
}
//(顺序)直到j=m时,将tmp赋给array[m]
array[m] = tmp;
//(顺序)m右移一位,用来存放下一个奇数
m=j+1;
}
}
}
}
总结
1·math.abs的作用?