`
daoyongyu
  • 浏览: 125543 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

全排列的题目

    博客分类:
  • JAVA
阅读更多
[url]
原文地址:
http://www.blogjava.net/nokiaguy/archive/2008/05/10/199647.html
[/url]
[url]
另外一篇文章:
http://topic.csdn.net/u/20070114/14/1170e023-e8f0-4331-8bd8-516c6f1e40da.html
[/url]
原题如下:
用1、2、2、3、4、5这六个数字,用java写一个程序,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。
解题思路:
    很明显,这是一个递归算法。我们可以排列将这6个数按从小到大的顺序排一下,如果是1,2,3,4,5,6,那么会有1*2*3*4*5*6= 6!=720个递增的数。但如果是1,2,2,3,4,5,那么在这720个数中一定会有相同的数对出现(由于在这6个数中只有两个数两同,也就是说,如果有重复的数,那么一定是一对数,如122345会出现两次)。

    排列的基本规则是分步进行。也就是说,要排列上面6个数,首先应该选择第一个数,这第一个数可以选择这6个数中的任意一个,如选择1.第二步是选择第二个数,这第二个数不能再选择已经选过的数,如1.因此,它只能从后面5个数中选择。如选择2。以此类推。

    我们也可以在程序中模拟这一过程。源程序如下:

public class test1
  {
    private int[] numbers = new int[]
    { 1, 2, 3, 3, 4, 5 };
    public int n;
    private String lastResult = "";

    private boolean validate(String s)
    {
        if (s.compareTo(lastResult) <= 0)
            return false;
        if (s.charAt(2) == '4')
            return false;
        if (s.indexOf("35") >= 0 || s.indexOf("53") >= 0)
            return false;
        return true;
    }

    public void list(String index, String result)
    {
        for (int i = 0; i < numbers.length; i++)
        {
            if (index.indexOf(i + 48) < 0)
            {
                String s = result + String.valueOf(numbers[i]);
                if (s.length() == numbers.length)
                {
                    if (validate(s))
                    {
                        System.out.println(s);
                        lastResult = s;
                        n++;
                    }
                    break;
                }
                list(index + String.valueOf(i), s);
            }
        }
    }

    public static void main(String[] args)
    {
        test1 t = new test1();
        t.list("", "");
        System.out.println("总数:" + t.n);

    }
}


其中list函数是这个算法的核心函数。index参数表示已经选择过的数,用numbers数组的索引表示。如index="012",表示numbers的前三个数已经被选择,也表示应该选择第四个数了,而这第四个数应该从后三个数中选择。result参数表示临时的数字组合(这个数字组合最多是5个数字,因为,如果到了6个数字,就表示已经有一个结果产生了)。在默认情况下index和result的值都是""。

    在validate中使用了  if (s.compareTo(lastResult) <= 0)进行判断,由于按这种方法进行排列,如果这6个数是递增给出的,那么排列的结果一定是递增的,但上述的6个数其中第2和第3个位置上都是2,因此,如果出现了上一个结果不小于当前结果的情况,一定是有重复了,因此,要将这部分数过滤出去。
==============================================================
以下是评论:
问题1:
   请问index.indexOf(i + 48) < 0判断条件的作用是什么?
   
回答1:
   ndex保存了当前数字串的索引,index.indexOf(i + 48) < 0就是判断当前的数字的索引是否在index中(由于给定的数字串有重复的数字,因此,只能使用索引来判断了),如果不在,就会认为这个数字还没有加到index中,如果存在了,说明这个数已经在数字串中了。
注: i+48 ,当i=0时,正好是数字0的ASCII,因为index中存的毕竟是索引,是位置嘛,所以是从0开始的
    


分享到:
评论

相关推荐

    常见算法介绍、算法刷题(含解析与代码).rar

    常见算法介绍 排序算法 冒泡排序 选择排序 插入排序 归并排序 快速排序 搜索算法 线性搜索 二分搜索 ...排序算法题目 题目1:数组排序 题目2:Kth Largest Element in an Array ...题目1:全排列 题目2:子集

    LeetCode 46. 全排列

    全排列题目解题思路代码实现实现结果 46. 全排列 题目来源:https://leetcode-cn.com/problems/permutations/ 题目 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [ [1,2,...

    求字符串的全排列

    在编程领域,字符串的全排列是一个经典的问题,它涉及到算法和数据结构的知识。在这个问题中,我们被要求找出一个字符串中...这种问题有助于我们深入理解算法和递归思想,对于编程初学者来说,是一个很好的练习题目。

    Python算法题源代码-LeetCode(力扣)-全排列

    题目46. 全排列 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例 2:...

    输出n个字符的全排列(没有重复字符)

    简单的实现,代码很短。 输入一个字符串,输出它的字符的所有组合的情况 如输入“abc”,则输出abc,acb,bac,bca,cab,cba。 但如果输入“aba”,即有重复的,也会输出aba,aab,baa,baa,aba,aab。

    C++n个数全排列的算法

    运行此代码将得到题目中给出的所有可能的3个数字的排列。 全排列算法的时间复杂度为O(n!),因为它需要生成n!种排列。空间复杂度取决于递归调用的深度,对于n个元素的全排列,最坏情况下的深度为n,所以空间复杂度为...

    关于全排列算法

    在给定的题目中,作者通过一个简单的递归方法实现了全排列的计算。以下是对该算法的详细解析: 首先,我们来看作者提供的代码。代码的核心在于`pai`函数,它是一个递归函数,用于生成字符串`str`的全排列。`chang`...

    字典序全排列

    在计算机科学领域,全排列是组合数学中的一个重要概念,它指的是从n个不同元素中取出n个元素,按照一定的顺序排列的所有可能的方式。当n个元素的排列需要按照特定顺序,如字典序(从小到大的顺序)进行时,我们称之...

    构造全排列问题

    在组合数学与算法设计领域中,构造全排列问题是一类常见的编程题目。它不仅考验了算法设计的能力,还涉及到了数据结构的选择和应用。本篇文章将详细介绍如何解决一道特定的全排列构造问题,并给出详细的解题思路和...

    用java语言实现数字全排列

    题目描述:给定一个数列a1,a2,a3…an,输出他所有的全排列。 算法设计描述: 1、获取当前的一种排列,用start,end分别表示该排列的列头,列尾; 2、判断start是否和end相等,若相等,执行3,否则执行4; 3、将当前...

    随机全排列生成程序及其应用开发(有程序代码)

    实验题目涉及的是随机全排列的生成程序及其应用开发,这是计算机科学中的一种常见问题,特别是在算法设计、数据处理和模拟实验等场景下。本实验主要提供了两种生成全排列的方法,并结合C语言编写了相应的代码。 **...

    组合数学全排列算法(转)

    不过,既然题目要求围绕组合数学中的全排列算法进行展开,我们可以基于标题和描述中提到的主题来构建相关知识点。 ### 组合数学全排列算法 #### 全排列算法概述 全排列是指从n个不同元素中取出m (m≤n) 个元素,...

    基础算法题目精简集合

    - **题目描述**:涉及对有重复元素的序列进行全排列的问题。 - **解题思路**: - 使用递归来生成所有可能的排列。 - 在递归过程中,需要跳过重复的元素以避免生成重复的排列。 #### 第六章 贪心与分治 ##### ...

    回溯法 - 输出自然数1到n所有不重复的排列,即n的全排列

    题目要求输出自然数1到n的所有不重复排列,即n的全排列。具体来说: - **定义排列**:一个排列是由n个元素组成的有序集合(x1, x2, ..., xn),其中每个元素xi满足1 。 - **不重复排列**:在任何排列中,每个数字只能...

    蓝桥杯Python模拟赛题之数学问题全排列.zip

    在实际的蓝桥杯Python模拟赛题中,题目可能会更复杂,可能需要你理解并应用这些基本概念去解决实际问题。通过深入学习和实践,你可以掌握处理全排列问题的各种策略,提高你的编程能力和解决问题的能力。 此外,对于...

    全排列(dfs)1

    在题目描述给出的示例中: - 示例1:输入数组 `nums = [1,2,3]`,输出为六种不同的排列组合:`[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]`。 - 示例2:输入数组 `nums = [0,1]`,输出为两种排列:`[[0,1],...

    蓝桥杯Python模拟赛题之数学问题全排列去重.zip

    在编程竞赛中,如“蓝桥杯”,参赛者经常面临各种挑战,其中包括解决数学问题和优化算法...通过练习此类题目,不仅可以提升Python编程技巧,还能锻炼解决问题的能力和逻辑思维能力,为未来参加类似的编程竞赛做好准备。

    php-leetcode题解之全排列.zip

    在IT领域,尤其是在编程和算法解决方面,LeetCode是一个非常受欢迎的在线平台,它提供了大量的编程挑战题目,帮助开发者提升技能并准备面试。本压缩包“php-leetcode题解之全排列.zip”聚焦于使用PHP语言解决...

    C语言入门-leetcode练习之第46题全排列.zip

    这道题目要求我们列出所有可能的排列组合,给定一个没有重复数字的数组。全排列问题通常使用回溯法来解决,这是一种在搜索树或图中寻找解决方案的有效方法,当遇到无效的路径时,会退回一步以尝试其他可能的路径。 ...

    c++递归/递推经典题目

    这里是本蒟蒻整理/写的递归递推经典题目 上传供大家学习使用 包含:过河卒、过河卒升级版、汉诺塔、级数求和、勒让德多项式、流感传染、判断回文、判断元素是否存在、平方根级数、平面分割升级版、全排列递归版、...

Global site tag (gtag.js) - Google Analytics