Leetcode刷题记录——402. 移掉K位数字

Leetcode刷题记录——402. 移掉K位数字_第1张图片
先给出官方的简洁代码

class Solution:
    def removeKdigits(self, num: str, k: int) -> str:
        numStack = []
        
        # Construct a monotone increasing sequence of digits
        for digit in num:
            while k and numStack and numStack[-1] > digit:
                numStack.pop()
                k -= 1
        
            numStack.append(digit)
        
        # - Trunk the remaining K digits at the end
        # - in the case k==0: return the entire list
        finalStack = numStack[:-k] if k else numStack
        
        # trip the leading zeros
        return "".join(finalStack).lstrip('0') or "0"

作者:LeetCode
链接:https://leetcode-cn.com/problems/remove-k-digits/solution/yi-diao-kwei-shu-zi-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我实现了两种方法
1、暴力法,
先考虑对一个输入,只删掉1个数字使得留下的结果最小,如何删?
然后,对于一个输入num和k,我们对num执行k次上述操作,即可

class Solution:
    def removeKdigits(self, num: str, k: int) -> str:
        length = len(num)
        num_val = int(num)

        if num_val == 0 or length <= k:
            return "0"
        num_list = []
        for letter in num:
            num_list.append(int(letter))
        print(num_list)

        #num_list
        start_index = 0
        for i in range(k):#执行k次
            length = len(num_list)
            for j in range(length-1):
                if num_list[j] > num_list[j+1]:
                    num_list.pop(j)
                    break
                if j == length - 2 and num_list[j] <= num_list[j+1]:
                    num_list.pop(-1)
                    start_index
        newlist = num_list
        finallength = len(newlist)
        if list(set(newlist)) == [0]:
            return "0"
        index = 0
        while newlist[index] == 0:
            index += 1
        res = ''
        for value in newlist[index:]:
            res += str(value)
        return res

2、基于贪心算法的栈操作

我们先建立一个栈,用以存放保留的数字
计算 index = len(数组) - k

遍历数组中的每一个数:
对于第一个数字,先放进栈里
对于后面的每个:

如果待删除的数k == 0:
将数组中后续的数字append在栈里即可

如果待删除的数k > 0 且 数组正在遍历的这个数 < 栈顶:
while k > 0 and 栈非空 and 栈顶>这个数:
栈顶pop
k -= 1
跳出循环后,
栈.append(这个数)

如果待删除的数k > 0 且 数组正在遍历的这个数 >= 栈顶:
栈.append(这个数)

跳出遍历后
如果k > 0:
只取栈中前[:index]

如果栈中只有0:
返回str(0)

如果栈[0] == 0
取到第一个不等于0的数,从它开始到栈[-1],返回一个str

class Solution:
    def removeKdigits(self, num: str, k: int) -> str:
        length = len(num)
        num_val = int(num)
        #oldk = k
        if num_val == 0 or length <= k:
            return "0"
        num_list = []
        for letter in num:
            num_list.append(int(letter))
        print(num_list)

        should = length - k
        #num_list
        zhan = []
        #zhan#.append(num_list[0])
        tempindex = 0
        shanwan = False
        for i in range(length):
            if k == 0:
                for value in num_list[i:]:  
                    zhan.append(value)#shanwan = True
                break
            elif zhan == []:
                zhan.append(num_list[i])
            else:
                if zhan[-1] <= num_list[i]:
                    zhan.append(num_list[i])

                elif zhan[-1] > num_list[i]:
                    while k > 0 and zhan != [] and zhan[-1] > num_list[i]:
                        zhan.pop(-1)
                        k -= 1
                    zhan.append(num_list[i])
        if k > 0:
            zhan = zhan[:should ]
        print(zhan)
        #while len(zhan) < should:
        #    zhan.append(num_list[tempindex + 1])
        #    tempindex += 1
        if list(set(zhan)) == [0]:#0
            return '0'
        while zhan[0] == 0:
            zhan.pop(0)
        res = ''
        for value in zhan:
            res += str(value)
        return res

你可能感兴趣的:(leetcode,python编程技巧)