正題之前?
三玖yyds!!!
題目
給定一組非負整數?nums
,重新排列每個數的順序(每個數不可拆分)使之組成一個最大的整數。
注意:輸出結果可能非常大,所以你需要返回一個字符串而不是整數。
示例 1:
輸入:
nums = [10,2]
輸出:"210"
示例?2:
輸入:
nums = [3,30,34,5,9]
輸出:"9534330"
題目鏈接:click here?
思路
此題求拼接起來的最大數字。設數組nums 中任意兩數字的字符串為 x 和 y,則規定 貪心策略:
若拼接字符串 x+y>y+x,則x“大于”y?。
反之,若 x+y<y+x,則 x“小于” y。
x “小于” y 代表:排序完成后,數組中 x 應在 y?左邊;“大于” 則反之。
根據以上規則,套用排序方法對 nums 執行排序即可。
詳細題解:. - 力扣(LeetCode)
python代碼
class Solution:def largestNumber(self, nums: List[int]) -> str:# 自定義比較函數def _myfunc(a,b):return int(str(a)+str(b))-int(str(b)+str(a))# nums按照自定義函數排序nums.sort(key=cmp_to_key(_myfunc), reverse=True)# 拼接為字符串ans=""for i in nums:ans+=str(i)# 防止ans中元素均為"0"if ans[0]=='0':return '0'return ans
這段代碼定義了一個Solution類,其中包含一個名為largestNumber的方法。該方法接受一個整數列表nums作為輸入,并返回一個字符串。在方法中,我們首先定義了自定義的比較函數_myfunc,然后使用該函數對nums進行排序。最后,我們將排序后的數字拼接成一個字符串,并檢查第一個字符是否為0,如果是,則返回"0",否則返回拼接后的字符串。
這種方法非常巧妙地利用了Python的內置排序函數和自定義比較函數,以及對字符串和整數的轉換操作,來解決了一個看似復雜的問題
注意事項
- sort中用到的排序函數不可用lambda定義,因為lambda定義的函數只能接受一個參數,所以只能def定義一個比較函數,再用functools.cmp_to_key將def定義的比較函數轉為關鍵字函數,之后傳給sort中的key
- 當ans中都是‘0’時,只能返回一個‘0’
結語
希望這篇博客能夠幫助你更好地理解Python中的排序和比較函數,并激發你對算法和數據結構的興趣。如果你有任何疑問或建議,歡迎在評論區留言,讓我們一起討論!