LeetCode 066. Plus One

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 ;
     }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值