Discord机器人变位词命令问题:重复字母致阶乘计算错误
解决变位词命令的两个问题
一、修正变位词数量计算错误
你现在的代码直接用字符串总长度的阶乘计算变位词数量,没考虑重复字符的情况。比如"aca"总长度3,3!是6,但'a'重复了2次,正确公式应该是总长度阶乘 ÷ 每个重复字符出现次数的阶乘乘积,也就是3!/(2!×1!)=3。
实现代码:
const input = cmd; // 统计每个字符的出现次数 const charCount = {}; for (const char of input) { charCount[char] = (charCount[char] || 0) + 1; } function factorialize(num) { let result = num; if (num === 0) return 1; while (num > 1) { num--; result *= num; } return result; } // 计算正确的变位词数量 const totalFactorial = factorialize(input.length); let duplicateFactorial = 1; for (const count of Object.values(charCount)) { duplicateFactorial *= factorialize(count); } const correctAnagramCount = totalFactorial / duplicateFactorial;
二、检测字符串中的重复字母
利用上面的charCount对象,只要有字符的计数大于1,就说明存在重复:
// 判断是否含重复字母 const hasDuplicates = Object.values(charCount).some(count => count > 1);
三、判断字符串是否包含多个单词
通过检测空白字符判断,用正则能覆盖空格、制表符等多种空白情况:
// 判断是否含多个单词(以空白字符分隔) const hasMultipleWords = /\s+/.test(input);
另外,你当前的随机变位词生成逻辑(sort(() => 0.5 - Math.random()))不是均匀随机的,推荐用Fisher-Yates洗牌算法优化:
function shuffleString(str) { const arr = str.split(''); for (let i = arr.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [arr[i], arr[j]] = [arr[j], arr[i]]; } return arr.join(''); } const output = shuffleString(input);
内容的提问来源于stack exchange,提问作者gamer_sans987
相关产品推荐
相关产品推荐

