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

求JavaScript实现n选r的字符串排列函数(P(n,r))

关于部分排列(P(n,r))的JavaScript实现及关键词说明

关键词修正

你之前搜不到目标函数,是因为常规的"permutations"关键词默认指向全排列(n!)。要找对应P(n,r)的实现,应该用以下关键词:

  • k-permutations
  • partial permutations(部分排列)
  • permutations of n elements taken r at a time

JavaScript实现

下面是一个通用的部分排列生成函数,支持数组输入(比如你的车辆列表),返回所有长度为r的有序排列:

function getPartialPermutations(items, r) {
  const result = [];
  const used = new Array(items.length).fill(false);

  function backtrack(current) {
    if (current.length === r) {
      result.push([...current]);
      return;
    }

    for (let i = 0; i < items.length; i++) {
      if (used[i]) continue;
      used[i] = true;
      current.push(items[i]);
      backtrack(current);
      current.pop();
      used[i] = false;
    }
  }

  backtrack([]);
  return result;
}

针对字符串的适配版本

如果你的输入是字符串(比如单个字符组成的字符串),可以用这个适配函数:

function getStringPartialPermutations(str, r) {
  const items = str.split('');
  const permutations = getPartialPermutations(items, r);
  return permutations.map(arr => arr.join(''));
}

示例验证(你的车辆场景)

假设你有16辆车的数组:

const cars = ['车1', '车2', '车3', ..., '车16']; // 完整16辆车列表
const parkingPermutations = getPartialPermutations(cars, 4);
console.log(parkingPermutations.length); // 输出 16*15*14*13 = 43680,和P(16,4)结果一致

每个子数组代表一种车位顺序(第一个元素是左侧车位,第二个中间,以此类推),完全符合你对车位顺序区分的要求。

补充说明

  • 该实现用回溯法生成,逻辑清晰且高效,避免重复计算
  • 如果处理超大n和r(比如n=100, r=20),会生成极多结果,建议提前评估内存占用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 20:03:12