leetcode66.加一 详解

题目

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。

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

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

分析

题目很简单,就是在原数组之上加一,但是要考虑的情况还是蛮多的,第一种情况是数组末尾数不为9,这种只需末尾数加一;第二种情况是数字末尾数为9但中间有不是9的数,eg:[1,2,3,9,9,9];第三种情况是数组数字均为9,eg:[9],[9,9,9]

解决方案

方法一:虽然代码更多但是比方法二更优化
注意一下,下面代码的执行用时:4ms,内存消耗:8.6MB;但是如果将for循环中的最后一个if语句去掉,换成注释中的if语句,同样可以运行,但执行用时变成了12ms,内存消耗变成了8.4MB

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        int len=digits.size();
        int i=len-1;
        if(digits[len-1]==9&&len==1)//数组大小=1的特殊情况,[9]
        {
            digits[len-1]=0;
            digits.insert(digits.begin(),1);
        }
        else if(digits[len-1]!=9)//数组大小>=1且数组最后一位不为9,比如[1],[1,2]
                digits[i]+=1;
        else//后面的数组大小均>=2
        {
            for(i;i>0;i--)//从后往前遍历
            {
                // if(digits[i]==9&&digits[i-1]==9&&i==1)//考虑[9,9,9]
                // {
                //     digits[i]=0;
                //     digits[i-1]=0;
                //     digits.insert(digits.begin(),1);
                // }
                if(digits[i]==9&&digits[i-1]==9)//考虑[1,2,3,9,9,9]
                    digits[i]=0;
                if(digits[i]==9&&digits[i-1]!=9)//考虑[1,2,3,9,9,9]
                {
                    digits[i]=0;
                    digits[i-1]=digits[i-1]+1;
                    break;//不能掉,比如[1,2,3,9,9,9,3,9,9,9]
                }
                if(i==1)//考虑[9,9,9]
                {
                    digits[i]=0;
                    digits[i-1]=0;
                    digits.insert(digits.begin(),1);
                }
            }
        }
        return digits;
    }
};

方法二:
执行用时:8ms
内存消耗:8.6MB

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        int len=digits.size();
        for(int i=len-1;i>=0;i--)//从后往前遍历
        {
            digits[i]+=1;
            digits[i]%=10;
            if(digits[i]!=0)
                return digits;
        }
        digits.insert(digits.begin(),1);//解决像[9,9,9]这种情况,要扩充数组进一
        return digits;
    }
};
基于html+python+Apriori 算法、SVD(奇异值分解)的电影推荐算法+源码+项目文档+算法解析+数据集,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 电影推荐算法:Apriori 算法、SVD(奇异值分解)推荐算法 电影、用户可视化 电影、用户管理 数据统计 SVD 推荐 根据电影打分进行推荐 使用 svd 模型计算用户对未评分的电影打分,返回前 n 个打分最高的电影作为推荐结果 n = 30 for now 使用相似电影进行推荐 根据用户最喜欢的前 K 部电影,分别计算这 K 部电影的相似电影 n 部,返回 K*n 部电影进行推荐 K = 10 and n = 5 for now 根据相似用户进行推荐 获取相似用户 K 个,分别取这 K 个用户的最喜爱电影 n 部,返回 K*n 部电影进行推荐 K = 10 and n = 5 for now Redis 使用 Redis 做页面访问次数统计 缓存相似电影 在使用相似电影推荐的方式时,每次请求大概需要 6.6s(需要遍历计算与所有电影的相似度)。 将相似电影存储至 redis 中(仅存储 movie_id,拿到 movie_id 后还是从 mysql 中获取电影详细信息), 时间缩短至:93ms。 十部电影,每部存 top 5 similar movie 登录了 1-6 user并使用了推荐系统,redis 中新增了 50 部电影的 similar movie,也就是说,系统只为 6 为用户计算了共 60 部电影的相似度,其中就有10 部重复电影。 热点电影重复度还是比较高的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值