/*给定一个非负数,用一个数组表示各个位上的数,返回这个数加1后组成的新数组
*eg.
* 给定 [1,2,3] 表示 123, 返回 [1,2,4].
* 给定 [9,9,9] 表示 999, 返回 [1,0,0,0].
*eg.
* 给定 [1,2,3] 表示 123, 返回 [1,2,4].
* 给定 [9,9,9] 表示 999, 返回 [1,0,0,0].
*/
分析:主要考虑进1的情况,如果最高位加1 后需要进1,则新数组就会比原数组多一个数
解法一:利用栈先进后出特性存储每一位数
private int[] PlusOne(int[] nums)
{
Stack<int> stack = new Stack<int>();
int flag = 1; //表示要进位的数,初始值为1,表示初始时候+1
for (int i = nums.Length - 1; i >= 0; i--)
{
nums[i] += flag;
int temp = nums[i] % 10;
flag = nums[i] / 10;
stack.Push(temp);
if (i == 0 && flag > 0)
{
stack.Push(flag);
}
}
int[] res = new int[stack.Count];
for (int i = 0; i < res.Length; i++)
{
res[i] = stack.Pop();
}
return res;
}
解法二:
private int[] PlusOne2(int[] nums)
{
int flag = 1;
for (int i = nums.Length - 1; i >= 0 && flag > 0; i--) //当flag==0时 就不需要进位,数组前面的数字就不会发生改变
{ // 就跳出循环
int temp = nums[i] + flag;
nums[i] = temp % 10;
flag = temp / 10;
}
if (flag == 0) //flag==0 直接返回原数组
return nums;
int[] res = new int[nums.Length + 1];
res[0] = 1;
for (int i = 0; i < nums.Length; i++)
{
res[i + 1] = nums[i];
}
return res; //flag==1 返回值比原数组多一个数 res[0]=1;
}