牛客网原题
题目
给定一个长度不小于2的数组arr。 写一个函数调整arr,使arr中要么所有的偶数位上都是偶数,要么所有的奇数位上都是奇数上。 要求:如果数组长度为N,时间复杂度请达到O(N),额外空间复杂度请达到O(1),下标0,2,4,6…算作偶数位,下标1,3,5,7…算作奇数位,例如[1,2,3,4]调整为[2,1,4,3]即可
解题思路
判断数组最后一位元素arr[len-1]是奇数还是偶数,若是偶数,则与偶数位的数进行交换后将要交换偶数位向后移两个位置(移到下一个要交换的数组元素位置),若是奇数,则与奇数位的数进行交换后同理向后移两个位置即可。
代码实现
public void oddInOddEvenInEven(int[] arr) {
//数组长度len
int len = arr.length;
//交换的偶数位i,交换的奇数位j
int i = 0,j=1;
while (i<len && j<len) {
if (arr[len-1]%2==0) {
//交换数组中len-1和i位置的元素
swap(arr,len-1,i);
i+=2;
}else {
swap(arr,len-1,j);
j+=2;
}
}
}
private static void swap(int[] arr,int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}