golang刷Leetcode系列 --- 加1
加一
給定一個非負整數組成的非空數組,在該數的基礎上加一,返回一個新的數組。
最高位數字存放在數組的首位, 數組中每個元素只存儲一個數字。
你可以假設除了整數 0 之外,這個整數不會以零開頭。
示例 1:
輸入: [1,2,3]
輸出: [1,2,4]
解釋: 輸入數組表示數字 123。
示例 2:s
輸入: [4,3,2,1]
輸出: [4,3,2,2]
解釋: 輸入數組表示數字 4321。
這道題做了挺長時間, 主要是第一次的思路沒有考慮到數組所表示的整數可能會溢出的情況. 傻傻的把數組轉換成整數, 加1之后又轉換為數組.
所以這道題主要在于兩點:
我的思路是, 設置另一個切片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 = 0var overflow int = 0var len2 int = 0len1 := 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] += 1result[len2-1] = digits[len1-1] % 10if 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] = 1break}i--;j--;}fmt.Println(result)return result }func main() {digits := []int{1, 2, 3}plusOne(digits)//fmt.Println(result) }轉載于:https://www.cnblogs.com/dennis-wong/p/9410603.html
總結
以上是生活随笔為你收集整理的golang刷Leetcode系列 --- 加1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP-CPP开发扩展(五)
- 下一篇: HDU-1811 Rank of Tet