如何实现n个数字的全排列,包括可重复数字。

320 查看

  1. 题目要求:随意输入n位正整数,(其中数字可重复例如112235),求出它的全排列情况(笔者用的是java实现,递归调用来实现具体算法)
    代码如下:
    package com.gnnu2016;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class randomAssortment {
/**

  • 定义一个保存所有随机组合情况的动态数组
    */
    public static ArrayList<String>list=new ArrayList<String>();

    public static void main(String[] args) {
    long num = -1;
    Scanner input=new Scanner(System.in);
    /**

    • 判断数据的正确性
      */
      do{
      System.out.println("请输入一个正整数:");
      try{
      num=input.nextInt();
      }catch(Exception e){
      input.nextLine();
      System.out.println("输入错误,请重新输入!!");
      }
      }while(num<0);
      String string=Long.toString(num);
      String[]strings=string.split("");

      //调用函数,实现对list的填充所有的排列组合情况
      getRandom(strings,0,strings.length-1);

      //打印输出所有情况
      System.out.println("一共有"+list.size()+"种不同的排列,分别是:");
      for(int i=0;i<list.size();i++){
      System.out.print(list.get(i)+" ");
      if((i+1)%10==0){
      System.out.println();
      }
      }
      System.out.println();
      }
      public static void getRandom(String[]strings,int start,int end){
      StringBuffer sBuffer=new StringBuffer();
      String string=null;
      /*

    • 一种排列情况已经出来了
      */
      if(start==end){
      for(int i=0;i<=end;i++){
      sBuffer.append(strings[i]);
      }
      string=sBuffer.toString();
      //判断该组合情况是否已经存在,如果不存在就添加该情况
      if(!list.contains(string)){
      list.add(string);
      }
      }else{
      for(int i=start;i<=end;i++){
      String temp=strings[start];
      strings[start]=strings[i];
      strings[i]=temp;

          //递归调用,直到start==end时表示递归结束
          getRandom(strings, start+1, end);
      
          temp=strings[start];
          strings[start]=strings[i];
          strings[i]=temp;
      }

      }
      }

}
如有不足之处,还望多多指点。。