解法一:双指针
public int[] Exchange(int[] nums) {
int head = 0;
int tail = nums.Length - 1;
while(head < tail)
{
if((nums[head] & 1) == 1)
{
head++;
continue;
}
else if((nums[tail] & 1) == 0)
{
tail--;
continue;
}
else
{
int temp = nums[head];
nums[head] = nums[tail];
nums[tail] = temp;
head++;
tail--;
}
}
return nums;
}
解法二:快慢指针
//快慢指针
public int[] Exchange(int[] nums) {
int low = 0;
int fast = 0;
while(fast < nums.Length)
{
if((nums[low] & 1) == 0)
{
if((nums[fast] & 1) == 1)
{
int temp = nums[low];
nums[low] = nums[fast];
nums[fast] = temp;
low++;
}
fast++;
}
else
{
low++;
fast++;
}
}
return nums;
}
优化点1:用与操作代替求余操作
如:if((nums[head] & 1) == 1)
优化点2:用异或实现交换操作,速度更快的同时节约一个临时变量
nums[slow] ^= nums[fast];
nums[fast] ^= nums[slow];
nums[slow] ^= nums[fast];