排序
假設(shè)(不是一般性),某一對整數(shù) a 和 b ,我們的比較結(jié)果是 a 應(yīng)該在 b 前面,這意味著 ,其中
表示連接。
如果排序結(jié)果是錯的,說明存在一個 c , b 在 c 前面且 c 在 a的前面。這產(chǎn)生了矛盾,因為 和
意味著
。
換言之,我們的自定義比較方法保證了傳遞性,所以這樣子排序是對的。
給定一組非負整數(shù) nums,重新排列它們每位數(shù)字的順序使之組成一個最大的整數(shù)。
注意:輸出結(jié)果可能非常大,所以你需要返回一個字符串而不是整數(shù)。
class sort_rule(str):
def __lt__(self, y):
return self+y > self+x
class Solution:
def largestNumber(self, nums: List[int]) -> str:
sorted_nums = ''.join(sorted(map(str, nums), key=sort_rule))
return '0' if sorted_nums[0] == '0' else sorted_nums
class Solution:
def wiggleSort(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
s = len(nums)-len(nums)//2
nums[0::2], nums[1::2] = sorted(nums)[:s][::-1], sorted(nums)[s:][::-1]
# [::-1]防止連續(xù)的數(shù)連續(xù)的放進去
如果連續(xù)數(shù)字之間的差嚴格地在正數(shù)和負數(shù)之間交替,則數(shù)字序列稱為擺動序列。第一個差(如果存在的話)可能是正數(shù)或負數(shù)。少于兩個元素的序列也是擺動序列。
例如, [1,7,4,9,2,5] 是一個擺動序列,因為差值 (6,-3,5,-7,3) 是正負交替出現(xiàn)的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是擺動序列,第一個序列是因為它的前兩個差值都是正數(shù),第二個序列是因為它的最后一個差值為零。
給定一個整數(shù)序列,返回作為擺動序列的最長子序列的長度。 通過從原始序列中刪除一些(也可以不刪除)元素來獲得子序列,剩下的元素保持其原始順序。
class Solution:
def wiggleMaxLength(self, nums: List[int]) -> int:
if len(nums) < 2: return len(nums)
up, down = 1, 1
for i in range(1, len(nums)):
if nums[i] > nums[i-1]:
up = down+1 # 直到遇到一個升序,才在降序的基礎(chǔ)上加1
elif nums[i] < nums[i-1]:
down = up+1
else: # 如果等于剔除該元素
continue
return max(up, down)

