Golang 常⻅⾯试题⽬解析(一)
共 5679字,需浏览 12分钟
·
2023-10-17 15:53
1.交替打印数字和字⺟
问题描述
使⽤两个 goroutine 交替打印序列,⼀个 goroutine 打印数字, 另外⼀ 个 goroutine 打印字⺟, 最终效果如下:
12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ2728
解题思路
问题很简单,使⽤ channel 来控制打印的进度。使⽤两个 channel ,来分别控制数字和 字⺟的打印序列, 数字打印完成后通过 channel 通知字⺟打印, 字⺟打印完成后通知数 字打印,然后周⽽复始的⼯作。
letter, number := make(chan bool), make(chan bool)
wait := sync.WaitGroup{}
go func () {
i := 1
for {
select {
case <-number:
fmt.Print(i)
i++
fmt.Print(i)
i++
letter <- true
break
default:
break
}
}
}()
wait.Add(1)
go func (wait *sync.WaitGroup) {
str := "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
i := 0
for {
select {
case <-letter:
if i >= strings.Count(str, "")-1 {
wait.Done()
return
}
fmt.Print(str[i : i+1])
i++
if i >= strings.Count(str, "") {
i = 0
}
fmt.Print(str[i : i+1])
i++
number <- true
break
default:
break
}
}
}(&wait)
number<-true
wait.Wait()
源码解析
这⾥⽤到了两个 channel 负责通知,letter负责通知打印字⺟的goroutine来打印字⺟, number⽤来通知打印数字的goroutine打印数字。wait⽤来等待字⺟打印完成后退出循环。
2、判断字符串中字符是否全都不同
问题描述
请实现⼀个算法,确定⼀个字符串的所有字符【是否全都不同】。这⾥我们要求【不允 许使⽤额外的存储结构】。给定⼀个string,请返回⼀个bool值,true代表所有字符全都 不同,f alse代表存在相同的字符。保证字符串中的字符为【ASCII字符】。字符串的⻓ 度⼩于等于【3000】。
解题思路
这⾥有⼏个重点,第⼀个是 ASCII字符 , ASCII字符 字符⼀共有256个,其中128个是常 ⽤字符,可以在键盘上输⼊。1 28之后的是键盘上⽆法找到的。然后是全部不同,也就是字符串中的字符没有重复的,再次,不准使⽤额外的储存结 构,且字符串⼩于等于3000。如果允许其他额外储存结构,这个题⽬很好做。如果不允许的话,可以使⽤golang内置 的⽅式实现。源码参考 通过 stri ngs .Count 函数判断:
func isUniqueString(s string) bool {
if strings.Count(s, "") > 3000 {
return false
}
for _, v := range s {
if v > 127 {
return false
}
if strings.Count(s, string(v)) > 1 {
return false
}
}
return true
}
通过 stri ngs .Index 和 stri ngs .LastIndex 函数判断:
func isUniqueString2(s string) bool {
if strings.Count(s, "") > 3000 {
return false
}
for k, v := range s {
if v > 127 {
return false
}
if strings.Index(s, string(v)) != k {
return false
}
}
return true
}
源码解析
以上两种⽅法都可以实现这个算法。第⼀个⽅法使⽤的是golang内置⽅法 stri ngs .Count ,可以⽤来判断在⼀个字符串中包含 的另外⼀个字符串的数量。第⼆个⽅法使⽤的是golang内置⽅法 stri ngs .Index 和 stri ngs .LastIndex ,⽤来判断指 定字符串在另外⼀个字符串的索引未知,分别是第⼀次发现位置和最后发现位置。