3 回答

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊
但它給了我我認(rèn)為是 ASCII 值的值——我知道我可以減去 48,但這似乎有點(diǎn)老套。
這不是黑客。您有一個(gè)表示 ascii 數(shù)字的字節(jié),您希望將其值作為 0-9 之間的整數(shù)獲取。你就是這樣做的。這也是將字符串轉(zhuǎn)換為整數(shù)的一般工作方式。您可以使用此方法將每個(gè)單獨(dú)的字節(jié)轉(zhuǎn)換為數(shù)字。
“0”的 UTF-8 表示不會(huì)很快改變。當(dāng)然,48您可以減去而不是減去'0'。
為了使其更通用,也許您還應(yīng)該返回一個(gè)布爾值,指示該字節(jié)是否可以轉(zhuǎn)換。
func ByteToInt(c byte) (int, bool) {
if c >= '0' && c <= '9' {
return int(c - '0'), true
} else {
return 0, false
}
}
您可以在您的代碼示例中使用它,它會(huì)返回您的預(yù)期結(jié)果:
package main
import (
"fmt"
)
func ByteToInt(c byte) (int, bool) {
if c >= '0' && c <='9' {
return int(c - '0'), true
} else {
return 0, false
}
}
func main() {
toCheck := "987654321"
var toSum []int
for i := len(toCheck) - 2; i >= 0; i = i-2 {
var digit, _ = ByteToInt(toCheck[i])
toSum = append(toSum, digit)
}
fmt.Println(toSum)
}
https://play.golang.org/p/MRqtgY0ugZY
輸出是你所期望的:[2 4 6 8]

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
例如,
package main
import (
"fmt"
)
func main() {
toCheck := "987654321"
fmt.Println(toCheck)
toSum := make([]int, 0, len(toCheck)/2)
for i := len(toCheck) - 2; i >= 0; i -= 2 {
c := toCheck[i]
if c >= '0' && c <= '9' {
toSum = append(toSum, int(c-'0'))
}
}
fmt.Println(len(toSum), cap(toSum), toSum)
}
游樂場(chǎng): https: //play.golang.org/p/wtIgqEKj-Bk
輸出:
987654321 4 4 [2 4 6 8]
這是圍棋。代碼應(yīng)該相當(dāng)高效。例如,
$ go test sum_test.go -bench=. -benchmem
BenchmarkPeterSO-8 50000000 24.5 ns/op 32 B/op 1 allocs/op
BenchmarkTom-8 20000000 77.6 ns/op 56 B/op 3 allocs/op
BenchmarkUser10753492-8 20000000 79.0 ns/op 56 B/op 3 allocs/op
BenchmarkGrissom-8 20000000 108 ns/op 56 B/op 3 allocs/op
$
sum_test.go:
package main
import (
"strconv"
"testing"
)
// https://play.golang.org/p/wtIgqEKj-Bk
func BenchmarkPeterSO(b *testing.B) {
toCheck := "987654321"
for N := 0; N < b.N; N++ {
toSum := make([]int, 0, len(toCheck)/2)
for i := len(toCheck) - 2; i >= 0; i -= 2 {
c := toCheck[i]
if c >= '0' && c <= '9' {
toSum = append(toSum, int(c-'0'))
}
}
}
}
// https://play.golang.org/p/KgQrbesy5rT
func BenchmarkTom(b *testing.B) {
toCheck := "987654321"
for N := 0; N < b.N; N++ {
var toSum []int
for i := len(toCheck) - 2; i >= 0; i = i - 2 {
toSum = append(toSum, int(toCheck[i]))
}
}
}
func ByteToInt(c byte) (int, bool) {
if c >= '0' && c <= '9' {
return int(c - '0'), true
} else {
return 0, false
}
}
// https://play.golang.org/p/MRqtgY0ugZY
func BenchmarkUser10753492(b *testing.B) {
toCheck := "987654321"
for N := 0; N < b.N; N++ {
var toSum []int
for i := len(toCheck) - 2; i >= 0; i = i - 2 {
var digit, _ = ByteToInt(toCheck[i])
toSum = append(toSum, digit)
}
}
}
// https://play.golang.org/p/kNbQVn8GJ9R
func BenchmarkGrissom(b *testing.B) {
toCheck := "987654321"
for N := 0; N < b.N; N++ {
var toSum []int
for i := len(toCheck) - 2; i >= 0; i = i - 2 {
v, _ := strconv.Atoi(string(toCheck[i]))
toSum = append(toSum, v)
}
}
}

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超8個(gè)贊
使用strconv包進(jìn)行轉(zhuǎn)換
for i := len(toCheck) - 2; i >= 0; i = i-2 {
v,_ := strconv.Atoi(string(toCheck[i]))
toSum = append(toSum, v)
}
strconv.Atoi 是 strconv.ParseInt(s,10,0) 的快捷方式。
在你的操場(chǎng)上完成 https://play.golang.org/p/kNbQVn8GJ9R
- 3 回答
- 0 關(guān)注
- 185 瀏覽
添加回答
舉報(bào)