最近開始刷《劍指offer》,說實話開始的有點晚了,應該早點開始的。刷題順序沒有按照書上的順序來,保證刷完即可。
題目:調整陣列順序使奇數字於偶數前面
首先,這個題沒有要求奇數相對於原陣列奇數的位置不變和偶數相對原陣列的位置不變,也沒有要求不能重新再建立陣列,所以基於上述兩方面這個題有多種解法。
1.重新定義乙個vector陣列,用push_back()先將奇數插入新陣列,再用一次push_back()將偶數插入新陣列。這樣就保證了奇數、偶數相對於原陣列的奇數、偶數的順序不變,滿足。
class solution
vector
brr; //2.建立新的vector陣列
int len=array.size();
for(int i=0;i//3.先遍歷陣列,遇到奇數則插入新定義的陣列中
}for(int i=0;i//4.再遍歷陣列,遇到偶數則插入新定義的陣列中
}//array = brr; //5.將新陣列的值賦給原陣列,vector支援這樣賦值
copy(brr.begin(),brr.end(),array.begin());
//copy也可以,array已經例項化了,有記憶體,若是新定義的vectorarray,
//一定不能用array.begin(),它底層還沒有記憶體,編譯器會報錯
}};int main()
cout
0;}
2.借鑑冒泡法,如果相鄰兩個元素「前偶後奇」則交換,時間複雜度為o(n^2)
class solution}}
}};int main()
cout
0;}
3.不重新定義vector陣列,利用vector支援運算子進行陣列訪問的特點,定義前後兩個指標,遍歷,滿足「前偶後奇」時交換,但是這樣會破壞原陣列元素的順序
class solution
int len = array.size();
int left=0; //2.記錄偶數的下標
int right=len-1; //3.記錄奇數的下標,滿足「前偶後奇」時交換
while(left < right) //4.遍歷array陣列
while(left < right && (array[right] & 0x1) != 1) //6.如果當前值為偶數,則--,直到遇到第乙個偶數暫時跳出迴圈
if(left < right ) //7.滿足「前偶後奇」並且前下標小於後下標的時候,交換}}
};
4.可擴充套件性高的解法:傳參傳的是一維陣列,然後將對奇偶數的判斷放在乙個單獨的函式裡,再在另乙個函式裡通過函式指標呼叫判斷函式,這個判斷函式可以有多個,分別有不同的判斷標準
bool iseven(int n)//判斷乙個數是否是偶數
void reorder(int *p,unsigned
int len,bool(*fun)(int))//第三個引數是函式指標
int *pleft=p;//2.第乙個指標,從頭開始向後移動
int *pright=p+len-1;//3.第二個指標,從後向前移動
while(pleft < pright) //4.如果第乙個指標在第二個指標的前面
while(pleft < pright && fun(*pright))//6.如果*pright為偶數,向前移動直到出現奇數
if(pleft < pright)//7.滿足「前偶後奇」則交換
}}void reorderarray4(int *p,unsigned
int len)
int main()
; for(int i=0;icout
for(int i=0;icout
0;}
第四種方法的好處是我們可以擴充套件這個程式
擴充套件一:比如題目改為把陣列中的負數移到非負數前面,可以寫出以下判斷函式:
bool ispositive(int n)//是否是正數
return (n > 0)?true:false;//是正數輸出true,負數輸出false
}
擴充套件二:比如把題目改為把能被3整除的數放在不能被3整除的數的前面,可以寫出以下函式:
bool divof3(int n) //判斷是否能被3整除
測試用例:
int main()
;//奇數 偶數交替出現
int brr=;//偶數都在奇數前面
int crr=; //奇數都在偶數前面
int drr=;//只有乙個元素
return
0;}
劍指offer 調整陣列順序
時間限制 1秒 空間限制 32768k 本題知識點 陣列 題目描述 輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。首先想到的是利用兩個輔助陣列,乙個儲存奇數,乙個儲存偶數,這樣的...
劍指offer(調整陣列順序)
輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。1 暴力解法 從前到位掃瞄陣列,如果出現前面是偶數後面是奇數的情況,則交換。其中使用氣泡排序的思想。從後面朝前比較,使用外迴圈控制趟...
劍指offer(十三) 調整陣列順序
題目描述 輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。題解 思路簡單的解法就是,建兩個臨時陣列,乙個奇數陣列,乙個偶數陣列,最後再組合起來即可,時間複雜度為o n 一解 pub...