列表

详情


NC180. 给数组加一

描述

给定一个用数组表示的数字,即数组中每个数表示一个数位上的数,例如 [1,2,3],表示 123 ,请问给这个数字加一后得到的结果(结果同样以数组的形式返回)。

注意:数组中不可能出现负数,且保证数组的首位即数字的首位不可能是 0 。

数据范围: 数组长度满足 ,数组中每个数满足

示例1

输入:

[1,2,3]

输出:

[1,2,4]

示例2

输入:

[1,9]

输出:

[2,0]

示例3

输入:

[9]

输出:

[1,0]

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 2ms, 内存消耗: 412KB, 提交时间: 2021-11-29

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型vector
     */
    vector<int> plusOne(vector<int>& nums) {
        // write code here
        
        int n=nums.size()-1;
        while(nums[n]==9&&n>=0){
             nums[n]=0;
            --n;
        }
        if(n>=0) nums[n]+=1;
        else nums.insert(nums.begin(),1);
        return nums;
        
        
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 384KB, 提交时间: 2022-01-28

class Solution {
public:
    /*
    方法一:找出最长的后缀 9 - 思路清晰

    思路
    当我们对数组 digits 加一时,我们只需要关注 digits 的末尾出现了多少个 9 即可。
    我们可以考虑如下的三种情况:
    1. 如果 digits 的末尾没有 9,例如 [1,2,3],那么我们直接将末尾的数加一,得到 [1,2,4] 并返回;
    2. 如果 digits 的末尾有若干个 9,例如 [1,2,3,9,9],那么我们只需要找出从末尾开始的第一个不为 9 的元素,即 3,
       将该元素加一,得到 [1,2,4,9,9]。随后将末尾的 9 全部置零,得到 [1,2,4,0,0] 并返回。
    3. 如果 digits 的所有元素都是 9,例如 [9,9,9,9,9],那么答案为 [1,0,0,0,0,0]。
       我们只需要构造一个长度比 digits 多 1 的新数组,将首元素置为 1,其余元素置为 0 即可。

    复杂度分析
    时间复杂度:O(n),其中 n 是数组 digits 的长度。
    空间复杂度:O(1)。返回值不计入空间复杂度。
    */
    vector<int> plusOne(vector<int>& digits) {
        int n = digits.size();
        for (int i = n - 1; i >= 0; --i) {
            if (digits[i] != 9) {
                ++digits[i];
                for (int j = i + 1; j < n; ++j) {
                    digits[j] = 0;
                }
                return digits;
            }
        }
        // digits 中所有的元素均为 9
        vector<int> ans(n + 1);
        ans[0] = 1;
        return ans;
    }

    /*
    方法二:进位计算 - 太妙了!

    加一的所有可能的情况就只有两种:
    1. 除 9 之外的数字加一;
    2. 数字 9。
    
    思路
    1. 加一得十进一位个位数为 0 加法运算如不出现进位就运算结束了且进位只会是一。
    2. 所以只需要判断有没有进位并模拟出它的进位方式,如十位数加 1 个位数置为 0,
       如此循环直到判断没有再进位就退出循环返回结果。
    3. 然后还有一些特殊情况就是当出现 99、999 之类的数字时,
       循环到最后也需要进位,出现这种情况时需要手动将它进一位。

    复杂度分析
    时间复杂度:O(n),其中 n 是数组 digits 的长度。
    空间复杂度:O(1)。返回值不计入空间复杂度。
    */
    vector<int> plusOne2(vector<int>& digits) {
        for (int i = digits.size() - 1; i >= 0; i--) {
            digits[i]++;
            digits[i] = digits[i] % 10;
            if (digits[i] != 0) return digits;
        }
        vector<int> ans(digits.size() + 1);
        ans[0] = 1;
        return ans;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 388KB, 提交时间: 2021-11-27

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型vector
     */
    vector<int> plusOne(vector<int>& nums) {
        // write code here
        int n=nums.size()-1;
        while(nums[n]==9&&n>=0){
             nums[n]=0;
            --n;
        }
        if(n>=0) nums[n]+=1;
        else nums.insert(nums.begin(),1);
        return nums;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 392KB, 提交时间: 2022-07-29

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型vector
     * @return int整型vector
     */
    vector<int> plusOne(vector<int>& nums) {
        // write code here
        int size = nums.size() - 1;
        int flag = 1;
        do {
            int sum = nums[size]  + flag;
            flag = sum / 10;
            nums[size] = sum % 10;
            size--;
        } while (flag > 0 && size >= 0);
        if (flag) {
            vector<int> result;
            result.push_back(flag);
            for (int i = 0 ; i < nums.size(); i++) {
                result.push_back(nums[i]);
            }
            return result;
        }
        return nums;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 392KB, 提交时间: 2022-01-24

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型vector
     */
    vector<int> plusOne(vector<int>& nums) {
        // write code here
        for(int i=nums.size()-1;i>=0;i--){
            if(nums[i]==9)
                nums[i]=0;
            else{
                nums[i]++;
                break;
            }
        }
        if(nums[0]==0)
            nums.insert(nums.begin(), 1);
        return nums;
    }
};

上一题