面試演算法題(4)--將一個整數陣列中的所有奇數放到偶數前面
將一個整數陣列中的所有奇數放到偶數前面
如:
原始陣列:{5,8,3,4,1,7,9,2,6,120}
最終結果:{5,3,1,7,9,2,4,6,120,8}
面試時面試官說出題目後,加了一句,需要最優時間複雜度。
我當時就有點懵,對時間複雜度不瞭解,於是第一想法就排除了雙重迴圈,然後就想不出更好的解決辦法了。
仔細分析這個題目:
尋找陣列前面所有的偶數(能被2整除的數),放到陣列後面;
尋找陣列後面所有的奇數(不能被2整除的數),放到陣列前面;
是不是從陣列開頭位置啟動一個迴圈,每當遇到一個偶數時,再從陣列末尾位置啟動一個迴圈,尋找一個奇數,找到後調換兩者的位置。
當兩層迴圈的變數在k點相遇時,就證明:
陣列k位置之前所有的數字都是奇數,陣列k位置之後的所有數字都是偶數。
對我當時就是這個思路,逃不開雙重迴圈。
如:
原始陣列:{5,8,3,4,1,7,9,2,6,120}
最終結果:{5,3,1,7,9,2,4,6,120,8}
面試時面試官說出題目後,加了一句,需要最優時間複雜度。
我當時就有點懵,對時間複雜度不瞭解,於是第一想法就排除了雙重迴圈,然後就想不出更好的解決辦法了。
仔細分析這個題目:
尋找陣列前面所有的偶數(能被2整除的數),放到陣列後面;
尋找陣列後面所有的奇數(不能被2整除的數),放到陣列前面;
是不是從陣列開頭位置啟動一個迴圈,每當遇到一個偶數時,再從陣列末尾位置啟動一個迴圈,尋找一個奇數,找到後調換兩者的位置。
當兩層迴圈的變數在k點相遇時,就證明:
陣列k位置之前所有的數字都是奇數,陣列k位置之後的所有數字都是偶數。
對我當時就是這個思路,逃不開雙重迴圈。
有了思路,擼起程式碼就簡單了,直接上程式碼吧,有註釋:
public class Test {
public static void main(String[] args) {
int[] arr = {7, 8, 1, 4, 2, 5, 3, 10, 6, 13};
changeOddNumberAhead(arr);
print(arr);
}
/**
* change odd numbers to head of even numbers
*
* @param numArr
*/
private static void changeOddNumberAhead(int[] numArr) {
if (numArr == null || numArr.length <= 1) {
//陣列為null,或者長度 <= 1,都不需要處理。
return;
}
//內層迴圈的變數,預設等於陣列的最後位置
int innerIndex = numArr.length - 1;
//臨時變數
int temp;
//開始迴圈整個陣列,尋找偶數
for (int i = 0; i < numArr.length; i++) {
//迴圈停止條件
if (i >= innerIndex) {
//已經處理完畢了,返回
return;
}
if (numArr[i] % 2 != 0) {
//找到的是奇數
continue;
}
for (; innerIndex >= 0; innerIndex--) {
//迴圈停止條件
if (i >= innerIndex) {
//已經處理完畢了,返回
//內層迴圈也需要判斷條件,不能迴圈到陣列開頭位置
return;
}
if (numArr[innerIndex] % 2 == 0) {
//找到的是偶數
continue;
}
//交換陣列元素
temp = numArr[innerIndex];
numArr[innerIndex] = numArr[i];
numArr[i] = temp;
//每當成功調換一對元素後,需要break內層迴圈
//重新執行外層迴圈,尋找下一個偶數
//不要忘記這兒的break
break;
}
}
}
private static void print(int[] arr) {
if (arr == null || arr.length == 0) {
return;
}
StringBuilder stringBuffer = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
stringBuffer.append(arr[i]);
if (i != arr.length - 1) {
stringBuffer.append(", ");
}
}
System.out.println(stringBuffer.toString());
}
}
相關文章
- 面試題21:調整陣列順序奇數位於偶數前面面試題陣列
- [每日一題] 第十一題:調整陣列順序使奇數位於偶數前面每日一題陣列
- 【劍指Offer】調整陣列順序使奇數位於偶數前面陣列
- JZ-013-調整陣列順序使奇數位於偶數前面陣列
- 1到100迴圈,並把奇數放到陣列中,把偶數放到map中陣列
- 【C語言】調整陣列使奇數全部都位於偶數前面。C語言陣列
- LeetCode題解(Offer21):調整陣列順序使奇數位於偶數前面(Python)LeetCode陣列Python
- 劍指 Offer 21. 調整陣列順序使奇數位於偶數前面陣列
- 使奇數位於偶數前面
- c語言 將一個陣列中的奇數和偶數分開放在一起C語言陣列
- 求陣列內所有偶數的和陣列
- 面試題 - 使用執行緒交替列印奇數偶數面試題執行緒
- 面試題-使用執行緒交替列印奇數偶數面試題執行緒
- 輸入一個整數陣列,輸出奇偶數相間排列的陣列陣列
- 求陣列中k個數的所有組合陣列
- 產生10個1-100的隨機數,並放到一個陣列中,把陣列中大於等於10的數字放到一個list集合中,並列印到控制檯。隨機陣列
- 第三章:查詢與排序(下)------------- 3.8題解_調整陣列順序-奇數在左偶數在右排序陣列
- 如何查詢總和等於給定數字的整數陣列中的所有對陣列
- 1588 所有奇數長度子陣列的和(字首和)陣列
- LeetCode題解(1550):陣列中存在連續三個奇數(Python)LeetCode陣列Python
- 4. 兩個排序陣列的中位數排序陣列
- LeetCode每日一題: 陣列形式的整數加法(No.989)LeetCode每日一題陣列
- 面試題:一個整數,它加上100後是一個完全...面試題
- 陣列中未出現的最小正整數陣列
- 演算法-兩個排序陣列的中位數演算法排序陣列
- LeetCode第4題:尋找兩個有序陣列的中位數LeetCode陣列
- 找一個陣列中特別的數陣列
- LeetCode 4. 兩個排序陣列的中位數LeetCode排序陣列
- LeetCode-4. 兩個排序陣列的中位數LeetCode排序陣列
- 448. 找到所有陣列中消失的數字陣列
- AcWing 242. 一個簡單的整數問題(樹狀陣列解法)陣列
- python實現給定一個數和陣列,求陣列中兩數之和為給定的數Python陣列
- 【陣列】1550. 存在連續三個奇數的陣列(簡單)陣列
- 在頁面中的應該使用奇數還是偶數的字型?為什麼呢?
- 給定一個整數陣列,找出總和最大的連續數列,並返回總和。陣列
- 每天一道演算法題:求兩個排序陣列的中位數演算法排序陣列
- 給定一個 32 位有符號整數,將整數中的數字進行反轉。符號
- 編寫類 AA ,有一個方法:判斷一個數是奇數 odd 還是偶數, 返回 booleanBoolean