某厂实习生笔试题-数组全排列

本文介绍了如何使用Java解决数组全排列的问题。通过递归思路,对于输入的数组,依次在每个位置选择剩余未放置的元素,当所有位置填满时输出一种排列,并回溯进行下一轮排列。详细解释了递归过程,帮助理解算法逻辑。
摘要由CSDN通过智能技术生成

题目描述

输入一个数组,以空格隔开,要求按一下顺序输出其全排列。

样例:

输入:

1 2 3

输出:

123 132 213 231 312 321

备注:输入和输出都是自然数数组。

程序设计

毫无疑问,这道题我首先想到的是运用递归来解决。

对于输入的一个数组n,其排列方式可看作是在n个位置,从第一个位置开始,到最后一个位置,放置所输入的n个数。

假设我们先将输入的n个数放在一个箱子里。

对第 step (0 ≤ step <n)个位置,我们可以选择除了前面 step 个数以外的 step - i 个数中的一个(即箱子里剩下的下一个(按输入顺序))来放置。

当 step = n 时,说明n个位置均已放置好对应的数,作为一种排列方式输出。

这时,再返回上一层递归,返回之后要将刚刚放置在n - 1这个位置的数,放回箱子里。

即step = n - 1时,即最后一个位置,箱子里只有一个数可以放,同理再返回上一层递归。

返回之后要将刚刚放置在n - 2的位置的数放回箱子里。

即step = n - 2时,即倒数第二个位置,箱子里只有两个数可以放…

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

public class Main {
    public static int n = 0;
    public static int[] array;
    public static int[] array2;//装数字的箱子
    public static boolean[] array3;//记录箱子中对应的数字是否已经被取出

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int num;
        ArrayList<Integer> arrayList = new ArrayList<>();
        while(scanner.hasNext()){
            num = scanner.nextInt();
            arrayList.add(num);
            n++;
        }
        int i=0;
        array = new int[n];
        array2 = new int[n];
        array3 = new boolean[n];
        for ( Integer each:arrayList) {
            array[i++] = each;
        }
        for (int j = 0; j < n; j++) {
            array3[j] = true;
        }
        fullPermutation(0);
    }
    public static void fullPermutation(int step){
        if (step == n)
        {
            for (int j = 0; j < n; j++) {
                System.out.print(array2[j]);
            }
            System.out.print(" ");
            return;
        }
        for (int i = 0; i < n; i++) {
            if (array3[i]){
                array2[step] = array[i];
                array3[i] = false;//该数已从箱子里取出
                fullPermutation(step + 1);
                array3[i] = true;//放回该数至箱子
            }
        }
        return;
    }
}

递归的思路,我用语言描述起来比较绕,大家可以将提供的样例,代入到程序跑一遍,便会有更清晰的认识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值