Go语言如何优化支持数字、特殊符号的字符串打乱功能?
问题代码的核心缺陷
- 短单词处理错误:长度≤2的单词(比如单个字符"a")首尾字符为同一个,原代码强行拼接首尾两次,导致输出重复字符(比如"a"变"aa")
- 数字判断逻辑错误:仅用
strconv.Atoi判断纯数字token,漏判了包含数字的混合字符token,不符合「只要入参存在数字就返回原串」的规则 - 单引号处理逻辑错误:原代码找到单引号后直接截断前面的字符做相邻交换,既没有保留单引号的固定位置,也没有正确过滤单引号参与打乱
- 标点丢失问题:分词正则匹配了多种标点,但后续switch仅处理了5种标点,其余标点直接丢弃
- 打乱逻辑异常:处理带单引号单词时的相邻交换逻辑不符合随机打乱要求,容易出现字符错位
优化后的完整代码
import ( "math/rand" "regexp" "unicode" ) func tokenize(text string) []string { re := regexp.MustCompile(`[A-Za-z']+|[0-9:A-Za-z';?().,!\\ ]`) return re.FindAllString(text, -1) } func scramble(text string, seed int64) string { // 全量校验是否存在数字,符合规则直接返回原串 for _, c := range text { if unicode.IsDigit(c) { return text } } // 用独立随机数实例避免全局seed冲突 rng := rand.New(rand.NewSource(seed)) slicy := tokenize(text) result := make([]byte, 0, len(text)) for _, token := range slicy { tokenLen := len(token) // 短token、标点、空格直接原样拼接 if tokenLen <= 2 || !regexp.MustCompile(`^[A-Za-z']+$`).MatchString(token) { result = append(result, token...) continue } // 提取中间字符(首尾固定保留) middle := []byte(token[1 : tokenLen-1]) // 收集需要打乱的非'字符和对应位置 var shuffleChars []byte var shufflePos []int for i, c := range middle { if c != '\'' { shuffleChars = append(shuffleChars, c) shufflePos = append(shufflePos, i) } } // 随机打乱非'字符 if len(shuffleChars) >= 2 { rng.Shuffle(len(shuffleChars), func(i, j int) { shuffleChars[i], shuffleChars[j] = shuffleChars[j], shuffleChars[i] }) } // 打乱后的字符回填到原位置,保留'不动 for i, pos := range shufflePos { middle[pos] = shuffleChars[i] } // 拼接最终单词 result = append(result, token[0]) result = append(result, middle...) result = append(result, token[tokenLen-1]) } return string(result) }
内容的提问来源于stack exchange,提问作者Slim Mathew
相关产品推荐
相关产品推荐

