博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法笔记_099:蓝桥杯练习 算法提高 排列数(Java)
阅读量:5019 次
发布时间:2019-06-12

本文共 2370 字,大约阅读时间需要 7 分钟。

目录

 


1 问题描述

问题描述
  0、1、2三个数字的全排列有六种,按照字母序排列如下:
  012、021、102、120、201、210
  输入一个数n
  求0~9十个数的全排列中的第n个(第1个为0123456789)。
输入格式
  一行,包含一个整数n
输出格式
  一行,包含一组10个数字的全排列
样例输入
1
样例输出
0123456789
数据规模和约定
  0 < n <= 10!

 


2 解决方案

本题主要考查全排列中字典序的实现。关于如何实现字典序,这个是有专门的实现算法,具体实现原理,大家可以百度一下哟~

 

具体代码如下:

import java.util.Scanner;public class Main {        public int count = 1;  //用于计算当前已排列个数        public void swap(int[] A, int a, int b) {        int temp = A[a];        A[a] = A[b];        A[b] = temp;    }    //反转数组A中start~end区间的元素    public void reverseArray(int[] A, int start, int end) {        while(start < end) {            int temp = A[start];            A[start++] = A[end];             A[end--] = temp;         }    }    //判定数组A中是否有两个连续递增的元素    public boolean judgeArray(int[] A) {        for(int i = 1;i < A.length;i++) {            if(A[i - 1] < A[i])                return true;        }        return false;    }    //从数组A最后一位开始遍历,找出第一个出现A[i] < A[i + 1]的数组下标i    public int getFirstI(int[] A) {        int first = A.length - 1;        for(int i = first;i >= 1;i--) {            if(A[i - 1] < A[i]) {                first = i - 1;                break;            }        }        return first;    }    //扩展getFirstI功能,找出元素A[i]后面大于A[i]的最小元素下标    public int getFirstJ(int[] A) {        int j = getFirstI(A);        int valueI = A[j];        j++;        for(;j < A.length;j++) {            if(A[j] <= valueI) {                j = j - 1;                break;            }        }        if(j == A.length)            j = j - 1;        return j;    }        public void printResult(int[] A, int x) {        if(x == 1) {            for(int m = 0;m < A.length;m++)                System.out.print(A[m]);            return;        }        int i, j;        while(judgeArray(A)) {  //字典序排序具体实现部分            i = getFirstI(A);            j = getFirstJ(A);            swap(A, i, j);            reverseArray(A, i + 1, A.length - 1);            count++;            if(count == x)                break;        }        for(int m = 0;m < A.length;m++)            System.out.print(A[m]);        return;    }            public static void main(String[] args) {        Main test = new Main();        int[] A = {0,1,2,3,4,5,6,7,8,9};        Scanner in = new Scanner(System.in);        int x = in.nextInt();        test.printResult(A, x);    }}

 

 

 

 

 

转载于:https://www.cnblogs.com/liuzhen1995/p/6581273.html

你可能感兴趣的文章
面向对象高级
查看>>
Bitwise And Queries
查看>>
oracle连接问题ORA-00604,ORA-12705
查看>>
Java从零开始学十三(封装)
查看>>
Python2和Python3中的rang()不同之点
查看>>
lintcode28- Search a 2D Matrix- easy
查看>>
react项目
查看>>
A Simple Tree Problem
查看>>
Modular Inverse [ZOJ 3609]
查看>>
MySQL性能测试工具之mysqlslap使用详解
查看>>
深入理解jsonp跨域请求原理
查看>>
regsvr32注册COM组件失败
查看>>
jmeter,CSV数据加载、数据库连接、正则
查看>>
MySQL学习点滴 --分区表
查看>>
4.6.1 测试基础
查看>>
洛谷 P2486 [SDOI2011]染色
查看>>
oo第三单元总结
查看>>
leetcode : Count and Say [基本功]
查看>>
洛谷 P2485 [SDOI2011]计算器 解题报告
查看>>
Slickflow.NET 开源工作流引擎基础介绍(三) -- 基于HTML5/Bootstrap的Web流程设计器
查看>>