题目:
输入一个整数数组,实现一个函数来调整该数组中数组的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分
思路:
1.不考虑多的情况下最简单的思路就是从头扫描这个数组,每碰到一个偶数,拿出这个数字,并把位于这个数字后面所有的数字往前挪动一位,然后再把这个数字放到最后面的那个空格里。但这个时间复杂度高达n^2,所以我们要尝试更高效的算法
2.想一想,在之前的基础上我们实际上就是用一个指针遍历这个数组,按照题目所需来移动数字,想要提高效率,其实只需要对这个方法进行改良就好了。我们设置一个指针还是指向第一个元素,再设置一个指针指向最后一个元素。如果前面的指针指的是奇数就把指针往后挪一位同样的道理,如果后面的指针指的是偶数的话就往前挪一位,直到前面的指针指的是偶数,然后后面的指针指的是奇数,就把两数交换。
3.这个题实际上如果改变要求条件的话,就是考验程序员对于扩展性的理解,能不能整理出一个框架的能力就体现在这里;其实不管改数组调整的什么条件其实都只要修改函数里的两个判断的标准,这个函数就其实就被解耦成两部分。一部分是判断数字应该在数组前半部分还是 后半部分的标准;二是拆分数组的操作。
代码实现:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* exchange(int* nums, int numsSize, int* returnSize) {
int left = 0, right = numsSize - 1;
*returnSize = numsSize;
while (left < right) {
while (left < numsSize && nums[left] % 2 == 1) {
left++;
}
while (right >=0 && nums[right] % 2 == 0) {
right--;
}
if (left >= right) {
break;
}
int tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
left++;
right--;
}
return nums;
}