奇數位上都是奇數偶數位上都是偶數
阿新 • • 發佈:2019-02-20
牛客OJ,最近幫做筆試的一道題。
原題
給定一個長度不小於2的陣列arr。 寫一個函式調整arr,使arr中要麼所有的偶數位上都是偶數,要麼所有的奇數位上都是奇數上。 要求:如果陣列長度為N,時間複雜度請達到O(N),額外空間複雜度請達到O(1),下標0,2,4,6…算作偶數位,下標1,3,5,7…算作奇數位,例如[1,2,3,4]調整為[2,1,4,3]即可
分析
牛客上面也有解析了,我也記錄分享一蛤。
題目要求是奇數位上都是奇數,或者偶數位上都是偶數。理想情況下,奇偶對半,這樣奇數在奇數位上,偶數在偶數位上。一般情況下,要麼奇數多,則奇數填滿奇數位後,肯定在偶數位上也有;,同理,偶數多的情況。
因此,這個題目的思路就是,一次遍歷,兩個指標或索引分別指向奇數位和偶數位,只要發現不符合就交換。
#include <iostream>
#include <vector>
using namespace std;
void Adjust( vector<int>& arr);
void printArray( vector<int>& arr);
bool isEven(int &num);
void swap(int &a,int &b)
{
int tmp=a;
a=b;
b=tmp;
}
int main()
{
int a[]={1,2,3,4};
vector<int>arr(a,a+4);
printArray(arr);
Adjust(arr);
printArray(arr);
return 0;
}
void printArray(vector<int>&arr)
{
int i;
for(i=0;i<arr.size();i++)
{
cout << arr[i]<< " ";
}
cout << endl;
}
void Adjust(vector<int>&arr)
{
int oddCount=1;
int evenCount=0;
int n=arr.size();
int i;
while(oddCount<n &&evenCount<n)
{
//如果沒有問題就往上累加。
while(evenCount<n&&isEven(arr[evenCount]))
evenCount+=2;
while(oddCount<n&&!isEven(arr[oddCount]) )
oddCount+=2;
//跳出迴圈說明兩者至少有一個不滿足,或者已經便利完成。
//這樣一交換肯定會滿足一方。
if(evenCount < n && oddCount<n)
{
swap(arr[evenCount],arr[oddCount]);
}
}
return;
}
bool isEven(int &num)
{
return num%2==0?true:false;
}