加一进位是个什么鬼?

看到这个标题,大家肯定会觉得,不就是“加1”嘛,这么简单的问题我可以!但是就是这么简单的“加1”可是面试的高频题哦,所以我们就一起来看看吧。按照往例,我们还是从一道LeetCode题开始吧。

01、题目分析

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

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

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

示例 2:

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

题目分析:

根据题目,我们需要加一!没错,加一很重要。因为它只是加一,所以我们会考虑到两种情况:

  • 普通情况,除9之外的数字加1。

  • 特殊情况,9加1。(因为9加1需要进位)

所以我们只需要模拟这两种运算,就可以顺利进行求解!

02、题目图解

假设我们的数为[1,9,9]

大概是下面这样:(这个图解…真的有点太简单了…)

在这里插入图片描述

当然,这里我们需要考虑一种特殊情况,就是类似99,或者999,我们需要进行拼接数组。具体如下图:

在这里插入图片描述

通过以上分析,我们最后只需要将其转换成代码即可!这样看来,“加1”是不是也不像想象中的那么简单?

03、GO语言示例

根据以上分析,我们可以得到下面的题解:

func plusOne(digits []int) []int {
    var result []int
    addon := 0
    for i := len(digits) - 1;i >= 0; i-- {
        digits[i]+=addon
        addon = 0
        if i == len(digits) - 1 {
            digits[i]++
        }
        if digits[i] == 10 {
            addon = 1
            digits[i] = digits[i] % 10
        }
    }
    if addon == 1 {
        result = make([]int, 1)
        result[0] = 1
        result = append(result,digits...)
    }else{
        result = digits
    }
    return result
}

提示:

append(a,b...) 的含义是:将b切片中的元素追加到a中。

再给出一份java版的题解:

class Solution {
    public int[] plusOne(int[] digits) {
        int[] result;
        int addon = 0;

        for (int i = digits.length - 1; i >= 0 ; i--) {
            digits[i] += addon;
            addon = 0;
            if (i == digits.length - 1) {
                digits[i] ++ ;
            }
            if (digits[i] == 10) {
                addon = 1;
                digits[i] = digits[i] % 10;
            }
        }
        if (addon == 1) {
            result = new int[digits.length+1];
            result[0] = 1;
        } else {
            result = digits;
        }
        return result;
    }
}

我把我写的所有题解都整理成了一本电子书,每道题都配有完整图解。点击即可下载

和小浩学算法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值