剑指offer21. 调整数组顺序使奇数位于偶数前面P129

mac2025-06-11  34

剑指offer21. 调整数组顺序使奇数位于偶数前面 P129

题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

两点法,左右同时走指针,交换左边找的偶数和右边找到的奇数

void ReorderOddEven(int *nums, unsigned int length) { if (nums == NULL || length < 1) return ; int even = 0, odd = length - 1; while (even < odd) { // 不能 = while (even < odd && (nums[even] & 1) != 0) ++even; // 找偶数 while (even < odd && (nums[odd] & 1) == 0) --odd; // 找奇数 if (even < odd) { // 交换位置 int temp = nums[odd]; nums[odd] = nums[even]; nums[even] = temp; } } }

可扩展的解法: 如果把奇数偶数换成正负,能不能被3整除。。。等只需要修改大循环里的两个while的判断条件,那么就可以把判断条件解耦出来,传入独立的函数判断。

函数声明变成:void ReorderOddEven( int *nums, unsigned int length, bool (*func)(int) ) 两个判断条件分别变成: while (even < odd && !isEven(nums[even])) while (even < odd && isEven(nums[odd])) 单独定义判断函数:(根据不同要求定义不同的判断条件) bool isEven(int n) { 是不是偶数 return (n&1) == 0; } 顶层调用: reorderOddEven(nums, length, isEven)
最新回复(0)