• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
neverlandly
博客园    首页    新随笔    联系   管理    订阅  订阅

Leetcode: 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.

少数次通过, 网上这个题被称为“Google最喜欢的题”,因为在google面试中出现的频率非常高。我们先说说这道题的解法。思路是维护一个进位,对每一位进行加一,然后判断进位,如果有继续到下一位,否则就可以返回了,因为前面不需要计算了。有一个小细节就是如果到了最高位进位仍然存在,那么我们必须重新new一个数组,然后把第一个为赋成1(因为只是加一操作,其余位一定是0,否则不会进最高位)。因为只需要一次扫描,所以算法复杂度是O(n),n是数组的长度。而空间上,一般情况是O(1),但是如果数是全9,那么是最坏情况,需要O(n)的额外空间。

 1 public class Solution {
 2     public int[] plusOne(int[] digits) {
 3         int carry = 1;
 4         int digit = 0;
 5         for (int i=digits.length-1; i>=0; i--) {
 6             digit = (digits[i] + carry) % 10;
 7             carry = (digits[i] + carry) / 10;
 8             digits[i] = digit;
 9             if (carry != 1) break;
10         }
11         if (carry == 1) {
12             int[] res = new int[digits.length+1];
13             res[0] = 1;
14             for (int k=1; k<res.length; k++) {
15                 res[k] = digits[k-1];
16             }
17             return res;
18         }
19         return digits;
20     }
21 }

 贴别人的一个做法:最开始的一个空的判断,以及最高位进位,它断定是1000XX00, 因此只需要第一位设置为1,后面都不用管

 1 public int[] plusOne(int[] digits) {
 2     if(digits == null || digits.length==0)
 3         return digits;
 4     int carry = 1;
 5     for(int i=digits.length-1;i>=0;i--)
 6     {
 7         int digit = (digits[i]+carry)%10; 
 8         carry = (digits[i]+carry)/10;
 9         digits[i] = digit;
10         if(carry==0)
11             return digits;    
12     }
13     int [] res = new int[digits.length+1];    
14     res[0] = 1;
15     return res;
16 }

 

posted @ 2014-05-02 05:22  neverlandly  阅读(431)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3