题目1:可以不保持原数组奇数之间和偶数之间相对位置
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分。
链接:
剑指Offer(第2版):P129
思路标签:
算法:双指针
代码的可扩展性和通用性。
解答:
1. C++
基本解法:
- 基本的思想就是使用双指针,一个指针用来从前向后移动指向偶数,一个指针用来从后向前移动指向奇数;
- 如果偶数在前,则进行交换。
class Solution1 {
public:
void reOrderArray(vector<int> &array) {
if (array.size() == 0)
return;
int begin = 0;
int end = array.size() - 1;
while (begin < end) {
while (begin < end && (array[begin] & 1) != 0)
begin++;
while (begin < end && (array[end] & 1) == 0)
end--;
if (begin < end) {
int temp = array[begin];
array[begin] = array[end];
array[end] = temp;
}
}
return;
}
};
可扩展的解法:
- 本题对于相似的问题有很大的扩展性,所以将核心部分和判断部分解耦出来,判断部分使用函数指针来判断;
- 遇到其他相似的问题只需要修改判断函数即可;
- 注意函数指针需要使用static。
class Solution1 {
public:
void Reorder(int* pData, unsigned int length, static bool func(int)) {
if (pData == nullptr || length == 0)
return;
int* pBegin = pData;
int* pEnd = pData + length - 1;
while (pBegin < pEnd) {
while (pBegin < pEnd && !func(*pBegin))
pBegin++;
while (pBegin < pEnd && func(*pEnd))
pEnd--;
if (pBegin < pEnd) {
int temp = *pEnd;
*pEnd = *pBegin;
*pBegin = temp;
}
}
}
static bool isEven(int n) {
return (n & 1) == 0;
}
void ReorderOddEven(int* pData, unsigned int length) {
Reorder(pData, length, isEven);
}
};
题目2:要求保持奇数之间和偶数之间的相对位置
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路标签:
算法:插入排序思想
考察代码的完整性和全面性。
解答:
1. C++
- 与上面问题的最大不同就是要求保持奇数和奇数之间,偶数和偶数之间相对位置不变,所以这里不能再使用双指针;
- 基本的思想就是找到第一个在偶数后面的奇数,以及第一个偶数,将该奇数插入到偶数的前一个位置,也就是相应地依次移动前面的偶数;
- 需要考虑不同情况下的边界情况;
- 同时注意条件判断导致的程序错误,将边界条件
peven < length
放到前面,一旦不满足条件,则后面的不再执行;该程序中,如果array[peven]
放到前面,一旦peven超出范围,则会产生溢出错误。
class Solution {
public:
void reOrderArray(vector<int> &array) {
int length = array.size();
if (length == 0)
return;
int peven = 0;
while (peven < length && array[peven] % 2 == 1)
peven++;
if (peven == length)
return;
int podd = 0;
while (podd < length) {
while (podd < length && array[podd] % 2 == 0)
podd++;
if (podd == length)
return;
if (podd > peven) {
int temp = array[podd];
for (int i = podd; i>peven; i--) {
array[i] = array[i - 1];
}
array[peven] = temp;
peven++;
}
podd++;
}
return;
}
};