-
Notifications
You must be signed in to change notification settings - Fork 0
/
415-addStrings.go
69 lines (65 loc) · 1.4 KB
/
415-addStrings.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package main
import (
"fmt"
"strconv"
)
/**
* 倒序遍历两个字符串,依次相加相对的字符,结果存在 slice
* 最后反转 slice 即为结果
* 时间 O(m) m为num1/num2中较长的字符串长度
* 空间 O(1)
*/
func addStrings(num1 string, num2 string) string {
var ret []byte
var flag byte
i, j := len(num1)-1, len(num2)-1
for ; i >= 0 || j >= 0; i, j = i-1, j-1 {
tmp := flag
if i >= 0 {
tmp += num1[i] - '0'
}
if j >= 0 {
tmp += num2[j] - '0'
}
if tmp > 9 {
flag = 1
ret = append(ret, tmp-10+'0')
} else {
flag = 0
ret = append(ret, tmp+'0')
}
}
if flag == 1 {
ret = append(ret, flag+'0')
}
for i, j := 0, len(ret)-1; i < j; i, j = i+1, j-1 {
ret[i], ret[j] = ret[j], ret[i]
}
return string(ret)
}
/**
* 参考的官方答案。更简洁
*/
func addStrings2(num1 string, num2 string) string {
var ret string
var flag byte
for i, j := len(num1)-1, len(num2)-1; i >= 0 || j >= 0 || flag != 0; i, j = i-1, j-1 {
tmp := flag
if i >= 0 {
tmp += num1[i] - '0'
}
if j >= 0 {
tmp += num2[j] - '0'
}
flag = tmp / 10
ret = strconv.Itoa(int(tmp%10)) + ret
}
return string(ret)
}
func main() {
num1 := []string{"11", "456", "0", "1"}
num2 := []string{"123", "77", "0", "9"}
for i := 0; i < len(num1) && i < len(num2); i++ {
fmt.Println(num1[i], num2[i], " ret:", addStrings(num1[i], num2[i]), addStrings2(num1[i], num2[i]))
}
}