今天面试遇到这样一道题,一个长度为2n的整数数组,里边有n个奇数n个偶数但是无序,要求奇数位放奇数偶数位放偶数
结题思路:
采用双指针分别记录奇数位和偶数位,当偶数位的值错误的时候如果奇数错误的index不为空则交换数值,如果为空则将index记录下来。奇数同理
public static void main(String[] args) {
sort(new int[]{1, 1, 1, 1, 2, 2, 2, 2});
}
//方法一
public static int[] sortJO(int[] array) {
int jIndex = 1;
int oIndex = 0;
while (jIndex < array.length || oIndex < array.length) {
//循环直到找到需要移动的位置或是直接到最后
while (oIndex < array.length && array[oIndex] % 2 == 0) {
oIndex += 2;
}
while (jIndex < array.length&& array[jIndex] % 2 == 1) {
jIndex+=2;
}
if (oIndex < array.length&&jIndex<array.length){
int temp = array[jIndex];
array[jIndex] =array[oIndex];
array[oIndex] = temp;
}
}
return array;
}
//方法二
public static void sort(int[] nums) {
int o = 0;//偶数index
int j = 1;//奇数index
int error_j = -1;//存放错误基数的index
int error_o = -1;//存放错误偶数的index
while (o < nums.length || j < nums.length - 1) {
if (nums[o] % 2 == 0) {
if (o < nums.length) o += 2;
} else {
if (error_j != -1) {
int temp = nums[error_j];
nums[error_j] = nums[o];
nums[o] = temp;
error_j = -1;
if (o < nums.length) o += 2;
} else {
error_o = o;
}
}
if (nums[j] % 2 == 1) {
if (j < nums.length - 1) j += 2;
} else {
if (error_o != -1) {
int temp = nums[error_o];
nums[error_o] = nums[j];
nums[j] = temp;
error_o = -1;
if (j < nums.length - 1) j += 2;
} else {
error_j = j;
}
}
print(nums);
}
}
输出结果:
1 1 1 1 2 2 2 2
1 1 1 1 2 2 2 2
2 1 1 1 2 1 2 2
2 1 1 1 2 1 2 2
2 1 2 1 2 1 2 1
2 1 2 1 2 1 2 1
2 1 2 1 2 1 2 1