您的位置:首页 > 职场人生

剑指offer面试题之调整数组顺序奇数在偶数之前

2016-03-20 21:03 309 查看
1,问题:

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

2,想法:

(1),从头往后扫描,遇到交换情况就交换,但需要移动来保持相对位置不变。

(2),设置辅助空间,扫描原数组,遇到偶数存在辅助空间中,遇到奇数就覆盖原数组的前段,最后再把辅助空间中的数赋值给原数组。

3,在牛客网上的代码为:

class Solution {
public:
//自己想的思路,用的辅助空间比较少
/*bool jiOu(int n)//判断奇偶
{
if ((n & 1) == 1)
{
return false;
}
else
return true;
}
void swap(int &m, int &n)
{
int temp;
temp = m;
m = n;
n = temp;
}
//设两个指针,
//思想是:
//从前往后扫描,遇到偶奇情况就交换,并移动保持偶数之间相对位置不变
//若是偶偶情况第一个指针不动,第二个指针向后移动一位,这样可以保持相对位置不变
void reOrderArray(vector<int> &array) {
if (array.empty())
{
return;
}
int i,j,k;
int length = array.size();
int tempval;//移动时作副本值
for (i = 0, j = 1; j < length;)
{
if (jiOu(array[i]) && jiOu(array[j]))//偶偶情况
{
j++;
}
else if (!jiOu(array[i]) && !jiOu(array[j]))//奇奇情况
{
i++;
j++;
}
else if (!jiOu(array[i]) && jiOu(array[j]))//奇偶情况
{
i++;
j++;
}
else//偶奇情况,需要交换和移动
{
tempval = array[i];//保存偶数值,方便移动后插入
swap(array[i], array[j]);
for (k = j - 1; k >= i + 1; k--)
{
array[k + 1] = array[k];
}
array[k + 1] = tempval;
}
}
}
*/
//另一条思路:建立辅助空间,扫描一遍数组,把偶数读进去
//奇数覆盖array数组的前段数字
//用的辅助空间应该多一些
void reOrderArray(vector<int> &array) {
if (array.empty())
{
return;
}
int m = array.size();
vector<int> temp(m);
int i = -1;
int j = -1;
for (int k1 = 0; k1 < m; k1 ++)
{
if (array[k1] % 2 == 0)//偶数
{
temp[++i] = array[k1];
}
else
{
array[++j] = array[k1];//k1增长比j快,不会有覆盖后边值得情况
}
}
for (int k1 = 0; k1 <= i; k1 ++)
{
array[++j] = temp[k1];
}
}

};
反省:

思路不是很清晰,编了很久才出来,不过自始至终都是自己闷头想出来的,还能接受!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: