輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位於數組的前半部分,所有的偶數位於位於數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。
這個題,有兩種考慮方法,一種是空間換時間,一種是時間換空間。
方法一:
空間換時間。思路是,遍歷原數組,遇到是奇數的就加入到新的數組中,並且要設置一個標誌位一直指向新數組中待插入的那一位。然後,再次遍歷數組,遇到偶數就加入到新數組,並且將標誌位向後移動一位,指向待插入的位置。最後,將新數組賦值給原數組。
綜上分析,代碼如下:
public class Solution {
public void reOrderArray(int [] array) {
if(array.length == 0){
return;
}
int [] result = new int[array.length];
int index = 0;
for(int i = 0;i < array.length;i++){
if(array[i] % 2 == 1){
result[index] = array[i];
index++;
}
}
for(int i = 0;i < array.length;i++){
if(array[i] % 2 == 0){
result[index] = array[i];
index++;
}
}
//array = result;
for(int i = 0;i < array.length;i++){
array[i] = result[i];
}
}
}
這裏,有個需要注意的地方,就是最後將排好的數組賦值給原數組時,我直接使用了array = result;
測試結果是不通過,因爲我只做iOS的,在iOS中,這樣的語句是讓array指向result指向的內存。所以,我去查了Java的數組賦值,也問了學Java的同學。Java中這句話的意思也是讓array指向result指向的內存,array原來指向的內存將無法訪問。按理說,這時候無論array、result誰對數組進行操作,數組都會改變。但是牛客網上的測試就是不通過,後來在eclipse中手動測,又可以通過,不知道是什麼原因。有知道的還請告知。
這個方法的循環次數是2n,時間複雜度是n,空間複雜度是n。
方法二
時間換空間。簡單的說就是不開闢新的空間,直接在原數組上進行更多的移動操作。
分析:用一個指針指向數組第一個數,並依次與後一個數進行比較,加入第一個數是偶數,第二個數是奇數,就進行交換。這樣一趟下來,相鄰的兩個數的前後位置就確定了。那麼再次進行遍歷,交換相鄰兩個奇數和偶數。這個時候,要注意第二次循環的跳出條件,因爲最後一個數在上一次遍歷的時候已經確定了,多以不用比較最後一個數,具體爲array.length - 1 -i
綜上分析,代碼如下:
public class Solution {
public void reOrderArray(int [] array) {
if(array.length == 0){
return;
}
for(int i = 0;i < array.length - 1;i++){
for(int j =0; j < array.length - 1 -i;j++){
if(array[j] % 2 == 0 && array[j + 1] % 2 == 1){
int temp = array[j+1];
array[j+1] = array[j];
array[j] = temp;
}
}
}
}
}