解一道簡單的演算法題

2021-06-04 19:52:31 字數 748 閱讀 8998

原題是這樣的:

乙個未排序整數陣列,有正負數,重新排列使負數排在正數前面,並且要求不改變原來的正負數之間相對順序。

比如: input: 1,7,-5,9,-12,15 ,ans: -5,-12,1,7,9,15 。且要求時間複雜度o(n),空間o(1)

我實現的解法

解法1:

不考慮時間和空間複雜度 則每次找到乙個正數,取出後,將剩下的數前移動,將取出的正數置於末尾。

如此反覆,搞完一輪後回到首,結束。

解法2:

類似字串匹配 將(正正,正負,負負)的數對找出匹配後進行翻轉操作。

迴圈往復,直到不出現上述數對為止。最後得到正確的輸出。(個人感覺作者並沒有將演算法說的很清楚 大迴圈的結束條件沒有給出 按照匹配字串的方式會出問題)

解法3:

區間翻轉演算法:(並不適用)

由於本題需要翻轉句子,我們先顛倒句子中的所有字元。這時,不但翻轉了句子中單詞的順序,而且單詞內字元也被翻轉了。我們再顛倒每個單詞內的字元。由於單詞內的字元被翻轉兩次,因此順序仍然和輸入時的順序保持一致。

以上面的輸入為例:翻轉「i am a student.」中所有字元得到「.tneduts a ma i」,再翻轉每個單詞中字元的順序得到「students. a am i」,正是符合要求的輸出(編碼實現,可以參看此文:

)。解法4:

小數法(時間複雜度:o(n),空間複雜度:o(n))(通過其描述 只支援個位數)

通過整數字記錄資料相對位置。

拿空間換時間。

一道簡單的演算法題

題目 統計給定數字中,值為1的二進位制位的數量。如果是陣列呢?int getbitcount unsigned int num return count 第一種想法比較簡單,從最後一位開始,比較是否為1,如果為1,就計數器加一。迴圈次數固定,32次。但是這種方法有乙個地方需要注意,那就形參必須為un...

解谷歌的一道題

這幾天有一道google的面試題在論壇炒得很火,題目如下 有乙個100層高的大廈,你手中有兩個相同的玻璃圍棋子。從這個大廈的某一層扔下圍棋子就會碎,用你手中的這兩個玻璃圍棋子,找出乙個最優的策略,來得知那個臨界層面。下面給出我的分析和解答。為了得到兩個棋子的最優策略,我們先簡化問題,看看乙個棋子的情...

一道簡單的題

阿里巴巴的一道面試題 25.給定乙個整數陣列和乙個整數,返回兩個陣列的索引,這兩個索引指向的數字的加和等於指定的整數。需要最優的演算法,分析演算法的空間和時間複雜度。include include using namespace std struct stwoindex 初始化,同時等於0,說明不存...