用单个保存的数字表示一个十进制数,实现+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:
今天做的两道题目都很不顺畅,今天的状态也很不正常╮(╯﹏╰)╭