調整陣列順序,使所有的奇數字於偶數前面這是乙個面試的時候經常會遇到的題(正所謂的面試題),當拿到這個題目,你首先會想到的是遍歷這個陣列每碰到偶數時,拿出這個數字與其後的數字交換,但這樣的話其時間複雜度為o(n*n)
若面試官沒有時間複雜度的要求,那麼這樣就可以了
但是往往不能體現出你的能力,你還可以優化
1)我們可以維護兩個指標,第乙個指標指向陣列第乙個數字第二個指標指向陣列最後乙個數字
2)第乙個指標只能在第二個指標前面,若相遇就停止移動(表明所有奇數均在偶數前面)
3)第乙個指標只往後移動直至遇上偶數
4)第二個指標只往前移動至遇上奇數
5)當兩個指標符合條件時就交換兩個指標所指向的數字
while (start
if (start
} }
void reorderoddeven(int *pdata, unsigned int length)
while (start < end && (*end & 0x1) == 0)
if (start < end)}}
其實這個**還可以再次優化,想想如果面試官再次改變條件,例如:想要所有非負數均在負數前面、所有可以整除5的數均在不能整除5的數的前面.....等等這些條件,首先你想到的是再寫乙個函式來實現,那能不能有更好的方法來解決呢,答案是肯定的,可以只修改reorderoddeven函式的兩處判斷條件 ,利用乙個函式指標來單獨處理次數是否符合條件,此時**就能得到復用
void reorder(int *pdata, unsigned int length, bool(*func)(int))
} } bool iseven(int n)
void reorderoddeven(int *pdata, unsigned int length)
面試題 調整陣列順序
題目 輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序使得所有的奇數字於陣列的前半部分,所有的偶數字於陣列的後半部分。首先這個題目只要求把奇數放前面,偶數放後面,所以我們不需要關注其他太多的因素,我們只需要給兩個指標,讓他們乙個指向最後乙個元素,這個指標只向前移動,乙個指向第乙個元素,這個指標...
面試題12 調整陣列順序使奇數字於偶數前
思路 1.設定兩個指標,初始狀態第一指標指向陣列的第乙個數,第二個指標指向陣列的最後乙個數 2.若第乙個指標指向的數是奇數,則指標向右移動一位,第二個指標指向的數是偶數,則指標向左移動 3.若第乙個指標和第二個指標指向的數恰好分別為偶數和奇數,則交換數字。include stdafx.h inclu...
面試題14 調整陣列順序使奇數字於偶數前面
最簡單的辦法就是開闢和原陣列同樣大小的空間,順次掃瞄原陣列2次,第一次將所有奇數放進新陣列中,第二次將偶數放入就可以。這種方法的時間複雜度為o n 空間複雜度為o n 如下 void reorderoddeven vector arr vectornewarr int i for i 0 i以上演算...