MST

星途 面试题库

面试题:Go strings包分割方法在复杂字符串场景下的优化

假设有一个复杂的字符串,其中包含多种分隔符(如逗号、分号、空格等),并且这些分隔符可能连续出现多次。要求使用Go语言strings包的相关方法,将该字符串按照不同分隔符准确分割,同时尽量减少内存开销和提高性能。请写出实现代码,并解释代码的设计思路和优化点。
36.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "strings"
)

func splitComplexString(s string) []string {
    // 定义所有分隔符
    delimiters := []string{",", ";", " "}
    // 首先使用Join将所有分隔符合并为一个
    combinedDelimiter := strings.Join(delimiters, "")
    // 使用FieldsFunc按合并后的分隔符分割字符串
    return strings.FieldsFunc(s, func(c rune) bool {
        return strings.ContainsRune(combinedDelimiter, c)
    })
}

设计思路

  1. 合并分隔符:将所有需要的分隔符合并成一个字符串,这样便于后续使用strings.FieldsFunc进行操作。
  2. 使用strings.FieldsFunc:该函数接收一个字符串和一个判断函数,判断函数用来决定哪些字符是分隔符。这里通过strings.ContainsRune来判断字符是否在合并后的分隔符字符串中,以此来分割原字符串。

优化点

  1. 减少内存开销:没有使用多个中间变量存储分割后的子字符串,直接通过strings.FieldsFunc一次完成分割,减少了不必要的内存分配。
  2. 提高性能strings.FieldsFunc是Go语言标准库中专门用于按自定义规则分割字符串的函数,其内部实现经过优化,性能较高。而且通过一次合并分隔符并进行分割,避免了多次循环和分割操作,从而提高了整体性能。
func main() {
    s := "a, b;  c  ,d;e"
    result := splitComplexString(s)
    fmt.Println(result)
}

main函数中可以测试该分割函数。