其他分享
首页 > 其他分享> > leetcode-165. 比较版本号

leetcode-165. 比较版本号

作者:互联网

img

解题思路

python版

# 方法一
class Solution:
    def compareVersion(self, version1: str, version2: str) -> int:
        ver1 = version1.split('.')
        ver2 = version2.split('.')
        n1, n2 = len(ver1), len(ver2)

        # compare versions
        for i in range(max(n1, n2)):
            i1 = int(ver1[i]) if i < n1 else 0
            i2 = int(ver2[i]) if i < n2 else 0
            if i1 != i2:
                return 1 if i1 > i2 else -1
        
        # the versions are equal 
        return 0

复杂度:

# 方法二
class Solution:
    def compareVersion(self, version1: str, version2: str) -> int:
        p1, p2 = 0, 0
        len1, len2 = len(version1), len(version2)
        end = max(len1, len2)
        while (p1 < end or p2 < end):
            v1, v2 = 0, 0
            while (p1 < len1 and version1[p1] != '.'):
                v1 = v1 * 10 + ord(version1[p1]) - 48   # '0' Asiico = 48
                p1 += 1
            
            while (p2 < len2 and version2[p2] != '.'):
                v2 = v2 * 10 + ord(version2[p2]) - 48
                p2 += 1

            if v1 != v2:
                return 1 if v1 > v2 else -1
        
            p1 += 1
            p2 += 1

        return 0

复杂度:

golang版本

// If (a > b ? a : b).(type)
func If(condition bool, trueVal, falseVal interface{}) interface{} {
	if condition {
		return trueVal
	}
	return falseVal
}

func compareVersion(version1 string, version2 string) int {
	p1, p2 := 0, 0
	len1, len2 := len(version1), len(version2)
	end := If(len1 > len2, len1, len2).(int)
	for p1 < end || p2 < end {
		var v1, v2 int
		for p1 < len1 && version1[p1] != '.' {
			v1 = v1*10 + int(version1[p1]-'0')
			p1++
		}

		for p2 < len2 && version2[p2] != '.' {
			v2 = v2*10 + int(version2[p2]-'0')
			p2++
		}

		if v1 > v2 {
			return 1
		} else if v1 < v2 {
			return -1
		}

		p1++
		p2++
	}
	return 0
}

go中用到的相关知识点复习

字符转数字

组成每个字符串的元素叫做“字符”,可以通过遍历或者单个获取字符串元素获得字符。 字符用单引号(’)包裹起来

Go语言的字符有两种形式

字符串底层是一个byte数组,所以可以和[]byte类型相互转换。字符串是不能修改的 字符串是由byte字节组成,所以字符串的长度是byte字节的长度。 rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。

var c rune='a' 
var i int =98
i1:=int(c)
fmt.Println("'a' convert to",i1)
c1:=rune(i)
fmt.Println("98 convert to",string(c1))

//string to rune
for _, char := range []rune("世界你好") {
    fmt.Println(string(char))
}

字符串的修改

要修改字符串,需要先将其转换成[]rune或者[]byte,修改完成后再转换为string,无论哪种转换,都会重新分配内存,并复制字节数组。

func changeString() {
	s1 := "big"
	// 强制类型转换
	byteS1 := []byte(s1)
	byteS1[0] = 'p'
	fmt.Println(string(byteS1))
	
	s2 := "中文"
	runeS2 := []rune(s2)
	runeS2[1] = "国"
	fmt.Println(string(runeS2))
}

go实现三元运算符

go语言没有三元运算符的表达式,为什么要去写这个三元运算符,也是因为go中没有min\max这个常用的函数,golang中有math.Max(float64, float64) float64是对float64类型的比较,由于float64类型要处理infinity和not-a-number这种值,而他们的处理非常复杂,一般用户没有能力,所有go需要为用户提供系统级别的解决办法。

标签:p2,p1,version1,version2,版本号,int,rune,165,leetcode
来源: https://www.cnblogs.com/panlq/p/13084363.html