华为OD机试 - 第k个排列 - 全排列递归(Java 2023 B卷 100分)-LMLPHP

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

给定参数n,从1到n会有n个整数:1,2,3,…,n,这n个数字共有n!种排列。按大小顺序升序列出所有排列的情况,并一一标记当n=3时,所有排列如下“123”,“132,“213”,“231”,“312”,“321”

给定n和k,返回第k个排列。

二、输入描述

输入两行,第一行为n,第二行为k,给定n的范围是[1,9],给定k的范围是[1,n!]。

三、输出描述

输出排在第k位置的数字。

通过n=3进行分析,以1开头、以2开头、以3开头的排列个数各有两个,因为固定开头为1的,则其排列情况就是n=2的排列情况,即有两个23、32。

四、解题思路

  1. 输入两行,第一行为n,第二行为k;
  2. 全排列递归算法,从第一个数开始;
    • 参数分别是需要排列的数组,初始位置,结束位置;
    • 递归结束标识是,初始位置 = 结束位置;
    • 进行数据交换;
    • 全排列递归算法;
    • 数据还原;
  3. 对其升序排序;
  4. 取第k个排列。

五、Java算法源码

package com.guor.od;

import java.util.*;

public class OdTest01 {

    private static List<Integer> list = new ArrayList<>();

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();

        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = i + 1;
        }

        // 全排列递归算法,从第一个数开始
        recursion(arr, 0, n - 1);

        // 升序排序
        Collections.sort(list);

        System.out.println(list.get(k - 1));
    }

    /**
     * 全排列递归算法
     *
     * @param arr  需要排列的数组
     * @param start 初始位置
     * @param end    结束位置
     */
    private static void recursion(int[] arr, int start, int end) {
        if (start == end) {
            String str = "";
            for (int a : arr) {
                str += a;
            }
            list.add(Integer.parseInt(str));
        } else {
            for (int i = start; i <= end; i++) {
                // 交换
                swap(arr, start, i);
                // 全排列递归算法
                recursion(arr, start + 1, end);
                // 数据还原
                swap(arr, start, i);
            }
        }
    }

    /**
     * 数据交换
     */
    private static void swap(int[] arr, int x, int y) {
        int temp = arr[x];
        arr[x] = arr[y];
        arr[y] = temp;
    }
}

六、效果展示

1、输入

3
3

2、输出

213

3、说明

3的排列有“123”,“132,“213”,“231”,“312”,“321”,第三个就是213。

华为OD机试 - 第k个排列 - 全排列递归(Java 2023 B卷 100分)-LMLPHP


🏆下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

华为OD机试 - 第k个排列 - 全排列递归(Java 2023 B卷 100分)-LMLPHP

09-26 18:49