加一

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

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

你可以假设除了整数 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;
}

  

解决方法有很多,并不局限于这两种!

原文地址:https://www.cnblogs.com/LandyTan/p/12230041.html