题目
题解
1.新建数组并返回
思路新建一个同样大小的数组、遍历原数组,开两个指针、一个头指针向前走、一个尾指针向后退,遍历到奇数放头指针然后头指针向前一步、偶数放到尾指针然后向后退,遍历完之后不管怎样头指针最后一定是与尾指针相邻的。
public int[] exchange(int[] nums) {
int n = nums.length;
int l = 0;
int r = n-1;
int[] result = new int[n];
for (int i = 0; i < n; i++) {
if ((nums[i]&1) != 0){
result[l] = nums[i];
l++;
}else {
result[r] = nums[i];
r--;
}
}
return result;
}
2.快慢双指针
fast是做找奇数的作用,low用于找偶数,当有个先找到时会先停下来等待另一个人也找到对应的奇数或者偶数时交换位置再接着下一个。结束条件是找到最后都没有奇数了。
public int[] exchange02(int[] nums) {
int low=0,fast=1;
int temp;
while (fast < nums.length){
if ((nums[fast] & 1) != 0 && (nums[low] & 1) == 0){
temp = nums[fast];
nums[fast] = nums[low];
nums[low] = temp;
low++;
}
if ((nums[low] & 1) != 0){
low++;
}
fast++;
}
return nums;
}
3.首尾双指针
l往前进、r往后退,等到两个都是找到了对应的奇偶数时就交换位置。结束条件是找到最后没有
public int[] exchange01(int[] nums) {
int l = 0;
int r = nums.length - 1;
int temp = 0;
while (l<r){
if ((nums[l]&1)==0&&(nums[r]&1)!=0){
temp = nums[l];
nums[l] = nums[r];
nums[r] = temp;
}
if ((nums[l]&1)!=0){
l++;
}
if ((nums[r]&1)==0){
r--;
}
}
return nums;
}