之前有人问了我这样一个题目
输入一串数字字符,然后输出该字符内所有数字的排列组合。
例如:输入123,输出123,132,213,312,231,321
先在此声明一下,本人也在学习编程的道路上前进,若有错误请指正,共同进步
解题思路:
我是这么想的,直接处理字符,肯定不好处理,所以需要转换成数组,先用String类型的toCharArray方法,将数字字符转化为char[]类型数组,处理数组肯定比处理字符串要好很多
我输出数字的排列组合的想法是
比如这里有一个数组char[] a={'1','2','3'};
我们先把‘1’固定在第0位,这样数组内第1位可供分配的元素就两个2和3
然后再把2固定在第1位,这样3就是最后一位,不用分配了,得到第一种排列方式123
在1固定在第0位,2固定过第1位的前提下,轮到3固定在第1位,2则是分配到第2位,得到第二种排列方式132
同理,1在第0位的情况处理完了,接下来处理2在第0位的情况,根据上面的处理方法得到213和231,3在第0位的处理方式同理
由此我们得到123所有排列方式是123,132,213,231,312,321
代码实现:
import java.util.Scanner;
/*
目前猜想:
1234
1 234自由排列组合
2 34自由排列组合
3 4自由排列组合
SortArr(int[] arr)使用递归思想,每次递归就删除一个元素(保证不会重复)
目前问题:如何输出站位好的数字,换而言之,如何把那些数字汇总
解决:用静态变量获取值
*/
public class Test03 {
public static char[] arrz; //设置静态变量
public static int index=0; //给排列方法计数
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入一串字符串(纯数字):");
char [] arr=strToArray(sc.next());
System.out.println("输出以上数字的所有排列组合:");
arrz=new char[arr.length]; //静态变量初始化
sortArr(arr);
}
//打印数组
public static void printInt(char[] arr){
for(int i=0;i<arr.length;i++){
if(i==arr.length-1){
System.out.print(arr[i]+"\t"+Test03.index+"\n");
}else{
System.out.print(arr[i]);
}
}
}
//删除数组内的某个元素,返回删除元素后的数组
public static char[] removeElement(char[] arr,int a){
char[] arr1=new char[arr.length-1];
int index=0;
for(int i=0;i<arr.length;i++){
if(arr[i]==a)
continue;
arr1[index]=arr[i];
index++;
}
return arr1;
}
//将字符串转化为char[]类型
public static char[] strToArray(String str){
char[] strArr=str.toCharArray();
return strArr;
}
//输出排列组合
public static void sortArr(char[] arr){
for(int i=0;i<arr.length;i++){
int index=Test03.arrz.length-arr.length; //静态变量的索引
Test03.arrz[index]=arr[i]; //给静态数组赋值
char[] arr1=removeElement(arr,arr[i]);
if(arr.length==1){ //递归出口
Test03.index++; //排列方式计数
printInt(Test03.arrz); //输出排列方式
return;
}else{
sortArr(removeElement(arr,arr[i])); //递归
}
}
}
}