当前位置:   article > 正文

初级算法:加一_逐渐加一是什么计算方法

逐渐加一是什么计算方法

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

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

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

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

输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
思路一:
把数组中的内容,按位输出变成十进制数,加一后再按位压入数组。
错误:没有考虑当发生进位时,前后两数的size不一样。
应该加一个判断是否数组每一位都是九9的判别条件 如果是的话 size就加1

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        vector<int>::iterator it;
        int sum=0;
        for(int i=digits.size()-1,j=0;i>=0;--i,++j){
            sum+=digits[j]*pow(10,i);
        }
        sum+=1;
        vector<int>vec;
        for(int k=digits.size()-1;k>=0;--k){
            int m=pow(10,k);
            int n=sum/m;
            vec.push_back(n);
            sum=sum-n*m;
        }
        return vec;
    }
};
我的想法为什么总是很傻逼,菜鸡一个。


介绍下别人的思路,优秀
从后向前遍历,找到第一个不为9的数 该位置加1,改该位置后面的所有元素为0 如果没有找到不为9的元素,则情况为9,99
999这一类,此时在数组中插入size个0,在begin位置插入1.

```cpp
class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        int len=digits.size();        
        for(int i=len-1;i>=0;i--)  //从后向前
        {
            //找到第一位不为9的,该位+1,该位后面的均变为0
            if(digits[i]!=9) 
            {
                digits[i]+=1;                
                for(int j=i+1;j<len;j++)
                    digits[j]=0;
                return digits;
            }else  //digits[i]==9 继续往前找不等于9的
                continue;       
        }
        
        //上面没找到不等于9的,说明是99999...,返回100000...        
        vector<int> ans(len, 0);
        ans.insert(ans.begin(),1);
        return ans;
    }
};

作者:flora-5
链接:https://leetcode-cn.com/problems/plus-one/solution/c-cong-hou-xiang-qian-yi-ci-bian-li-by-flora-5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

另一个优秀的思路:

算法思路:

对于上述情况1,直接在最后一位加11即可。
对于上述情况2,只需从后向前遍历数组,逢99进11,直至非99结束。
对于上述情况3,我们在最开始不需要与情况2区分,只需要在按照情况2遍历结束后判断首位,若首位为00,则代表情况3出现,此时直接在vector末尾添加1个00,再将首位由00变为11即可。

作者:donggua-2
链接:https://leetcode-cn.com/problems/plus-one/solution/cbian-li-yi-ci-kong-jian-o1zhi-yao-0ms-by-donggua-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        for (int i = (int)digits.size() - 1; i >= 0; i--) {
            if (digits[i] == 9) {
                digits[i] = 0;
            }
            else {
                digits[i]++;
                break;
            }
        }
        if (digits[0] == 0) {
            digits.push_back(0);
            digits[0] = 1;
        }
        return digits;
    }
};

作者:donggua-2
链接:https://leetcode-cn.com/problems/plus-one/solution/cbian-li-yi-ci-kong-jian-o1zhi-yao-0ms-by-donggua-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最后我消化后的写法,虽然冗长但是真的理解了,感谢各位大佬的题解答案。

```cpp
class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
       for(auto it=digits.end()-1;it>=digits.begin();--it){
           if(*it!=9){
               *it+=1;
               return digits;
           }
           else
           {
               *it=0;
               for(auto it1=it+1;it1<digits.end();it1++){
                   *it1=0;
               }
           }
       }
        while(digits[0]==0)
        
        {
            digits.push_back(0);
            digits[0]=1;
        }
        return digits;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
拜拜
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/63450
推荐阅读
相关标签
  

闽ICP备14008679号