字符串处理之:移掉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才会进行交换

  

posted @ 2021-07-28 14:55  灰人  阅读(178)  评论(0)    收藏  举报