码迷,mamicode.com
首页 > 其他好文 > 详细

OJ练习17——T66 Plus One

时间:2015-04-16 11:55:00      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:

用单个保存的数字表示一个十进制数,实现+1操作。

保存的第一个数一定要是有意义的(非零)。

【思路】

很容易想到把保存的数字转换为实际十进制数,然后+1,再按原格式保存,但很明显有超范围数据如何表示的问题。

比如9876543210.(试过用long long类型也放不下?)

所以要考虑几种情况:

1.个位数字不是9,直接在个位数+1;

2.个位数字是9,对于数据位数>1的,从后向前遍历每位数,遇到不是9的就+1,break;

在此之前是9的就变0。

如果改变后最大位是0,则最大位变1,再在最后push_back一个0;

3.如果只有一位数且是9,则变1,0. 这种情况是运行后增加的。开始容易忽略。

【my code】

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

【other code】

用另外的vector把原vector反过来保存,再从前向后判断,如果长度增1,就push_back(1)

vector<int> plusOne(vector<int> &digits) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        vector<int> ret(digits);
        reverse(ret.begin(), ret.end());
        
        int flag = 1;
        for(int i = 0; i < ret.size(); i++)
        {
            ret[i] += flag;
            flag = ret[i] / 10;
            ret[i] %= 10; 
        }
        
        if (flag == 1)
            ret.push_back(1);
        
        reverse(ret.begin(), ret.end());
        
        return ret;
    }

评价:人家的代码总是很短_(:зゝ∠)_ 不过我的那个循环还是可读性很强的!握拳】

ps:

今天做的两道题目都很不顺畅,今天的状态也很不正常╮(╯﹏╰)╭

OJ练习17——T66 Plus One

标签:

原文地址:http://www.cnblogs.com/ketchups-notes/p/4431318.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!