老师好,我是编程界新人。
来源:3-5 Map例题

nitros
2019-11-21
关于Map例题。有个不明白的地方。
视频里阐述了,map里可以包含key,value。当我新建一个空的map之后,range巡游了一串字符的情况下。
我做了个简单的过程分析。
func maxLength(s string) int{
lastChar := make(map[rune]int)
fmt.Println("新建的lastChar是", lastChar)
start := 0
maxLength :=0
for i, ch := range []rune(s) {
lastX,bool := lastChar[ch]
fmt.Printf("i是%d,[ch]是%d,lastChar[ch]是%d
", i, ch, lastX)
if bool&& lastX>=start {
start = lastX+1 //当X存在于map中 并且最后一次出现的坐标大于start时 start 等于 最大坐标+1
}
if i-start +1 >maxLength{
maxLength = i-start+1 //判断最大长度
}
lastChar[ch] = i //记录每个字符当前最后一次出现的坐标
}
return maxLength
}
func main() {
fmt.Println(maxLength("abcdeef"))
}
得到的结果是如下的
新建的lastChar是 map[]
i是0,[ch]是97,lastChar[ch]是0
i是1,[ch]是98,lastChar[ch]是0
i是2,[ch]是99,lastChar[ch]是0
i是3,[ch]是100,lastChar[ch]是0
i是4,[ch]是101,lastChar[ch]是0
i是5,[ch]是101,lastChar[ch]是4
i是6,[ch]是102,lastChar[ch]是0
在这个过程中,我理解的是i为字符出现的顺序,ch为字符的(16进制转换符?不知道对不对)反正代表了字符内容,对于 空map[] 里引用 lastChar[ch] 反馈回来的数据 0 0 0 0 0 4 0 表示完全不理解。
麻烦能给讲解一下 吗?
1回答
-
同学你好。这段代码的确不是很容易,是一道经典面试题,有些难度。但其核心就在于map的运用,希望同学们能在这道题中学到东西。
我们的map初始化的时候是空的,但是随着我们程序运行,for i, ch := range []rune(s),每次在for的循环节最后都有lastChar[ch] = i,记录了ch最后出现的位置。所以当你打出这些i是1,2,3的时候,lastchar已经不空了。
我们看i是5,[ch]是101,lastChar[ch]是4,第5个是e,e上一次出现是什么时候呢?i==4的时候,所以这时lastChar[ch]是4。这边每次print的时候如果print整个map,可以看的更清楚些。
最后还想说,Go语言的map和其他语言不同在于,即使map里没有这个元素,甚至是一个空map,我们通过[]取值也始终能取出来,没有这个元素的时候取出来是零值对于这里的整数类型值,就是0。所以我们看到一开始总是会拿出0。那怎么来区分没有这个元素呢,还是有这个元素,值是0呢?就是第二个返回值的作用。
lastX,bool := lastChar[ch] 就是这里第二个变量,你这边叫做bool,其实我们一般叫做ok, pre, hasLastX等。我们可以通过它来判断map里有没有这个值,你也可以把这个叫做bool的变量打印一下。
122019-11-23
相似问题