1. 程式人生 > >golang刷Leetcode系列 --- 加1

golang刷Leetcode系列 --- 加1

產生 另一個 tro var 可能 給定 否則 println 輸出

加一

給定一個非負整數組成的非空數組,在該數的基礎上加一,返回一個新的數組。

最高位數字存放在數組的首位, 數組中每個元素只存儲一個數字。

你可以假設除了整數 0 之外,這個整數不會以零開頭。

示例 1:

輸入: [1,2,3]
輸出: [1,2,4]
解釋: 輸入數組表示數字 123。

示例 2:s

輸入: [4,3,2,1]
輸出: [4,3,2,2]
解釋: 輸入數組表示數字 4321。

這道題做了挺長時間, 主要是第一次的思路沒有考慮到數組所表示的整數可能會溢出的情況. 傻傻的把數組轉換成整數, 加1之後又轉換為數組.
所以這道題主要在於兩點:

  1. 整數溢出的問題
  2. 如何處理每一位的進位的問題

我的思路是, 設置另一個切片result存儲相加之後的整數. 關於切片的長度, 是這樣確定的, 如果原數組digits每一位都是9的話,
也就是說整數最高位會產生進1, 那麽result的長度就是digits長度加1. 否則, result的長度就是digits的長度.

使用carry表示進位(0或者1). 第一步先計算digits和result的最高位, 得到一個初始的carry.

然後使用循環計算digits和result的每一位, 每一位的進位都取決於上一位相加得到的值, 如果該值大於10, 進位=1, 否則進位=0


func plusOne(digits []int) []int {
    var carry int = 0
    var overflow int = 0
    var len2 int = 0

    len1 := len(digits)
    for i := 0; i < len1; i++ {
        if digits[i] == 9 {
            overflow++
        }
    }

    if overflow == len1 {
        len2 = len1 + 1
    } else {
        len2 = len1
    }

    result := make([]int, len2)

    digits[len1-1] += 1
    result[len2-1] = digits[len1-1] % 10
    if digits[len1-1] >= 10 {
        carry = 1
    }
    
    for i, j := len1 - 2, len2 - 2; i >= 0 || j >= 0; {
                //防止下標i越界
        if i >= 0 {
            digits[i] += carry  
            if digits[i] >= 10 {
                carry = 1
            } else {
                carry = 0
            }
            result[j] = digits[i] % 10
        }
                //當最高位需要進位時
        if len1 < len2 && j == 0 {
            result[j] = 1
            break
        }
            
        i--;
        j--;
    }

    fmt.Println(result)

    return result
}

func main() {
    digits := []int{1, 2, 3}
    plusOne(digits)
    //fmt.Println(result)
}

golang刷Leetcode系列 --- 加1