题目:给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 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;
}
解决方法有很多,并不局限于这两种!