輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。
最直接的思路是再構建乙個新陣列,先遍歷一遍原陣列,把其中的奇數依次新增到新陣列中,再遍歷一遍原陣列把其中的偶數依次新增到新陣列中,時間複雜度為o(2n)。實現**如下
public int reorderarray2(int array)
}for (int i = 0; i < array.length; i++)
}return arr;
}
c#的陣列是不支援動態新增元素的,我們可以使用泛型list,來實現在指定位置插入元素。基本思路是遍歷原陣列,依次將元素插入到list中,如果是偶數元素,預設插入到list的末尾。如果是奇數元素,則插入到所有的偶數元素之前(已插入的所有奇數元素之後),因此需要記錄最後插入的奇數元素的索引。實現**如下,演算法的時間複雜度是o(n)
public int reorderarray(int array)
}return list.toarray();
}
上面的兩種解法都用到臨時陣列或list,空間複雜度是o(n),某些情況下可能希望空間複雜度越低越好。下面這種解法雖然時間複雜度提高了,但降低了空間複雜度,不再需要額外的空間。基本思路是遍歷原陣列,如果遇到了奇數元素,就將該元素向前移動,該元素前面的偶數元素都依次向後移動。
舉個例子:比如陣列
遍歷陣列,得到第乙個元素是奇數1,其前面沒有元素所以不做移動
第二個,第三個是偶數,不做處理。
第四個元素是奇數3,所以將3往前移動,3前面的偶數元素都向後移動。移動後的陣列為
接著第五個元素是奇數5,所以將5往前移動,5前面的偶數元素都向後移動。移動後的陣列為
可以這樣理解,每發現乙個奇數時,就將這個奇數移動到了它最終應該在的位置上。
public int reorderarray(int array)
array[j + 1] = temp;}}
return array;
}
更多題目的完整描述,ac**,以及解題思路請參考這裡 劍指offer 調整陣列順序
時間限制 1秒 空間限制 32768k 本題知識點 陣列 題目描述 輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。首先想到的是利用兩個輔助陣列,乙個儲存奇數,乙個儲存偶數,這樣的...
劍指offer(調整陣列順序)
輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。1 暴力解法 從前到位掃瞄陣列,如果出現前面是偶數後面是奇數的情況,則交換。其中使用氣泡排序的思想。從後面朝前比較,使用外迴圈控制趟...
劍指offer(十三) 調整陣列順序
題目描述 輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。題解 思路簡單的解法就是,建兩個臨時陣列,乙個奇數陣列,乙個偶數陣列,最後再組合起來即可,時間複雜度為o n 一解 pub...