Plus One

Question

Problem Statement

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.

Example

Given [1,2,3] which represents 123, return [1,2,4].

Given [9,9,9] which represents 999, return [1,0,0,0].

題解

又是一道兩個整數按數位相加的題,自後往前累加,處理下進位即可。這道題中是加1,其實還可以擴展至加2,加3等。

Java

  1. public class Solution {
  2. /**
  3. * @param digits a number represented as an array of digits
  4. * @return the result
  5. */
  6. public int[] plusOne(int[] digits) {
  7. return plusDigit(digits, 1);
  8. }
  9. private int[] plusDigit(int[] digits, int digit) {
  10. if (digits == null || digits.length == 0) return null;
  11. // regard digit(0~9) as carry
  12. int carry = digit;
  13. int[] result = new int[digits.length];
  14. for (int i = digits.length - 1; i >= 0; i--) {
  15. result[i] = (digits[i] + carry) % 10;
  16. carry = (digits[i] + carry) / 10;
  17. }
  18. // carry == 1
  19. if (carry == 1) {
  20. int[] finalResult = new int[result.length + 1];
  21. finalResult[0] = 1;
  22. return finalResult;
  23. }
  24. return result;
  25. }
  26. }

C++

  1. class Solution {
  2. public:
  3. vector<int> plusOne(vector<int>& digits) {
  4. int carry = 1;
  5. for(int i = digits.size() - 1; i >= 0; i--){
  6. digits[i] += carry;
  7. carry = digits[i] / 10;
  8. digits[i] %= 10;
  9. }
  10. if(carry == 1){
  11. digits.insert(digits.begin(), 1);
  12. }
  13. return digits;
  14. }
  15. };

源碼分析

源碼中單獨實現了加任何數(0~9)的私有方法,更為通用,對於末尾第一個數,可以將要加的數當做進位處理,這樣就不必單獨區分最後一位了,十分優雅!

複雜度分析

Java 中需要返回數組,而這個數組在處理之前是不知道大小的,故需要對最後一個進位單獨處理。時間複雜度 O(n), 空間複雜度在最後一位有進位時惡化為 O(n), 當然也可以通過兩次循環使得空間複雜度為 O(1).

Reference

  • Soulmachine 的 leetcode 題解,將要加的數當做進位處理就是從這學到的。