You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 05:09:03