經(jīng)典面試題:Go 字符串面試清單
本文概述 Go 語言中的字符串特性、常用操作以及面試高頻題型,幫助您在刷題、面試或調(diào)試生產(chǎn)代碼時(shí)迅速查閱。Go 字符串具備以下特征: 不可變、支持 UTF-8 編碼、底層由字節(jié)切片([]byte)實(shí)現(xiàn)。

一、基礎(chǔ)語法與常用操作
1. 聲明字符串
var s string = "hello"
s2 := "world"2. 字符串不可變
嘗試直接修改字符會(huì)導(dǎo)致編譯錯(cuò)誤:
s := "hello"
// s[0] = 'H' // ? 編譯錯(cuò)誤3. 通過 []rune 修改字符
r := []rune(s)
r[0] = 'H'
s = string(r) // "Hello"4. 字符串長度
len 返回字節(jié)長度而非字符數(shù)量:
len(s) // 字節(jié)數(shù)5. 字符串拼接
s1 := "go"
s2 := "lang"
s3 := s1 + s2 // "golang"6. 按字符遍歷字符串
推薦方式,能正確處理 Unicode 與表情符號(hào)。
for _, ch := range s {
fmt.Printf("%c ", ch)
}7. 字符串與 []byte 互轉(zhuǎn)
b := []byte("hello")
s := string(b)8. 字符串比較
if s1 == s2 {
fmt.Println("Equal")
}9. strings 包常用函數(shù)
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. 反轉(zhuǎn)字符串
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. 無重復(fù)字符的最長子串
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. 回文字符串檢測(cè)
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. 最長回文子串(中心擴(kuò)展法)
func longestPalindrome(s string) string {
start, end := 0, 0
for i := 0; i < len(s); i++ {
l1, r1 := expand(s, i, i) // 奇數(shù)長度
l2, r2 := expand(s, i, i+1) // 偶數(shù)長度
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. 報(bào)數(shù)(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 字符串默認(rèn)采用 UTF-8 編碼。處理多字節(jié)字符或表情符號(hào)時(shí),應(yīng)轉(zhuǎn)換為 []rune 或使用 utf8 包:
s := "??????"
fmt.Println(len(s)) // 字節(jié)數(shù)
fmt.Println(utf8.RuneCountInString(s)) // 實(shí)際字符數(shù)四、結(jié)論
相比 Java 或 Python,Go 的字符串模型更為簡(jiǎn)潔,但需特別注意不可變性與 UTF-8 編碼。熟練掌握轉(zhuǎn)換、遍歷及內(nèi)存友好的操作模式,將幫助您高效解決與字符串相關(guān)的面試問題。





























