66. Plus One
Given a non-negative number represented as an array of digits, plus one to the number.
The digits are stored such that the most significant digit is at the head of the list.
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
}
};
解题思路:
-
自己的解题思路
从低位依次增加1,考虑进位的影响。对于9,99这样的输入,会对size产生影响,因此我用了一个resize()进行处理。但是,这个处理方法,浪费了之前已经将其他位置为0的处理结果,因此还有更简单的方法。
-
别人的解题思路
只要不是9进行加位,就可以提前退出。思路很简单,程序很巧妙,很美观。
学习收获:
-
第一次写程序的时候,没有注意carry的复位情况。导致,WA。
-
对于测试用例的探讨。
这题没有考虑测试用例为空的情况。个人觉得需要考虑进去。还有就是测试用例为负数的情况。虽然,题目已经说了是非负数。但是,我们可以自己造轮子。如果改一下,digits[0]可能为负数,这样的话,题目需要考虑的因素就更多。
附件:程序
1、自己的程序:
class
Solution
{
public:
vector<int>
plusOne(vector<int>&
digits)
{
if(!digits.size())
{
return{};
}
if(digits[0]
<
0)
{
return{};
}
int
carry
=
0;
int
i
=
digits.size()
-
1;
++digits[i];
if(digits[i]
==
10)
{
digits[i]
=
0;
carry
=
1;
}
for(--i;
i
>=
0;
--i)
{
digits[i]
+=
carry;
if(digits[i]
==
10)
{
digits[i]
=
0;
carry
=
1;
}
//at
the beginning, I forgot to reset the carry
else
{
carry
=
0;
}
}
//a
better one
/* if(1
== carry)
{
++digits[0];
digits.push_back(0);
}*/
if(1
==
carry)
{
auto
len
=
digits.size();
digits.clear();
digits.resize(len
+
1,
0);
digits[0]
=
1;
}
return
digits;
}
};
2、别人的程序
如果digits为空的话,这个程序有问题。但是,这种情况却没有考虑进去。所以,有时候测试用例真是个情况的东西,很难琢磨清楚。
vector<int>
plusOne(vector<int>&
digits)
{
for(int
i
=
digits.size();
i--;
digits[i]
=
0)
if(digits[i]++
<
9)
return
digits;
++digits[0];
digits.push_back(0);
return
digits;
}
没有使用carry版
class
Solution
{
public:
vector<int>
plusOne(vector<int>
&digits)
{
for(int
i
=
digits.size()
-
1;
i
>=
0;
i--)
{
digits[i]
++;
if(digits[i]
<
10)
break;
digits[i]
=
0;
}
if(digits[0]
==
0)
{
digits[0]
=
1;
digits.push_back(0);
}
return
digits;
}
};
本文详细解析了如何实现数组加一算法,通过遍历数组并处理进位来完成加一操作。介绍了两种不同的实现方式,并讨论了边界条件的处理。
583

被折叠的 条评论
为什么被折叠?



