加一
题目:给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3] 输出: [1,2,4] 解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1] 输出: [4,3,2,2] 解释: 输入数组表示数字 4321。
给定函数声明:
vector<int>plusOne(vector<int>& digits) { }
解题:
首先我们需要考虑2种情况,假设
输入是[9,9,9,9,9],输出则应该是[1,0,0,0,0,0];假设输入时[9,8,7,6,5,4,3,2,1],输出则应该是[9,8,7,6,5,4,3,2,2]。由此可得出有可能会改变vector的长度。
解题方式有很多,如
1、定义一个数组,将处理结果放入到数组中,然后再从数组转换成vector。
vector<int>plusOne(vector<int>& digits) { vector<int> rst; int nArrayLength = digits.size() + 1; int *pArray = new int[nArrayLength]{0}; int nCurrentIndex = nArrayLength - 1; bool isPlueOne = true; for(auto end = digits.end() - 1; end >= digits.begin(); end--) { int value = *end; if(isPlueOne) { value += 1; if(value >= 10) value = 0; else isPlueOne = false; } pArray[nCurrentIndex--] = value; } if(isPlueOne)pArray[nCurrentIndex] = 1; for(nCurrentIndex = pArray[0] == 0 ? 1 : 0; nCurrentIndex < nArrayLength; nCurrentIndex++) rst.push_back(pArray[nCurrentIndex]); delete[] pArray; return rst; }
2、不借助以上数组,当需要增加vector长度的时候push_back一下,将前面的数据往后移。即digits[n] = digits[n - 1],移完以后再修改第一个元素的值为1.
vector<int>plusOne(vector<int>& digits) { bool isPlueOne = true; for(auto end = digits.end() - 1; end >= digits.begin(); end--) { if(isPlueOne) { *end += 1; if(*end >= 10) *end = 0; else isPlueOne = false; } } if(isPlueOne) { digits.push_back(0); for(auto end = digits.end() - 1; end > digits.begin(); end--) *end = *(end - 1); *digits.begin() = 1; } return digits; }
解决方法有很多,并不局限于这两种!