66. 加一(剪枝)

def plusOne(digits):
# part 1
    n = len(digits)
    num = 0
    for i in range(n):
        num += digits[i] * pow(10, (n-1-i))
    num += 1
# 目前已经得到加一后的数,下面要把它变成列表
# part 2
    j = 0
    new = []
    while num > 0:
        yushu = num % 10
        new.append(yushu)
        num = num // 10
    new = new[::-1]
    return new

part 2 可以用一句话实现,见下方# *****

def plusOne(digits):
    n = len(digits)
    num = 0
    for i in digits:
        num = num * 10 + i
#    for i in range(n):
#        num += digits[i] * pow(10, (n-1-i))
    num += 1
# ******
    num = str(num)
    return [int(j) for j in num]
  1. 一次遍历 剪枝算法
    两种情况:
    一、尾数不是9,那么只有尾数会+1
    二、尾数是九,那么不止尾数会+1
    如129 -> 130,2 和 9 都要+1
    999 -> 1000, 999 三个 9 都要+1
    剪枝算法是裁剪搜索树中没有意义的,不需要搜索的树枝,以提高运算速度。
    这里剪枝则是裁剪掉原列表中不需要加1的数。
    如:
    327 -> 328,只有7要 +1,3和 2 就可以被裁剪掉
    129 -> 130,2 和 9 都要+1,首位 1 就可以被裁剪掉
    999 -> 1000, 999 三个 9 都要+1,就没有裁剪的地方
    def plusOne(self, digits: List[int]) -> List[int]:
        n = len(digits)
        ad = 1
        for i in range(n-1, -1, -1):
            # 剪枝
            if ad == 0:
                break
            # add_num 为加一后的数字,可为1-10
            add_num = digits[i] + ad
            # digits该位置的原数被替换成新的
            digits[i] = add_num % 10
            # 如果该数有进位, ad变为1, 如果不进位, ad为0
            ad = add_num // 10
            # 进位(如 99 变 100)
            if i == 0 and add_num == 10:
                digits = [1] + digits
                break
        return digits

你可能感兴趣的:(66. 加一(剪枝))