交替打印数字和字⺟
问题描述
使⽤两个  goroutine  交替打印序列,⼀个  goroutine  打印数字, 另外⼀
个  goroutine  打印字⺟, 最终效果如下:
解题思路
问题很简单,使⽤ channel 来控制打印的进度。使⽤两个 channel ,来分别控制数字和
字⺟的打印序列, 数字打印完成后通过 channel 通知字⺟打印, 字⺟打印完成后通知数
字打印,然后周⽽复始的⼯作。
源码参考
12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ2728 1
letter,number := make(chan bool),make(chan bool) 1
wait := sync.WaitGroup{} 2
3 go func() { 4
i := 1 5
for { 6
select { 7
case <-number: 8
fmt.Print(i) 9
i++ 10
fmt.Print(i) 11
i++ 12
letter <- true 13
break 14
default: 15
break 16
} 17
} 18
}() 19
wait.Add(1) 20
go func(wait *sync.WaitGroup) { 21
str := "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 22
3 i := 0 24
for{ 25
源码解析
这⾥⽤到了两个 channel 负责通知,letter负责通知打印字⺟的goroutine来打印字⺟,
number⽤来通知打印数字的goroutine打印数字。
wait⽤来等待字⺟打印完成后退出循环。
判断字符串中字符是否全都不同
问题描述
请实现⼀个算法,确定⼀个字符串的所有字符【是否全都不同】。这⾥我们要求【不允
许使⽤额外的存储结构】。 给定⼀个string,请返回⼀个bool值,true代表所有字符全都
不同,false代表存在相同的字符。 保证字符串中的字符为【ASCII字符】。字符串的⻓
度⼩于等于【3000】。
解题思路
这⾥有⼏个重点,第⼀个是 ASCII字符 , ASCII字符 字符⼀共有256个,其中128个是常
⽤字符,可以在键盘上输⼊。128之后的是键盘上⽆法找到的。
然后是全部不同,也就是字符串中的字符没有重复的,再次,不准使⽤额外的储存结
构,且字符串⼩于等于3000。
如果允许其他额外储存结构,这个题⽬很好做。如果不允许的话,可以使⽤golang内置
的⽅式实现。
源码参考
通过 strings.Count  函数判断: