解题思路

梳理一下逻辑就OK了:

  1. 长度不同直接false
  2. diff数量为2直接判断两个位置是否互补,是则直接true
  3. diff数量为0判断是否出现了重复元素,是则直接true
  4. 其他情况均为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

最后修改日期: 2021年11月23日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。