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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:25:20