179. 最大數
給定一組非負整數nums
,重新排列每個數的順序(每個數不可拆分)使之組成乙個最大的整數。
示例:輸入:nums = [10,2]
輸出:"210"
一開始拿到這個問題,第一印象不就是把整型陣列排個序嗎,這也太簡單了吧,python一行**搞定,點選提交,瞬間被打臉。連示例都沒有跑通。
對於 nums=[10,2],排序輸出後的結果是102,而正確的結果是210。所以我們不能簡單的比較。
根據觀察,要想得到的數最大,就得保證生成的數的最高位盡可能的大才行,所以我們就需要把數值大的數放在高位。於是,我們通過比較陣列的每個元素的最高位,最高位相同的時候比較次高位(這正好不就是字串比較嗎),以此類推,完成排序,然後把它們拼接起來。心裡想,這下應該十拿九穩了,直接寫**,提交。
額,再一次被打臉,這我。。。
要不算了吧,直接回去吧,卷不動了。
怎麼能這麼輕易放棄呢?搞起來。
我們來看一下,這種排序方式對於輸入陣列沒有相同數字開頭的時候是有效的,比如[10,2],但是對於陣列中有相同數字開頭的情況就不滿足了。例如3,30和3,35。
因此我們需要比較兩個數不同的拼接順序的結果,進而決定它們在結果中的排列順序。所以對於陣列nums中的任意兩個值a和b,我們只能根據拼接後的結果來決定他們的先後順序。
所以通過上述排序規則,我們就可以求出最大數,證明過程去leetcode官方解答檢視。
下面我們來看一下**的具體實現。
import functools
class solution:
def solve(self , nums ):
# write code here
strs = map(str, nums)
#根據拼接後的結果判斷誰應該放在前面
def cmp(a, b):
if a + b == b + a:
return 0
elif a + b > b + a:
return 1
else:
return -1
strs = sorted(strs, key=functools.cmp_to_key(cmp), reverse=true)
return ''.join(strs) if strs[0]!='0' else '0'
原創不易,如果喜歡,給個三連吧。 騰訊Android面試遇到的簡單演算法題
有n級台階,一次可以跳1 2 n級,請問有多少種跳法?假設n級台階我們需要調j次,由題可知,我們跳上n級台階可以分成1 2 n次完成,一次可以輕易得出,n 1時,j 1 n 2時j 2 當n 3時,如果第一次跳一步,那麼就有n 2時那麼多種可能,記為j31 2,如果第一次跳兩步,那麼就有n 1種可能...
騰訊面試原題回顧(2020 07)
面試的首要部分就是自我介紹,我的簡歷就不在這裡公開說明,但是總的感覺下來,自我介紹是非常重要的部分,在這部分內容中,面試官會提取一些他覺得有價值或者他認為是你的長處的地方作為接下來的面試題。對於mysql來說,應該是老生常談的幾部分。以下是大概的一些問題,面試官會延展你回答正確的問題,考察的是你對於...
面試 面試中遇到的演算法題
概念平面內兩條線段位置關係的判定在很多領域都有著廣泛的應用,比如遊戲 cad 圖形處理等,而兩線段交點的求解又是該演算法中重要的一環。本文將盡可能用通俗的語言詳細的描述一種主流且效能較高的判定演算法。為方便計算,對座標點的大小比較作如下定義 x座標較大的點為大,x座標相等但y座標較大的為大,x與y都...