这种将数组按照某种规则一分为二的题目基本都可以使用双指针方法。
双指针又分为快慢双指针和相向双指针,此题使用两种方式。
1.快慢双指针
设fast和low两个指针,一前一后向右扫描。low指针用来标示分界点,设定low的左边都是奇数,右边都是偶数。fast是工作指针,在前面,当发现奇数时将对应的元素值和low位置的元素进行交换,然后low++。这样扫描一次便可以将所有的奇数都调到前面。
class Solution {
public int[] exchange(int[] nums) {
int fast=0,low=0;
for(;fast<nums.length;fast++){
if((nums[fast]&1)!=0){
int temp=nums[fast];
nums[fast]=nums[low];
nums[low++]=temp;
}else{
}
}
return nums;
}
}
2. 相向双指针
设置left和right两个指针。left从左到右扫描,扫到第一个偶数时停止。right从右向左扫描,扫到第一个奇数时停止。然后将left和right进行交换,知道left》=right。
class Solution {
public int[] exchange(int[] nums) {
int left=0,right=nums.length-1;
while(left<=right){
while(left<=right&&(nums[left]&1)!=0) left++;
while(left<=right&&(nums[right]&1)==0) right--;
if(left>right) break;
int temp=nums[left];
nums[left]=nums[right];
nums[right]=temp;
left++;
right--;
System.out.println(left+" "+right);
}
return nums;
}
}