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

如何在JavaScript中判断一个数是否是另一个数的排列

判断JavaScript中一个数是否为另一个数的排列

这个问题核心是检查两个数的数字组成(包括位数和每个数字的出现次数)是否完全一致,不过得先提个JS里的小坑:数字字面量的前导零会被特殊处理(比如011在非严格模式下会被解析成八进制的9),所以我们得先把输入转成字符串来处理,避免这种解析偏差。

下面给你两种实用的解决方案,都能完美匹配你的示例需求:


方法一:排序对比法(简单直观)

思路非常直白:把两个数转成字符串后拆成字符数组,排序后再拼接成新字符串,如果这两个新字符串相等,说明它们是彼此的排列。

function perm(num1, num2) {
  // 统一把输入转成字符串,兼容数字和字符串类型的输入
  const str1 = String(num1);
  const str2 = String(num2);
  
  // 长度不一样直接排除,排列的位数肯定相同
  if (str1.length !== str2.length) return false;
  
  // 排序后对比字符串是否一致
  return str1.split('').sort().join('') === str2.split('').sort().join('');
}

// 测试你的示例
console.log(perm(1234, 2413)); // true
console.log(perm(154, 154)); // true
console.log(perm(101, 011)); // false(因为011被JS解析成9,转成字符串是"9",和"101"长度不同)
console.log(perm(501, 104)); // false

这个方法的优点是代码简洁易懂,适合大多数日常场景;缺点是排序的时间复杂度为O(n log n),如果处理非常长的数字(比如几十位),效率会比计数法低一些。


方法二:计数统计法(高效进阶)

如果需要处理大数或者追求更高性能,可以用计数统计的方式:先统计第一个数每个数字的出现次数,再用第二个数去“抵消”这些计数,过程中如果发现某个数字不存在或者计数已经归零,直接返回false,最后检查所有计数是否都归零即可。

function perm(num1, num2) {
  const str1 = String(num1);
  const str2 = String(num2);
  
  if (str1.length !== str2.length) return false;
  
  const digitCount = {};
  
  // 统计第一个字符串的数字出现次数
  for (const digit of str1) {
    digitCount[digit] = (digitCount[digit] || 0) + 1;
  }
  
  // 遍历第二个字符串,减少对应数字的计数
  for (const digit of str2) {
    // 如果这个数字没被统计过,或者已经被抵消完了,说明不匹配
    if (!digitCount[digit]) return false;
    digitCount[digit]--;
  }
  
  // 最后检查所有数字的计数是否都为0
  return Object.values(digitCount).every(count => count === 0);
}

// 测试示例
console.log(perm(1234, 2413)); // true
console.log(perm(154, 154)); // true
console.log(perm(101, 011)); // false
console.log(perm(501, 104)); // false

这个方法的时间复杂度是O(n),而且能提前终止判断(遇到第一个不匹配的数字就返回),性能更好,适合处理大量数据或者长数字的场景。


重要提示

如果你需要比较带前导零的数字(比如想判断"011"和"101"是否是排列),一定要传入字符串类型的参数!因为如果传入数字011,JS会把它解析成八进制的9(非严格模式下),严格模式下甚至会报错,导致结果不符合预期。

内容的提问来源于stack exchange,提问作者Bobby Joe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:33:31