leetcode笔记之[66. 加一]

100 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

题目描述

原题链接 :

66. 加一

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

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

你可以假设除了整数 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

思路分析

思路上如题,从个位遍历,得到第一个不为9的位数。int not_nine; 初始值为digits.size()-1,在遍历digits的过程中自减,当遇到不为9的数字时则break.

  • case1:如果遍历完整个digits数组都没找到不为9的数字(如99),此时not_nine = -1,因此返回的数组res长度为digits.size()+1,除了第1位为1,其他都为0(如100)
  • case2:如果遍历digits结束后not_nine = digits.size()-1,即为初始值,代表此时的digits的数组不存在为9的数字(如123),因此将res = digits,并将res的个位加1(如124)
  • case3:第一个不为9的数字存在于digits数组中某一位(如899),则将这一位的后面的数重新赋值为0,这一位的数字自加1(如900)

AC 代码

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        vector<int> res;
        if( digits.size() == 0) return res;
            
        // 从个位 计算第一个不为9 的数字,如果i=-1,表示全都是999999.。。
        int n=digits.size();
        int not_nine;
        for( not_nine = n-1; not_nine>=0;)
        {
            if( digits[not_nine] == 9)
                not_nine--;
            else
                break;
        }
        if( not_nine == -1)
        {
            // 99
            res = vector<int>(n+1,0);
            res[0] = 1;
            return res;
        }
        else if(not_nine == n-1)
        {
            // 123
            res = digits;
            res[n-1] += 1;
            return res;
        }
        else
        {
            // 899   not_nine = 0
            res = digits;
            res[ not_nine ] += 1;
            for( int i = not_nine+1; i< n; i++)
            {
                res[i] = 0;
            }
            return res;
        }
        
        return res;
    }
};

参考

反向进位,容易理解的小白解法 - 加一 - 力扣(LeetCode)