返回

算法每日一练:给非负整数加一,轻松进阶

前端

在算法的浩瀚世界中,每天练习一道题,是进阶的必由之路。今天,我们聚焦于一道经典的题目:给非负整数加一。看似简单,但它背后蕴藏着算法的精髓,让我们一起探索它的奥秘。

算法详解

给定一个由整数组成的非负数组,该数组中的每个元素都代表该数的一个数字。最高位数字存放在数组的首位,例如 [2, 3, 4] 表示数字 234。我们的目标是给这个数加一,并返回加一后的数组。

我们可以按照以下步骤来完成这个算法:

  1. 从末尾开始遍历数组 :从数组的最后一个元素开始,检查每个元素。
  2. 尝试给当前元素加一 :尝试给当前元素加一。
  3. 检查是否需要进位 :如果当前元素加一后大于或等于 10,则需要进位。
  4. 执行进位 :如果需要进位,则将当前元素设为 0,并在下一个元素上进位。
  5. 继续遍历数组 :重复步骤 1-4,直到遍历完整个数组。
  6. 特殊情况处理 :如果遍历完整个数组后仍需要进位,则在数组开头添加一个 1。

示例代码

def plus_one(digits):
    """
    给非负整数加一

    :param digits: 由整数组成的非负数组,表示一个整数
    :return: 加一后的数组
    """

    # 从末尾开始遍历数组
    for i in range(len(digits) - 1, -1, -1):

        # 尝试给当前元素加一
        digits[i] += 1

        # 检查是否需要进位
        if digits[i] >= 10:
            # 需要进位,将当前元素设为 0,并在下一个元素上进位
            digits[i] = 0
            if i > 0:
                digits[i - 1] += 1
            else:
                # 数组开头需要添加一个 1
                digits.insert(0, 1)

    # 返回加一后的数组
    return digits


# 测试用例
input1 = [1, 2, 3]
print(plus_one(input1))  # [1, 2, 4]

input2 = [9, 9, 9]
print(plus_one(input2))  # [1, 0, 0, 0]

进阶技巧

  • 优化性能 :可以从开头而不是从末尾遍历数组,这样可以避免在需要进位时重新遍历数组。
  • 处理负数 :本算法只能处理非负整数。如果需要处理负数,需要进行额外的处理。
  • 处理大数 :本算法使用 Python 的整数类型,可能会溢出。如果需要处理非常大的数,可以考虑使用大整数库。
  • 理解进位规则 :进位规则至关重要。确保你理解如何处理需要进位的元素。

结语

给非负整数加一的算法看似简单,但它揭示了算法思维的本质:分解问题、逐步求解和处理特殊情况。通过练习这样的题目,你可以培养自己的算法思维,并在算法的道路上不断进步。每天练习一道题,积跬步以至千里,终将成为算法高手。