输入一串数字字符,输出所有的排列组合

之前有人问了我这样一个题目

输入一串数字字符,然后输出该字符内所有数字的排列组合。

例如:输入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]));    //递归
            }
        }
    }
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值