劍指Offer 調整陣列順序使奇數字於偶數前面

2022-07-26 16:06:08 字數 1170 閱讀 4789

輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。

最直接的思路是再構建乙個新陣列,先遍歷一遍原陣列,把其中的奇數依次新增到新陣列中,再遍歷一遍原陣列把其中的偶數依次新增到新陣列中,時間複雜度為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...