劍指offer 14---調整數組順序使奇數位於偶數前面


題目:

輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有奇數位於數組的前半部分,所有偶數位於數組的后半部分。


解析:


#include <iostream>
#include <assert.h>
#include <Windows.h>
using namespace std;

//整數數組中,奇數位於偶數前面
void OddEvenNumber(int* arr, int length)
{
if (arr == NULL || length == 0)
{
return;
}
int* begin = arr;
int* end = arr + length - 1;
while (begin < end)
{
//判斷一個數是偶數還是奇數,也可以用 x&1
while ((begin<end) && (*begin) % 2 == 1) //此時為奇數
{
++begin;
}
while ((begin<end) && (*end) % 2 == 0) //此時為偶數
{
--end;
}
while ((begin<end) && ((*begin) % 2 == 0) && ((*end) % 2 == 1))
{
*begin = *begin^*end;
*end = *begin^*end;
*begin = *begin^*end;
++begin;
--end;
}
}
}

void Test()
{
int arr[] = { 1, 3, 3, 4, 5, 6, 9, 8, 9, 10, 11, 34, 5, 6, 89, 0, 12 };
int length = sizeof(arr) / sizeof(arr[0]);
OddEvenNumber(arr, length);
int i = 0;
for (; i < length; ++i)
{
cout << arr[i] << " ";
}
cout << endl;
}

int main()
{
Test();
system("pause");
return 0;
}



擴展:

1.如果將題目改為把數組中的數按照大小分為兩部分,所有負數都位於非負數的前面,怎么做?

PS:這個題目幾乎和上述題目相同,只需要改幾個條件

//整數數組中,所有負數位於非負數前面
void OddEvenNumber(int* arr, int length)
{
if (arr == NULL || length == 0)
{
return;
}
int* begin = arr;
int* end = arr + length - 1;
while (begin < end)
{
//所有負數位於非負數前面
while ((begin<end) && ((*begin)<0)) //此時為負數
{
++begin;
}
while ((begin<end) && ((*end)>=0)) //此時為非負數
{
--end;
}
//此時begin指向非負數,end指向負數,需要交換
while ((begin<end) && ((*begin) >=0) && ((*end)<0))
{
*begin = *begin^*end;
*end = *begin^*end;
*begin = *begin^*end;
++begin;
--end;
}
}
}


2.如果在將題目改為,能被3整除的數都放在不能被3整除的前面,怎么辦?

PS:  還是只需要改幾個判斷條件。可以將不同的部分封裝成不同的函數,在函數體里調用完成不同功能。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com