经典面试题:Go 字符串面试清单

相比 Java 或 Python,Go 的字符串模型更为简洁,但需特别注意不可变性与 UTF-8 编码。

本文概述 Go 语言中的字符串特性、常用操作以及面试高频题型,帮助您在刷题、面试或调试生产代码时迅速查阅。Go 字符串具备以下特征: 不可变、支持 UTF-8 编码、底层由字节切片([]byte)实现。

一、基础语法与常用操作

1. 声明字符串

var s string = "hello"
s2 := "world"

2. 字符串不可变

尝试直接修改字符会导致编译错误:

s := "hello"
// s[0] = 'H' // ❌ 编译错误

3. 通过 []rune 修改字符

r := []rune(s)
r[0] = 'H'
s = string(r) // "Hello"

4. 字符串长度

len 返回字节长度而非字符数量:

len(s) // 字节数

5. 字符串拼接

s1 := "go"
s2 := "lang"
s3 := s1 + s2 // "golang"

6. 按字符遍历字符串

推荐方式,能正确处理 Unicode 与表情符号。

for _, ch := range s {
    fmt.Printf("%c ", ch)
}

7. 字符串与 []byte 互转

b := []byte("hello")
s := string(b)

8. 字符串比较

if s1 == s2 {
    fmt.Println("Equal")
}

9. strings 包常用函数

import "strings"

strings.ToLower("Go")             // "go"
strings.ToUpper("go")             // "GO"
strings.Contains("hello", "ll")   // true
strings.HasPrefix("hello", "he")  // true
strings.HasSuffix("hello", "lo")  // true
strings.Split("a,b,c", ",")       // []string{"a", "b", "c"}
strings.Join([]string{"a", "b"}, "-") // "a-b"
strings.ReplaceAll("foo bar foo", "foo", "baz") // "baz bar baz"

10. 去除空白

strings.TrimSpace("  hello  ") // "hello"
二、高频字符串算法题

1. 反转字符串

func reverseString(s string) string {
    r := []rune(s)
    for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {
        r[i], r[j] = r[j], r[i]
    }
    return string(r)
}

2. 判断字母异位词

func isAnagram(s, t string) bool {
    if len(s) != len(t) {
        return false
    }
    freq := [26]int{}
    for i := 0; i < len(s); i++ {
        freq[s[i]-'a']++
        freq[t[i]-'a']--
    }
    for _, v := range freq {
        if v != 0 {
            return false
        }
    }
    return true
}

3. 无重复字符的最长子串

func lengthOfLongestSubstring(s string) int {
    m := make(map[byte]int)
    left, maxLen := 0, 0
    for right := 0; right < len(s); right++ {
        if idx, ok := m[s[right]]; ok && idx >= left {
            left = idx + 1
        }
        m[s[right]] = right
        if maxLen < right-left+1 {
            maxLen = right - left + 1
        }
    }
    return maxLen
}

4. 回文字符串检测

func isPalindrome(s string) bool {
    l, r := 0, len(s)-1
    for l < r {
        if s[l] != s[r] {
            return false
        }
        l++
        r--
    }
    return true
}

    5. 分组字母异位词

    func groupAnagrams(strs []string) [][]string {
        m := make(map[[26]int][]string)
        for _, s := range strs {
            var cnt [26]int
            for _, ch := range s {
                cnt[ch-'a']++
            }
            m[cnt] = append(m[cnt], s)
        }
        res := make([][]string, 0, len(m))
        for _, group := range m {
            res = append(res, group)
        }
        return res
    }

    6. 最长回文子串(中心扩展法)

    func longestPalindrome(s string) string {
        start, end := 0, 0
        for i := 0; i < len(s); i++ {
            l1, r1 := expand(s, i, i)     // 奇数长度
            l2, r2 := expand(s, i, i+1)   // 偶数长度
            if r1-l1 > end-start {
                start, end = l1, r1
            }
            if r2-l2 > end-start {
                start, end = l2, r2
            }
        }
        return s[start : end+1]
    }
    
    func expand(s string, l, r int) (int, int) {
        for l >= 0 && r < len(s) && s[l] == s[r] {
            l--
            r++
        }
        return l + 1, r - 1
    }

    7. 报数(Count and Say)

    func countAndSay(n int) string {
        if n == 1 {
            return "1"
        }
        prev := countAndSay(n - 1)
        result, count := "", 1
        for i := 1; i < len(prev); i++ {
            if prev[i] == prev[i-1] {
                count++
            } else {
                result += fmt.Sprintf("%d%c", count, prev[i-1])
                count = 1
            }
        }
        result += fmt.Sprintf("%d%c", count, prev[len(prev)-1])
        return result
    }
    三、Unicode 与 UTF-8

    Go 字符串默认采用 UTF-8 编码。处理多字节字符或表情符号时,应转换为 []rune 或使用 utf8 包:

    s := "नमस्ते"
    fmt.Println(len(s))                      // 字节数
    fmt.Println(utf8.RuneCountInString(s))   // 实际字符数
    四、结论

    相比 Java 或 Python,Go 的字符串模型更为简洁,但需特别注意不可变性与 UTF-8 编码。熟练掌握转换、遍历及内存友好的操作模式,将帮助您高效解决与字符串相关的面试问题。

    AI大模型学习福利

    作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

    一、全套AGI大模型学习路线

    AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

    因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

    二、640套AI大模型报告合集

    这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

    因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

    三、AI大模型经典PDF籍

    随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。


    因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

    四、AI大模型商业化落地方案

    因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

    作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值