Golang 常⻅⾯试题⽬解析(一)

码农编程进阶笔记

共 5679字,需浏览 12分钟

 · 2023-10-17

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 ,⽤来判断指 定字符串在另外⼀个字符串的索引未知,分别是第⼀次发现位置和最后发现位置。

浏览 32
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报