Golang中byte与rune
byte=uint8,rune=uint32(记住rune能表示更多的范围,比如中文(go中占3个字符))
package main
import "fmt"
func main(){
str1:="hello,world"
a:=[]byte(str1)
b:=[]uint8(str1)
//byte==uint8
fmt.Println("a:",a)//a: [104 101 108 108 111 44 119 111 114 108 100]
fmt.Println("b:",b)//b: [104 101 108 108 111 44 119 111 114 108 100]
//rune==uint32
//记住一点rune能表示的范围更多,比如中文(一个中文占3个字符)等
str2:="你好,中国"
c:=[]rune(str2)
d:=[]byte(str2)
fmt.Println("c:",c)//c: [20320 22909 44 20013 22269] 中文字符也能拆
fmt.Println("d:",d)//d: [228 189 160 229 165 189 44 228 184 173 229 155 189] 一个中文拆成3个字符表示4*3+1=13
}
golang中自带的string函数
这个函数接收切片类型的参数,上面的代码片段打印都是int,我们可以换成string进行打印,即
str2:="你好,中国"
c:=[]rune(str2)
d:=[]byte(str2)
fmt.Println("c:",string(c))//c: 你好,中国
fmt.Println("d:",string(d))//d: 你好,中国
力扣(893)特殊等价字符串组,遇到的一个特殊场景
题目:
func numSpecialEquivGroups(A []string) int {
m := make(map[string]bool)
for _, v := range A {
count := make([]rune, 52)
for k1, v1 := range v {
count[int(v1-'a')+26*(k1&1)]++
}
//fmt.Println(count)
key := string(count)
//fmt.Println(key)
m[key] = true
}
return len(m)
}
这题是简单题,但是我觉得并不简单,主要是思路并不能一下就想到。
思路:开辟一个52个空间的切片(至于是什么类型的切片,后面再讨论),偶数放前面,奇数+26放后面,然后放入map中,相同的就对value++,不同的就开辟一个新key放入,最后放回len就是题目要的分解个数了。
为什么这里要用[]rune切片?
如果用byte切片,你是没办法直接对他进行++操作的,因为他默认是字符类型,你是没办法直接对字符类型进行++操作的,而rune则可以,还记得前面说的rune能表示的范围更广吗?正因为如此,我可以直接对他进行++操作。之后对切片直接转string就可以当做key了,这里是不是很神奇?
可能是我太菜了。
如果什么都很容易,那还要选择做什么?