题解 | #给数组加一#

给数组加一

http://www.nowcoder.com/practice/e20d6e18e75941b6a5b7b33ffa7b8d4d

给数组加一

题目描述

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

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

方法一:直接法

解题思路

对数组进行逆序遍历,模拟加一操作,此时需要一个辅助数组来存储结果。

alt

解题代码

class Solution {
public:
    
    vector<int> plusOne(vector<int>& nums) {
        vector<int> res;
        int flag=1;//进位
        for(int i=nums.size()-1;i>=0;i--)
        {//逆向遍历
            res.push_back((nums[i]+flag)%10);
            if(nums[i]+flag>9)
            {//判断进位
                flag=1;
            }
            else
            {
                flag=0;
            }
        }
        if(flag)
        {//判断进位
            res.push_back(1);
        }
        reverse(res.begin(),res.end());//逆序
        return res;// 返回结果
    }
};

复杂度分析

时间复杂度:一次遍历,因此时间复杂度为O(n)O(n)

空间复杂度:使用常数级内存地址空间,因此空间复杂度为O(1)O(1)

方法二:不使用辅助数组的方法

解题思路

基于方法一,不借助辅助数组来对原数组进行加法操作,此时需要逆序,判断进位以后再逆序。

解题代码

class Solution {
public:
    
    vector<int> plusOne(vector<int>& nums)
    {
        int flag=1;//进位
        for(int i=nums.size()-1;i>=0;i--)
        {//逆向遍历
            if(nums[i]+flag>9)
            {//判断进位
                nums[i]=(nums[i]+flag)%10;
                flag=1;
            }
            else
            {
                nums[i]=(nums[i]+flag)%10;
                flag=0;
            }
        }
        reverse(nums.begin(),nums.end());//逆序
        if(flag)
        {//判断进位
            nums.push_back(1);
        }
        reverse(nums.begin(),nums.end());//逆序
        return nums; // 返回结果
    }
};

复杂度分析

时间复杂度:一次遍历,因此时间复杂度为O(n)O(n)

空间复杂度:使用常数级内存地址空间,因此空间复杂度为O(1)O(1)

算法 文章被收录于专栏

算法题的题解以及感受

全部评论

相关推荐

06-18 15:03
门头沟学院 Java
至少实习看起来比去年好?问了下群里的同学和身边的同学,人均有offer。有的还有好几个大厂offer
菜鸟1973:上一年暑期也是人均大厂实习offer,结果秋招跟不招人一样,大部分都转正了
点赞 评论 收藏
分享
那一天的Java_Java起来:他本来公司就是做这个的,不就是正常的游戏客户端和服务器开发,软硬件联动,有啥恶心不恶心的,提前告诉你就是怕你接受不了,接受不了就没必要再往后走流程浪费时间,虽然这公司是一坨。
点赞 评论 收藏
分享
有担当的灰太狼又在摸鱼:零帧起手查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务