解法1:while每次循环只做一件事
int* exchange(int* nums, int numsSize, int* returnSize){
if (returnSize != NULL)
*returnSize = numsSize;
if (nums == NULL || numsSize <= 1)
return nums;
int left = 0, right = numsSize - 1;
int tmp;
while (left < right) {
if (nums[left]%2) {
left++;
continue;
}
if (nums[right]%2 == 0) {
right--;
continue;
}
tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
left++;
right--;
}
return nums;
}
解法2:while每次循环尽可能多地排除符合条目
int* exchange(int* nums, int numsSize, int* returnSize){
if (returnSize != NULL)
*returnSize = numsSize;
if (nums == NULL || numsSize <= 1)
return nums;
int left = 0, right = numsSize - 1;
int tmp;
while (left < right) {
while (nums[left]%2) {
left++;
if (left == right) //及时增加判断,避免数组越界
return nums;
}
while (nums[right]%2 == 0) {
right--;
if (left == right) //及时增加判断,避免数组越界
return nums;
}
tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
left++;
right--;
}
return nums;
}
注:内层while中一定要对下标进行判断和处理,避免数组越界访问。