1. 程式人生 > >奇數位上都是奇數偶數位上都是偶數

奇數位上都是奇數偶數位上都是偶數

牛客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; }