Golang 处理字符串与整型数值相互转换的最佳实践
文章目录
- Golang 处理字符串与整型数值相互转换的最佳实践
- LeetCode 165. 比较版本号
- 思路
- Golang 代码
Golang 处理字符串与整型数值相互转换的最佳实践
今天刷题的时候碰到了 「LeetCode 165. 比较版本号」问题,最开始我的处理方式与在 C++ 当中一样,使用.
作为分隔符分段将每一个子字符串转换为整型数值,但后来发现 Golang 提供了 strings
和 strconv
两个库函数可以帮助我们实现类似于 Python 的字符串处理与字符串与整型相互转换的体验。下面我们以这道题目为例进行实践。
LeetCode 165. 比较版本号
思路
就像刚才我提到的,最开始我的思路就是手动地将.
作为分隔符,来完成字符串version
的分割,我甚至实现了一个将version
字符串转为 slice 的函数:
func version2Slice(version string) []int {values := []int{}bytes := []byte(version)currVal := 0for i := 0; i <= len(bytes); i ++ {if i == len(bytes) || bytes[i] == '.' {values = append(values, currVal)currVal = 0} else {if currVal == 0 && bytes[i] == '0' {continue} else {currVal = currVal * 10currVal += int(bytes[i] - '0')}}}return values
}
基于这个函数,再将长度不同的 slice 用0
补齐即可完成版本号的比较,但是这样手工实现起来非常的麻烦,在 Golang 当中解这道题的最佳实践是直接使用库函数strings
和strconv
。strings
当中提供了split
方法可以让我们根据提供的分割符将字符串转为[]string
序列。然后直接使用strconv
的Atoi
就可以将字符串转为相应的整型数值。
Golang 代码
func compareVersion(version1 string, version2 string) int {v1 := strings.Split(version1, ".")v2 := strings.Split(version2, ".")for i := 0; i < len(v1) || i < len(v2); i ++ {x, y := 0, 0if i < len(v1) {x, _ = strconv.Atoi(v1[i])}if i < len(v2) {y, _ = strconv.Atoi(v2[i])}if x > y {return 1}if x < y {return -1}}return 0
}