设计思想(一):
维护两个指针,第一个指针初始化指数组首地址,它只向后移动;第二个初始化指数组末尾,它只向前移动。在二者相遇前,若第一个指针指偶数,第二个指针指奇数则交换二者位置
代码:
#include <iostream>
using namespace std;
void RecorderOddEven(int* pData, unsigned int length)
{
if (pData == nullptr || length <= 0)
return;
int* pstart = pData;
int* pEnd = pData + length - 1;
while (pstart < pEnd)
{
while ((pstart < pEnd) && (((*pstart) & 0x1)==1)) //(*pstart & 0x1 != 1)运算速度比(*pstart %2 != 1)快
{
pstart++;
}
while (pstart < pEnd && (((*pEnd) & 0x1)!=1))
{
pEnd--;
}
if (pstart < pEnd)
{
int tmp = *pstart;
*pstart = *pEnd;
*pEnd = tmp;
}
}
}
void Teat1()
{
const int length_Data = 10;
int Data1[length_Data] = { 5, 9, 8, 4, 1, 10, 2, 7, 3, 6 };
RecorderOddEven(Data1, length_Data);
for (int i = 0; i < length_Data; ++i)
cout << Data1[i] << " ";
}
int main()
{
Teat1();
return 0;
}
设计思想二、
如果要求把数组按照大小分成两部分,所有负数排在非负数前面,怎么做?
能被3整除的数排在不能被3整除的数前面,怎么做?
如果面试官希望我们给出一种模式,解决一系列问题的通用办法,而不是专门为一个问题定义一个函数
void Recorder(int* pData, int length,bool (*func)(int))
{
if (pData == nullptr || length <= 0)
return;
int* pstart = pData;
int* pEnd = pData + length - 1;
while (pstart < pEnd)
{
while ((pstart < pEnd) && (func(*pstart)==1)) //(*pstart & 0x1 == 1)运算速度比(*pstart %2 == 1)快
{
pstart++;
}
while ((pstart < pEnd) && (func(*pEnd)!=1)) //(*pstart & 0x1 != 1)运算速度比(*pstart %2 != 1)快
{
pEnd--;
}
if (pstart < pEnd)
{
int tmp = *pstart;
*pstart = *pEnd;
*pEnd = tmp;
}
}
}
bool IsEven(int x)
{
return (x & 0x01) == 1;//分组标准在此函数定义,其他部分不用改
}
void RecorderOddEven(int* pData, int length)
{
Recorder(pData, length, IsEven);
}
对于设计思想二,我们需要学习的是:
(1)int (*p)(); p是指向函数的指针,该函数返回一个整型值。学习指向函数的指针的用法
区别int *p(); p是一个返回指针的函数,该指针指整型数据
(2)学习上例中函数解耦的方法(解耦成两部分,一是判断数字应该在数组前半部分还是后半部分,二是拆分数组)。解耦的好处是提高了代码的可重用性
牛客网上的这道题题目要求如下:
题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
class Solution {
public:
void reOrderArray(vector<int> &array) {
if(array.size()==0)
return;
vector<int>:: iterator it=array.begin();
unsigned int size=array.size();
while(size)
{
if(*it%2==0)
{
int tmp=*it;
array.erase(it);
array.push_back(tmp);
size--;
}
else
{
++it;
--size;
}
}
}
};