LeetCode题练习与总结:加一--66

237 篇文章 0 订阅
69 篇文章 0 订阅

一、题目描述

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。

示例 2:

输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。

示例 3:

输入:digits = [0]
输出:[1]

提示:

  • 1 <= digits.length <= 100
  • 0 <= digits[i] <= 9

二、解题思路

  1. 首先,我们需要遍历数组的每一位数字,从最低位(数组的最后一个元素)开始。
  2. 对于每一位数字,我们将其加一。如果加一后的结果小于10,那么直接更新该位的数字,并且结束循环,因为我们已经完成了加一操作。
  3. 如果加一后的结果等于或大于10,说明发生了进位,我们需要将当前位的数字更新为0,并且继续处理下一位(即向前进位)。
  4. 如果在遍历完整个数组后,仍然有进位(即数组中所有的位都已经加一,且最后一个位加一后仍然等于或大于10),我们需要在数组的开头添加一个1,表示进位到了最高位。

三、具体代码

public class Solution {
    public int[] plusOne(int[] digits) {
        // 从数组的最后一个元素开始,向前遍历
        for (int i = digits.length - 1; i >= 0; i--) {
            // 如果当前位加一后小于10,直接更新并结束循环
            if (digits[i] < 9) {
                digits[i]++;
                return digits;
            } else {
                // 如果当前位加一后等于或大于10,发生进位
                digits[i] = 0; // 将当前位更新为0,并继续向前一位进位
            }
        }
        // 如果所有的位都已经加一,且仍然有进位,需要在数组开头添加一个1
        int[] result = new int[digits.length + 1];
        result[0] = 1; // 在新数组的第一个位置添加1
        return result;
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 该算法的主要操作是遍历整数数组的每一位数字,并对其进行加法操作。这个操作是线性的,即它与输入数组的长度成正比。
  • 遍历数组的时间复杂度为 O(n),其中 n 是数组 digits 的长度。
  • 由于在遍历过程中可能需要遍历整个数组,或者在最坏的情况下(即数组中的每个数字都是9)需要遍历整个数组并再进行一次操作(在数组前面添加一个新元素)。
  • 所以总的时间复杂度仍然是 O(n)。
2. 空间复杂度
  • 空间复杂度主要取决于存储操作的额外空间需求。
  • 在大多数情况下,我们只需要原始数组 digits 的空间来存储结果,因此空间复杂度为 O(n)。
  • 但是,在最坏的情况下,当数组中的每个数字都是9时,我们需要创建一个新的数组来存储结果(因为需要在数组前面添加一个1),这将导致额外的 O(n) 空间需求。
  • 因此,总的空间复杂度为 O(n)。

五、总结知识点

  1. 数组遍历:代码通过for循环从数组的最后一个元素开始向前遍历,这是处理类似数位加法问题时常用的方法。通过这种方式,我们可以逐位检查并更新数组中的每个数字。

  2. 进位处理:在加法运算中,如果某一位的加法结果超过了9(即等于或大于10),就需要进行进位处理。代码中通过检查当前位加一后是否仍小于9来判断是否需要进位。如果需要进位,就将当前位的值设为0,并继续处理下一位。

  3. 条件判断:代码中使用了if条件判断来检查当前位加一后是否需要进位。这是基本的控制流语句,用于根据不同的条件执行不同的代码块。

  4. 数组长度:代码中使用了digits.length来获取数组的长度,这是处理数组时常用的属性,用于了解数组中元素的数量。

  5. 数组更新:在代码中,直接在原数组上进行更新操作(即直接修改数组中的元素值)。这是一种原地修改(in-place modification)的做法,可以节省空间。

  6. 创建新数组:在所有位都为9且需要进位的情况下,代码创建了一个新的数组int[] result,并在开头添加了1。这是处理数组长度增加时的常用方法。

  7. 返回值:代码根据不同的情况返回不同的结果。如果能够在原数组上完成加法操作,则直接返回原数组;如果需要创建新数组,则返回新数组。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直学习永不止步

谢谢您的鼓励,我会再接再厉的!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值