A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zczcyc0201 中级黑马   /  2012-10-11 15:02  /  5127 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

数字序列“123456”,输出它们所有的排列组合

求一个简单易懂的代码 要说明思路

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 神马都是浮云

查看全部评分

11 个回复

正序浏览
谭立文 发表于 2012-10-11 17:42
现在大三啊、

那木有办法了,呵呵
回复 使用道具 举报
刘蕴学 发表于 2012-10-11 17:30
你咋会没进来。。。。

现在大三啊、
回复 使用道具 举报
谭立文 发表于 2012-10-11 16:30
package com.wenfengkeji.heima;

public class Demo17 {

你咋会没进来。。。。
回复 使用道具 举报
这个都要用到迭代函数。
回复 使用道具 举报
谭立文 发表于 2012-10-11 16:30
package com.wenfengkeji.heima;

public class Demo17 {
  1. public class Demo17 {
  2.         public static void perm(char[] a, int k, int n) {
  3.                 int i;
  4.                 if (k == n - 1) {
  5.                         for (i = 0; i < n; i++)
  6.                                 System.out.print(a[i] + " ");
  7.                         System.out.println();
  8.                 } else {
  9.                         perm(a, k + 1, n);
  10.                         for (i = k + 1; i < n; i++) {
  11.                                 a[i] ^= a[k] ^ (a[k] = a[i]);
  12.                                 perm(a, k + 1, n);
  13.                                 a[i] ^= a[k] ^ (a[k] = a[i]);
  14.                         }
  15.                 }
  16.         }

  17.         public static void main(String[] args) {
  18.                 char ch[] = { '6', '7', '9', '5' };
  19.                 perm(ch, 0, ch.length);
  20.         }
  21. }
复制代码
呵呵……牛,给你个建议你看看改成这样如何

评分

参与人数 1黑马币 +3 收起 理由
唐志兵 + 3 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 唐增友 于 2012-10-11 16:55 编辑
  1. import java.util.ArrayList;
  2. import java.util.List;

  3. public class GetString {

  4.         /**
  5.          * @param args
  6.          */
  7.         public static void main(String[] args) {
  8.                 //把 str 改成 123456 就是你要的结果了
  9.                 String str="123";
  10.                 char c[]=str.toCharArray();
  11.                 //待取出的数据集
  12.                 List<String> src=new ArrayList<String>();
  13.                 //储存取出数据的结果集
  14.                 List<String> obj=new ArrayList<String>();
  15.                 for(int i=0;i<c.length;i++){
  16.                         src.add(String.valueOf(c[i]));
  17.                         obj.add(String.valueOf(0));
  18.                 }
  19.                
  20.                 //采用递归的方式
  21.                 getChar(src, obj, src.size());
  22.                

  23.         }
  24.         
  25.         public static void getChar(List<String> src,List<String> obj,int length){;
  26.                 //如果 待取出的数据集中有数据 继续填充 否则打印 结果集
  27.                 if(src.size()>0){
  28.                         for(int i=0;i<src.size();i++){
  29.                                 obj.set(length-src.size(),src.get(i));
  30.                                 
  31.                                 //定义临时变量 传递给下一次 调用
  32.                                 List<String> tmpsrc=new ArrayList<String>();
  33.                                 for(int k=0;k<src.size();k++){
  34.                                         tmpsrc.add(src.get(k));
  35.                                 }
  36.                                 //移除已经使用的元素
  37.                                 tmpsrc.remove(i);
  38.                                 
  39.                                 //定义临时变量 传递给下一次 调用
  40.                                 List<String> tmpobj=new ArrayList<String>();
  41.                                 for(int k=0;k<obj.size();k++){
  42.                                         tmpobj.add(obj.get(k));
  43.                                 }
  44.                                 //递归 直到src 中没有数据
  45.                                 getChar(tmpsrc, tmpobj, length);
  46.                         }        
  47.                 }else{
  48.                         System.out.println(obj);
  49.                 }
  50.                
  51.         }

  52. }
复制代码
结果:[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
package com.wenfengkeji.heima;

public class Demo17 {
        public static void perm(char[] a,int k,int n)
        {
                int i;
                if(k == n-1)
                {
                        for(i=0;i<n;i++)
                                System.out.print(a[i] + " ");
                        System.out.println();
                }
                else
                {
                        for(i=k;i<n;i++)
                        {
                                char temp;
                                temp=a[k];
                                a[k]=a[i];
                                a[i]=temp;
                                perm(a,k+1,n);
                                temp=a[k];
                                a[k]=a[i];
                                a[i]=temp;
                        }
                }
        }
        public static void main(String[] args) {
                char ch[]={'1','2','3','4','5','6'};
                perm(ch,0,ch.length);
        }
}

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  1. public class Rank {
  2.         public static void main(String[] args) {
  3.                 int[] array = { 7, 9, 5, 8 };// 初始化一个由多个数组成的序列
  4.                 boolean[] isSelected = new boolean[array.length];// 为每一个数指定一个标志,标志这个数是否在已经在新的序列中
  5.                 int[] array2 = new int[array.length];// 新的组合序列
  6.                 for (int i = 0; i < isSelected.length; i++) {
  7.                         isSelected[i] = false;// 每个数所对应的标志初始化为false
  8.                 }
  9.                 rankArray(array, isSelected, array2, 0);
  10.         }

  11.         public static void rankArray(int[] array, boolean[] isSelected,
  12.                         int[] array2, int length) {

  13.                 if (array.length == length) {
  14.                         /* 如果初化序列中的数全部排入了新的组合序列中就将它们全部打印出来 */
  15.                         for (int i : array2) {
  16.                                 System.out.print(i + ",");
  17.                         }
  18.                         System.out.println();
  19.                         return;
  20.                 }
  21.                 for (int i = 0; i < isSelected.length; i++) {
  22.                         if (isSelected[i]) {
  23.                                 continue;// 初始序列中的数已经排入了当前这个正在排的新组合序列中,就去找下一个数
  24.                         }
  25.                         isSelected[i] = true;// 找到这个未排入当前正在排的新序列中的数后就将与这个数所对应的标志改为true
  26.                         array2[length] = array[i];// 将这个数排入当前现在排的序列中
  27.                         rankArray(array, isSelected, array2, length + 1);// 递归,排下一个数
  28.                         isSelected[i] = false;// 每一次递归结束就得到一个新的序列,然后又开始排第二个新的序列,所以它们的标志又改为false
  29.                 }
  30.         }
  31. }
复制代码
面试宝典我还没看的,不晓得我这个算法和里面的哪个更让人懂
以前在14期别人也问了这样的问题的,当时编了没写注释就贴上去了,今天就把注释加上了

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
Jordon 发表于 2012-10-11 15:18
因为不方便写代码,我只说一下我的理解:每个数字相当于一个坑,即有六个坑,每个坑里每次放一个数字,但不 ...

那怎么保证放六次 每次放的都不一样 而且后面的坑不会和前面的重复呢
回复 使用道具 举报
因为不方便写代码,我只说一下我的理解:每个数字相当于一个坑,即有六个坑,每个坑里每次放一个数字,但不能重复。也就是每个坑里放六次数字,放完了就排完了。
回复 使用道具 举报
面试宝典那个代码没看懂啊 主要是不懂思路 求高手解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马