Plus One

  • Easy
  • keyword: Math
  • 类似: ...

给定一个非负数,表示一个数字数组,在该数的基础上+1,返回一个新的数组。 该数字按照大小进行排列,最大的数在列表的最前面。

  • 例子:
    • 给定 [1,2,3] 表示 123, 返回 [1,2,4].
    • 给定 [9,9,9] 表示 999, 返回 [1,0,0,0].
  • 我觉得英文题目表述写的不好. 什么list?

idea

  • 按照正常的加法, 一位一位的加, 最后判断carry是否为1来处理最终的进位(实际上只有全部位为9才会有最高位进位). 这也是我在Lintcode里面的写法.
  • 看了Leetcode discuss才发现更好的方法, key是: 不用考虑进位!
    • 如果当前位不是9, 加了1就直接return!, 否则设置为0, 再去下一位.
    • 如果全部位都结束了, 但还没有return, 说明所有位都是9, 故增加一位, 并设为1, 其他位default是0, 不用设.
  • 代码如下:
public int[] plusOne(int[] nums) {
    for (int i = 0; i < nums.length; ++i) {
        if (nums[i] < 9) {
            nums[i]++;
            return nums;
        }
        nums[i] = 0;
    }
    int[] ans = new int[nums.length+1];
    ans[0] = 1;
    return ans;
}

总结

  • 数学题目重要的是找到规律, 这样可以最大限度的利用问题的性质解决, 而不是通用的方法.