第一章数组——加一

吾日三省吾身

还记得的梦想吗

正在努力实现它吗

可以坚持下去吗

目录

吾日三省吾身

力扣题号:66. 加一 - 力扣(LeetCode)

题目描述

思路

思路:模拟

情况处理

代码逻辑解释

注意事项

Java代码实现

C++代码实现

总结


颜文字

(¬‿¬)(◕‿◕)
٩(◕‿◕。)۶͡~ ͜ʖ ͡°)
(^‿^)(。♥‿♥。)

玩儿去吧 


力扣题号:66. 加一 - 力扣(LeetCode)

注:下述题目描述和示例均来自力扣

题目描述

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

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

你可以假设除了整数 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. 特殊情况处理: 如果数组只包含一个元素且该元素为9,或者数组的最后一位是9,需要进行特殊处理。

  2. 普通加一操作: 如果数组的最后一位不是9,直接将最后一位加一。

  3. 复杂情况处理: 如果数组最后一位是9,需要考虑进位的情况。采用从最后一位开始往前遍历的方式,进行进位操作。

  4. 扩容: 如果最高位有进位,需要在数组的最前面进行扩容。

代码逻辑解释

  1. 获取数组的最后一个元素的索引。
  2. 判断数组是否只有一个元素且该元素为9。如果是,则需要对数组进行扩容操作,新数组的长度为原数组长度加1,且新数组的第一个元素为1,第二个元素为0,其余元素与原数组相同。然后返回新数组。
  3. 判断数组的最后一个元素是否为9。如果不是,则将最后一个元素加一后返回数组。
  4. 如果最后一个元素为9,则需要进一步处理。
  5. 从最后一个元素开始遍历数组,如果当前元素为10(即前一位进一位后当前位变为0),则继续向前进位。
  6. 如果当前元素不是第一个元素且当前元素为10,或者最后一个元素加一后为10,则将当前元素置为0,并将前一位加一。
  7. 最后返回处理后的数组。

这份代码的时间复杂度为O(n),其中n为数组的长度。

注意事项

  • 代码中使用了数组拷贝的方法,通过 System.arraycopy 实现数组的扩容和元素的复制。
  • 通过判断数组元素是否等于10,避免了显式的进位标志。
  • 对于特殊情况和普通情况分别进行处理,提高代码的可读性和简洁性。

Java代码实现

class Solution {
    public int[] plusOne(int[] digits) {
        int last = digits.length - 1;
        // 判断是不是只有一个九
        if (last == 0 && digits[last] == 9) {
            // 是第一位扩容
            int[] first = new int[last + 2];
            System.arraycopy(digits, 0, first, 1, last + 1);
            first[0] = 1;
            first[1] = 0;
            return first;
        }
        // 判断是不是普通的加一
        if (digits[last] != 9) {
            digits[last] += 1;
            return digits;
        } else {
            // 好,事情并不简单
            int position = last;
            // 这里的最后一位等于九
            while (position >= 0) {
                // 第一位是 10 ,那么需要扩容
                if (position == 0 && digits[position] == 10) {
                    int[] first = new int[last + 2];
                    System.arraycopy(digits, 0, first, position, last + position);
                    first[position] = 1;
                    first[position + 1] = 0;
                    digits = first;
                }
                // 这里判断的是 非第一位发现是10,那么需要进位
                if (position != 0 && digits[position] == 10 || digits[last] + 1 == 10) {
                    // 不是第一位是9,那么前一位加一,这一位变成零
                    digits[position - 1] += 1;
                    digits[position] = 0;
                }
                position--;
            }
        }
        return digits;
    }
}

wdf,都是绿的,太爽了

 


C++代码实现

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        int last = digits.size() - 1;
        // 判断是不是只有一个九
        if (last == 0 && digits[last] == 9) {
            // 是第一位扩容
            vector<int> first(last + 2);
            copy(digits.begin(), digits.end(), first.begin() + 1);
            first[0] = 1;
            first[1] = 0;
            return first;
        }
        // 判断是不是普通的加一
        if (digits[last] != 9) {
            digits[last] += 1;
            return digits;
        } else {
            // 好,事情并不简单
            int position = last;
            // 这里的最后一位等于九
            while (position >= 0) {
                // 第一位是 10 ,那么需要扩容
                if (position == 0 && digits[position] == 10) {
                    vector<int> first(last + 2);
                    copy(digits.begin(), digits.end(), first.begin() + position);
                    first[position] = 1;
                    first[position + 1] = 0;
                    digits = first;
                }
                // 这里判断的是 非第一位发现是10,那么需要进位
                if (position != 0 && (digits[position] == 10 || digits[last] + 1 == 10)) {
                    // 不是第一位是9,那么前一位加一,这一位变成零
                    digits[position - 1] += 1;
                    digits[position] = 0;
                }
                position--;
            }
        }
        return digits;
    }
};

该说不说,C++是真的省内存呐


总结

不难,但是有点绕,建议先写一个思路图出来再写代码,不然真的容易绕进去

ヾ( ̄▽ ̄)Bye~Bye~~~ 

  • 37
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

WenJGo

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值