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

如何实现带长度限制的排列?基于现有Java全排列代码的实现方案问询

带长度限制的排列实现方案

核心修改思路

  • 新增入参k用来指定需要生成的排列长度
  • 调整递归终止条件:当递归深度pos等于k时,就截取数组前k个元素存入结果集,不需要继续递归到数组末尾
  • 原有交换、回溯逻辑完全保留,仅调整终止判断和结果截取规则

完整修改后代码

import java.util.ArrayList;

// 对外调用方法新增参数k,指定需要生成的排列长度
static ArrayList<int[]> permutations(int[] a, int k) {
    // 可选:参数合法性校验
    if (k < 1 || k > a.length) {
        throw new IllegalArgumentException("排列长度k取值范围为1到数组长度");
    }
    ArrayList<int[]> temp = new ArrayList<>();
    permutation(a, 0, k, temp);
    return temp;
}

// 递归方法新增k参数
public static void permutation(int[] arr, int pos, int k, ArrayList<int[]> list){
    // 终止条件修改:pos等于k时直接保存前k位,停止递归
    if(pos == k) {
        int[] res = new int[k];
        System.arraycopy(arr, 0, res, 0, k);
        list.add(res);
        return;
    }
    for(int i = pos; i < arr.length; i++){
        swap(arr, pos, i);
        permutation(arr, pos+1, k, list);
        swap(arr, pos, i);
    }
}

public static void swap(int[] arr, int pos1, int pos2){
    int h = arr[pos1];
    arr[pos1] = arr[pos2];
    arr[pos2] = h;
}

调用示例

要生成1234的4P2排列,调用方式如下:

public static void main(String[] args) {
    int[] arr = {1,2,3,4};
    ArrayList<int[]> res = permutations(arr, 2);
    // 输出结果
    for (int[] item : res) {
        System.out.println(item[0] + "" + item[1]);
    }
}

运行后会输出所有4取2的排列结果:12、13、14、21、23、24、31、32、34、41、42、43。

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

相关产品推荐
方舟 Agent Plan

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

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