输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
提示:
1 <= nums.length <= 50000
1 <= nums[i] <= 10000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof
采用双指针法,一个从头到尾,一个从尾到头遍历,当遍历到的前面元素为偶数且遍历到的后面元素为奇数时,将两者互换。
bool IsEven(int number)
{
return (!(number & 1));
}
int* exchange(int* nums, int numsSize, int* returnSize){
int index1 = 0, index2 = numsSize - 1;
while(index1 < index2)
{
while((index1 < index2) && (!IsEven(nums[index1])))
index1++;
while((index1 < index2) && (IsEven(nums[index2])))
index2--;
if(index1 < index2)
{
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
}
*returnSize = numsSize;
return nums;
}
#include
#include
int *exchange(int *nums, int numsSize, int *returnSize);
void PrintTest(int nums[], int length)
{
for (int i = 0; i < length; i++)
{
printf("%d ", nums[i]);
}
printf("\n");
}
void Test1()
{
int return_size;
int nums[] = {1, 2, 3, 4, 5, 6, 7};
PrintTest(exchange(nums, sizeof(nums) / sizeof(int), &return_size), sizeof(nums) / sizeof(int));
}
void Test2()
{
int return_size;
int nums[] = {2, 4, 6, 8, 1, 3, 5, 7};
PrintTest(exchange(nums, sizeof(nums) / sizeof(int), &return_size), sizeof(nums) / sizeof(int));
}
void Test3()
{
int return_size;
int nums[] = {1, 3, 5, 7, 4, 6, 2, 8};
PrintTest(exchange(nums, sizeof(nums) / sizeof(int), &return_size), sizeof(nums) / sizeof(int));
}
void Test4()
{
int return_size;
PrintTest(exchange((int *)NULL, 0, &return_size), 0);
}
void Test5()
{
int return_size;
int nums[] = {8};
PrintTest(exchange(nums, sizeof(nums) / sizeof(int), &return_size), sizeof(nums) / sizeof(int));
}
int main(int argc, char* argv[])
{
// 功能测试
Test1(); // 奇数偶数交替出现
Test2(); // 所有偶数都在奇数前面
Test3(); // 所有奇数都在偶数前面
Test4(); // 输入NULL指针
Test5(); // 数组中只有一个元素
return 0;
}