劍指offer刷題記錄 時間效率

2021-10-03 07:46:01 字數 1336 閱讀 2380

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列**現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。

直觀的解法就是借用容器,遍歷整個陣列然後記錄出現次數再加上判斷語句,但這要要耗費大量的空間。

試著思考怎麼快速找到乙個陣列**現次數超過陣列長度的一半的數呢?不妨排序一下,發現若存在這個數,則必然存在於陣列的中間位置,可以用該數為最大或者最小兩種極端情況來推測。

找到這個值後,用乙個cnt記錄它的出現次數即可。

class

solution

return cnt>sz/

2?num:0;

}};

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。

暴力一點可以直接用sort,但這不是我們做這個題的目的。利用優先佇列,控制佇列長度為k,再遍歷陣列,在佇列滿了的情況下,只要遇到比隊頭大的元素就替換掉隊頭,就可以幫我們找到最小的k個數了。

class

solution

else

if(q.

top(

)>input[i])}

while

(!q.

empty()

)return res;}}

;

hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:,連續子向量的最大和為8(從第0個開始,到第3個為止)。給乙個陣列,返回它的最大連續子串行的和,你會不會被他忽悠住?(子向量的長度至少是1)

在遍歷過程中,用乙個sum來儲存當前最大值,用乙個temp來記錄累計的和是否為正數,只要不是負數,累加起來的話就會對整體有貢獻。累加過程中若出現更大值則更新sum的值。

若為負數,則對往後遍歷的過程沒有貢獻,從下乙個元素開始累加。

class

solution

return sum;}}

;

輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這三個數字能排成的最小數字為321323。

class

solution

string printminnumber

(vector<

int> numbers)

};

劍指 offer 刷題記錄

任誰都躲不過找工作的問題,好希望能多準備一些時間,奈何時間不等人,每天刷幾道題,並且記錄下來吧 def replacespace s write code here num space 0 new s for i in range len s if i num space 1 for i in ra...

劍指offer刷題記錄

遞迴法 鍊錶的後續遍歷,並用self.k來記錄倒數節點的位置,找到了就返回找到的節點,否則返回none coding utf 8 class listnode def init self,x self.val x self.next none class solution def init self...

劍指offer刷題記錄 綜合

將乙個字串轉換成乙個整數,要求不能使用字串轉換整數的庫函式。數值為0或者字串不是乙個合法的數值則返回0 輸入描述 輸入乙個字串,包括數字字母符號,可以為空 輸出描述 如果是合法的數值表達則返回該數字,否則返回0 做這個題目做的真的很煩,最麻煩的就是判斷當前是否越界。可儲存的最大的正數末位為7,可儲存...