劍指offer面試題14 調整陣列順序使奇數位於偶數前面
一、題目
輸入一個整數陣列,實現一個函式來調整該陣列中陣列的順序,使得所有奇數位於陣列的前半部分,所有偶數位於陣列的後半部分。要求時間複雜度為O(n)。
二、思考與分析
題目要求把奇數放在陣列的前半部分,偶數放在陣列的後半部分,因此所有的奇數應該位於偶數的前面。也就是掃描陣列的時候,如果發現有偶數出現在奇數的前面,就交換它們的順序,交換之後就符合要求了。
另外要求時間複雜度為O(n),因此我們可以維護兩個指標,第一個指標初始化時指向陣列的第一個數字,遇到奇數,它就向後移動;第二個指標初始化時指向陣列的最後一個數字,遇到偶數,它就向前移動。在兩個指標相遇之前,第一個指標總是位於第二個指標的前面。如果第一個指標指向的數字是偶數,並且第二個指標指向的數字是奇數,我們就交換這兩個數字。
三、程式碼實現
public class Test14 {
//將奇數放在陣列的前半部分,偶數放在陣列的後半部分
public static void ReorderOddEvent(int[] array) {
if (array == null) {
return;
}
int begin = 0;
int end = array.length - 1;
while (begin < end) {
while (begin < end && (array[begin] & 0x1) != 0) {
begin++;
}
while (begin < end && (array[end] & 0x1) == 0) {
end--;
}
if (begin < end) {
int temp = array[begin];
array[begin] = array[end];
array[end] = temp;
}
}
}
public static void display(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + ",");
}
}
public static void main(String[] args) {
int[] array = { 1, 2, 3, 4, 5 ,6,7};
ReorderOddEvent(array);
display(array);
}
}
四、結果
1,7,3,5,4,6,2,
五、本題擴充套件
5.1 擴充套件題目
輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有的奇數位於陣列的前半部分,所有的偶數位於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。
5.2 題目分析
需要保證陣列中奇數都出現在前半部分,偶數都出現在後半部分,還要保證奇數和奇數,偶數和偶數之間的相對位置不變,即原來在前面的奇數依然出現在陣列的前面。
要想保證O(n)的時間複雜度,可以犧牲空間來換取。
1. 依然使用兩個指標,第一個指標初始化時指向陣列的第一個數字,它只會向後移動;第二個指標初始化時指向陣列的最後一個數字,它只會向前移動。
2. 另外建立一個陣列,並建立兩個指標,一個奇數指標下標為0,一個偶數指標為陣列最後一個下標(陣列長度-1)分別記錄奇數和偶數的位置。
3. 當第一個指標指向的數字為奇數時,就將該數字存入到新建陣列奇數指標的位置,並將奇數指標的值加1;當第二個指標指向的數字為偶數時,就將該數字存入到新建陣列偶數指標的位置,並將偶數指標減1。
4. 直到陣列被掃描完一遍,奇數和偶數也都重新調整位置完畢。
5.3 程式碼實現
public class Test14 {
//將奇數放在陣列的前半部分,偶數放在陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變
public static void reOrderByOrder(int[] array){
if (array == null) {
return;
}
int len = array.length;
int[] arr = new int[len];
int begin = 0;
int end = len-1;
for (int i = 0; i < array.length; i++) {
arr[i] = array[i];
}
for (int i = 0; i < arr.length; i++) {
if((arr[i]&0x1)!=0){
array[begin++] = arr[i];
}
if((arr[len-i-1]&0x1)==0){
array[end--] = arr[len-i-1];
}
}
}
public static void display(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + ",");
}
}
public static void main(String[] args) {
int[] array = { 1, 2, 3, 4, 5 ,6,7};
//ReorderOddEvent(array);
reOrderByOrder(array);
display(array);
}
}
5.4 結果展示
1,3,5,7,2,4,6,
相關文章
- 【劍指Offer】調整陣列順序使奇數位於偶數前面陣列
- 【劍指Offer學習】【面試題14 :調整陣列順序使奇數位於偶數前面】面試題陣列
- 劍指 Offer 21. 調整陣列順序使奇數位於偶數前面陣列
- 面試題21:調整陣列順序奇數位於偶數前面面試題陣列
- JZ-013-調整陣列順序使奇數位於偶數前面陣列
- [每日一題] 第十一題:調整陣列順序使奇數位於偶數前面每日一題陣列
- LeetCode題解(Offer21):調整陣列順序使奇數位於偶數前面(Python)LeetCode陣列Python
- 調整陣列順序使奇數位於偶數前面,偶數和偶數之間的相對位置不變陣列
- 【C語言】調整陣列使奇數全部都位於偶數前面。C語言陣列
- 【劍指offer】調整陣列順序陣列
- 演算法學習記錄十一(C++)--->調整陣列順序使奇數前偶數後演算法C++陣列
- 陣列進行奇數和偶數操作 把奇數放在陣列前面 偶數放在陣列後面陣列
- 面試演算法題(4)--將一個整數陣列中的所有奇數放到偶數前面面試演算法陣列
- 劍指offer面試題11 數值的整數次方面試題
- 第三章:查詢與排序(下)------------- 3.8題解_調整陣列順序-奇數在左偶數在右排序陣列
- 劍指offer之順序列印陣列陣列
- 劍指offer面試題29:順時針列印矩陣面試題矩陣
- 【劍指offer】字串轉整數字串
- 【劍指offer】把陣列排成最小的數陣列
- 劍指offer:旋轉陣列的最小數字陣列
- 劍指offer 旋轉陣列的最小數字陣列
- 劍指offer面試題12 列印1到最大的n位數面試題
- 【劍指offer】數字在排序陣列中出現的次數排序陣列
- 劍指Offer--陣列中重複的數字陣列
- 劍指Offer-34-把陣列排成最小的數陣列
- 劍指offer——把陣列排成最小的數C++陣列C++
- 劍指offer-轉陣列的最小數字-php陣列PHP
- 《劍指offer》:[51]陣列中的重複數字陣列
- 《劍指offer》:[38]數字在排序陣列中出現的次數排序陣列
- 【劍指offer】7.旋轉陣列的最小數字陣列
- 劍指 Offer 11. 旋轉陣列的最小數字陣列
- 【劍指 Offer】11. 旋轉陣列的最小數字陣列
- 《劍指offer》:[41]陣列中和為S的兩個數陣列
- 劍指offer刷題之路--1.陣列中重複的數字陣列
- 《劍指offer》:[49]把字串轉化成整數字串
- 劍指 offer(1) -- 陣列篇陣列
- 劍指Offer-39-數字在排序陣列中出現的次數排序陣列
- 劍指OFFER-數字在升序陣列中出現的次數(Java)陣列Java