解题思路
梳理一下逻辑就OK了:
- 长度不同直接false
- diff数量为2直接判断两个位置是否互补,是则直接true
- diff数量为0判断是否出现了重复元素,是则直接true
- 其他情况均为false
func buddyStrings(s string, goal string) bool {
if len(s) != len(goal){
return false
}
diff := make([]int, 0)
cache := make([]bool, 26, 26)
repeat := false
for i:=0;i<len(s);i++{
if s[i] != goal[i]{
diff = append(diff, i)
}else{
if cache[s[i]-'a']==true{
repeat = true
}
cache[s[i]-'a']=true
}
}
if len(diff)==2{
if s[diff[0]] == goal[diff[1]] && s[diff[1]] == goal[diff[0]]{
return true
}
}else if len(diff)==0 && repeat{
return true
}else{
return false
}
return false
}
使用bool进一步节约内存,更多类型的占用入下:(下面的内容转载自文末链接)
组合类型内存占用
type Student struct {
height uint8
age uint8
}
func TheSize2() {
arr := [5]uint8{} // array
fmt.Println(unsafe.Sizeof(arr)) // 5
stu := Student{height: 175, age: 36} // struct
fmt.Println(unsafe.Sizeof(stu)) // 2
stuA := new(Student) // pointer
fmt.Println(unsafe.Sizeof(stuA)) // 8
stuB := []Student{stu} // slice
fmt.Println(unsafe.Sizeof(stuB)) // 24
stuB2 := []Student{stu, stu, stu, stu, stu} // slice
fmt.Println(unsafe.Sizeof(stuB2)) // 24
stuC := make(map[string]Student) // map
fmt.Println(unsafe.Sizeof(stuC)) // 8
stuC2 := make(map[string]Student, 64) // map
fmt.Println(unsafe.Sizeof(stuC2)) // 8
stuD := make(chan Student) // channel
fmt.Println(unsafe.Sizeof(stuD)) // 8
stuD2 := make(chan Student, 32) // channel
fmt.Println(unsafe.Sizeof(stuD2)) // 8
stuE := make([]Student, 8) // slice
fmt.Println(unsafe.Sizeof(stuE)) // 24
stuE2 := make([]Student, 16, 32) // slice
fmt.Println(unsafe.Sizeof(stuE2)) // 24
stuF0 := new([]Student) // pointer of a empty slice
fmt.Println(unsafe.Sizeof(stuF0)) // 8
var emptyFunc = func() {} // empty func
fmt.Println(unsafe.Sizeof(emptyFunc)) // 8
var stuF1 []Student // empty slice
fmt.Println(unsafe.Sizeof(stuF1)) // 24
var stuF2 struct{} // empty struct
fmt.Println(unsafe.Sizeof(stuF2)) // 0
var stuF3 [0]Student // empty array
fmt.Println(unsafe.Sizeof(stuF3)) // 0
var stuF4 interface{} // empty interface
fmt.Println(unsafe.Sizeof(stuF4)) // 16
}
make和new的区别
- make只能用在(map|channel|slice),返回类型标头,标头至少包含一个值地址指针,有的还包含其它描述字段。
- new返回的是类型指针,指针指向类型值的起始地址
更多学习:https://chende.ren/2020/11/25172308-002-type-memory-size.html
留言
牛