字符串处理之:移掉k位数字 最大数
class Solution:
def removeKdigits(self, num: str, k: int) -> str:
stack = []
for item in num:
while stack and stack[-1]>item and k>0:
k-=1
stack.pop(-1)
stack.append(item)
for i in range(k):
stack.pop(-1)
return "".join(stack).lstrip('0') or '0'
代码上早了- -。

这题的意义学到了什么呢,首先这种题要先摸清规律,这题的规律就是:你要想数字最小,如果你是个递增序列,那就去除最后面的。如果是递减的序列,就要去除最前面的。所以你每次都要找到相连的a和b两个位置有a>b,这时候a就是你想要扔掉的数字。
stack在这里就是单调栈了,用来保存一个递增的序列,一旦出现了a>b,b这个数就要被扔掉了,否则b会被加入到单调栈中,这样栈中保存的结果就是前面子序列的最优解了。
一轮遍历之后stack里面已经是要给递增的序列了,这时候如果我们的k还没有为0还需要继续删除,那么就直接从后面删除k个就可以了。
这道题最经典的我感觉是最后 ,"".join(stack).lstrip('0') or '0' 这里如果前面有前置0就通过lstrip来删除掉了,如果前面都是0那么字段是个空字段,这时候就返回'0‘。非常经典
最大数:

这题最关键的就是字符串的按位排序,我们希望列表中的字符串能按照每一位从大到小排序,例如34>30,345>34.。原理就是这两个字符串的组合,加和大的在前面。例如345+34 > 34+345。
class Solution:
def largestNumber(self, nums: List[int]) -> str:
def sort_val(x,y):return int(y+x) - int(x+y) # >0 huan
nums =sorted(map(str,nums),key = cmp_to_key(sort_val))
if nums[0] == '0':
return '0'
return "".join(nums)
代码里面比较重要的点在于:
排序的规则用sort_val函数实现,什么时候交换xy? int(y+x) - int(x+y) >0的时候交换,意味着字符串y+字符串x要比x+y更大,我们希望大的字符串在前面,所以这时候交换。
排序中,通过map将list元素由int转换成str,key中使用了cmp_to_key,这个函数可以理解为:根据括号内的规则进行比较,大于0才会进行交换

浙公网安备 33010602011771号