CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

一著名软件公司的java笔试算法题!

楼主javaliu2006()2006-10-09 09:01:53 在 Java / J2SE / 基础类 提问

一著名软件公司的java笔试算法题!  
   
  算法程序题:  
   
          该公司笔试题就1个,要求在10分钟内作完。  
   
          题目如下:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。 问题点数:10、回复次数:123Top

1 楼buyaowen(失业中,请勿打扰)回复于 2006-10-09 09:28:32 得分 0

题目如下:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。  
  =======================================================================  
  412345???Top

2 楼haisenmai(我应该做得到)回复于 2006-10-09 09:36:43 得分 0

10minutes   not   enoughTop

3 楼zsh6709(世界上没有后悔药吃的!!!)回复于 2006-10-09 10:19:39 得分 0

10分钟够的  
  用数组来做,我觉得  
  可能有点笨吧!!  
  如果需要我就把代码写出来Top

4 楼arbiter(同济流氓)回复于 2006-10-09 10:34:39 得分 0

有一个思路是建一个6个结点的图,每个结点代表一个数字,然后标记上两两结点的关系(是否有向),随后深度遍历,或广度遍历图,找出结点的所有走向路径,就是最后的所有排列了,如果没有准备10分钟肯定不够。Top

5 楼Rayuu()回复于 2006-10-09 10:44:52 得分 0

学习!谁能给出个参考代码?Top

6 楼javaliu2006()回复于 2006-10-09 10:45:10 得分 0

zsh6709(世界上没有后悔药吃的!!!)    
   
  你把代码写出来贴后面,让大家看看Top

7 楼twomao(2毛)回复于 2006-10-09 11:05:48 得分 0

先得到所有的排列组合,再用正则表达式去掉不匹配的数字..Top

8 楼likespring1()回复于 2006-10-09 11:06:06 得分 5

int[]   position1   =   new   int{1、2、2、3、4、5};  
  int[]   position2   =   new   int{1、2、2、3、4、5};  
  int[]   position3   =   new   int{1、2、2、3、4、5};  
  int[]   position4   =   new   int{1、2、2、3、4、5};  
  int[]   position5   =   new   int{1、2、2、3、4、5};  
  String   tempstring   =   null;  
  int   index=   -1;  
  for   (int   i1=0;i1<6;i1++){  
        for   (int   i2=0;i2<6;i2++){  
                if   (i2==i1)    
                        break;  
                for   (int   i3=0;i3<6;i3++){  
                          if   (i3==i1   ||   i3==i2   )    
                                break;  
                          if   (i3==2)  
                                break;  
                            for   (int   i4=0;i4<6;i4++){  
                                  if   (i4==i1   ||   i4==i2   ||   i4==i3)    
                                      break;  
                                      for   (int   i5=0;i5<6;i5++){  
                                          if   (i5==i1   ||   i5==i2   ||   i5==i3   ||   i5==i4   )    
                                                break;  
  tempstring   =""+position1[i1]+position2[i2]+position3[i3]+position4[i4]+position4[i4];  
  if   ((index=tempstring.indexof("3"))   ){  
            if   (tempstring.subString(index+1,index+2).equals("5"))  
            break;  
   
  }  
  if   ((index=tempstring.indexof("5"))   ){  
            if   (tempstring.subString(index+1,index+2).equals("3"))  
            break;  
   
  }  
                                                System.err.println(position1[i1]+position2[i2]+position3[i3]+position4[i4]+position4[i4])  
                                      }  
                            }  
                  }            
        }  
  }Top

9 楼alienyang()回复于 2006-10-09 11:10:31 得分 0

学习Top

10 楼netstu(孤心)回复于 2006-10-09 11:16:36 得分 0

不错Top

11 楼ChDw(米)回复于 2006-10-09 11:16:41 得分 5

private   int[]   num   =   new   int[]{1,2,2,3,4,5};  
  private   boolean[]   selected   =   null;  
  public   static   void   main(String[]   args)   throws   Exception   {  
  new   Test().test();  
  }  
  private   void   test()   {  
  selected   =   new   boolean[num.length];  
  List<Integer>   result   =   new   ArrayList<Integer>();  
  next(result);  
  }  
   
  private   void   next(List<Integer>   result)   {  
  if(result.size()   ==   num.length)  
  printResult(result);  
  else   {  
  for(int   i   =   0;   i   <   num.length;   i++)   {  
  if(!selected[i])   {  
  selected[i]   =   true;  
  result.add(num[i]);  
  next(result);  
  result.remove(result.size()   -   1);  
  selected[i]   =   false;  
  }  
  }  
  }  
  }  
  private   void   printResult(List<Integer>   result)   {  
  if(result.get(2).intValue()   !=   4)   {  
  for(int   i   =   1;   i   <   result.size();   i++)  
  if(result.get(i   -   1).intValue()   ==   3   &&   result.get(i).intValue()   ==   5)  
  return;  
  for(int   i   =   0;   i   <   result.size();   i++)  
  System.out.print(result.get(i));  
  System.out.println();  
  }  
  }  
  Top

12 楼inorro()回复于 2006-10-09 11:32:04 得分 0

强Top

13 楼likespring1()回复于 2006-10-09 11:42:09 得分 0

楼上不对!  
  如果有两个2你怎么处理Top

14 楼ChDw(米)回复于 2006-10-09 12:01:28 得分 0

所以我使用selected数组,这个selected表示这个元素是否已经选择过而并不使用list中是否contains方法Top

15 楼ChDw(米)回复于 2006-10-09 12:02:19 得分 0

去除重复是有点问题Top

16 楼javaliu2006()回复于 2006-10-09 12:05:17 得分 0

一软件公司笔试题  
   
   
  编程能力测试    
   
  1.     将40个随机数据写入数据库,并按时间编排好,  
   
  2.     将上述数据在另一台计算机中实时浏览,  
   
  3.数据库可以是任意形式的数据库,浏览界面可以自由设定。  
   
  Top

17 楼wei_x1980(牛,這不是一個"強"字能說清的)回复于 2006-10-09 12:22:38 得分 0

学习中Top

18 楼do_the_best(近我者赤)回复于 2006-10-09 13:24:37 得分 0

作为笔试题有点难,算法上出现考虑不周的地方的概率比较大。  
  要是上机考就比较好了。Top

19 楼solid210()回复于 2006-10-09 14:42:52 得分 0

哪来的两个4呢?如果两个4可以,那6个4可以不?  
  要是可以,对6位循环输入就成了,仅仅判断第三位不等于4,3和5不相邻就可以了.  
   
   
  public   class   Test03   {  
   
  public   static   void   main(String[]   args)   {  
  //   TODO   Auto-generated   method   stub  
  for(int   i   =   1   ;   i   <=   5   ;   i++){  
  for(int   j   =   1   ;   j   <=   5   ;   j++){  
  if(i==5&&j==3)  
  continue   ;  
  if(i==3&&j==5)  
  continue   ;  
  for(int   k   =   1   ;   k   <=   5   ;   k++){  
  if(k==5&&j==3)  
  continue   ;  
  if(k==3)  
  continue   ;  
  for(int   m   =   1   ;   m   <=   5   ;   m++){  
  if(k==5&&m==3)  
  continue   ;  
  for(int   n   =   1   ;   n   <=   5   ;   n++){  
  if(m==5&&n==3)  
  continue   ;  
  if(m==3&&n==5)  
  continue   ;  
  for(int   p   =   1   ;   p   <=   5   ;   p++){  
  if(p==5&&n==3)  
  continue   ;  
  if(p==3&&n==5)  
  continue   ;  
  System.out.println(i+""+j+""+k+""+m+""+n+""+p)   ;  
  }  
  }  
  }  
  }  
  }  
  }  
  }  
   
  }  
   
   
  以上代码满足:"4"不能在第三位,"3"与"5"不能相连.但是没有去除重复  
  最后一个数字是555555,哈哈Top

20 楼wangyan8576(一米宽的信仰)回复于 2006-10-09 14:44:33 得分 0

以前好象在一本C的书上看过,那是用递归实现的,怎么做的就忘了,当时没怎么理解  
  Top

21 楼yyfhz(火山)回复于 2006-10-09 14:52:39 得分 0

写个思路  
  int   soruce_value[]   =   {1,2,2,3,4,5}  
  如果没有重复值的话,直接一个6重循环就可以了,但是数组有重复元素。  
  这就可能出现数字的重复。  
  对于这道题目,我们可以把它看做先拼不重复的五位数,然后再对每一种拼法,在第一个"2"后面再插入第2个"2"。  
  ---------------------------------------------------  
  这当然只是针对这道题目的做法。一般的,对于一个长度为n的数组a={ai,   i=1,2,...n},假设它包含m个不同的元素,我们可以把它看做是下列2个数组的联合:  
  A={ai,i=1,...,m}--   代表a中各个不同的元素  
  B={bi,i=1,...,m}--   代表A[i]出现的次数。  
  那么拼接的方式可以是:  
  step   1.利用m个不同的元素,拼接出数据B=a1',a2',...am'  
  step   2.  
          While   B的长度<n   {    
                (for   i=1;   i<=m;   i++)   {  
                      如果bi>1,在B的最后一个ai后,再插入一个ai,bi=bi-1  
                }  
          }  
  为了实现这种做法,应当会使用到嵌套函数的调用。Top

22 楼FreeSeagull(蓝天,白云,松花江)回复于 2006-10-09 15:01:21 得分 0

《TAOCP》第一章讲有讲这个。叫做Permutation.  
  具体算法基本的有三种,参看  
  http://www.cut-the-knot.org/do_you_know/AllPerm.shtmlTop

23 楼jk88811(你的就是我的,我的还是我的~!)回复于 2006-10-09 15:07:40 得分 0

汗,   搬出<TAOCP>来了...Top

24 楼shuyanbo(楚国壮士)回复于 2006-10-09 16:07:01 得分 0

这个题目出的好像不太严谨,    
   
  题目如下:用     [1、2、2、3、4、5这六个数字]     ,用java写一个main函数,打印出所有不同的排列,如:[512234、412345]   等,要求:"4"不能在第三位,"3"与"5"不能相连。  
   
  如果是全排列,   应该是数字不能有重复,   我猜想题目应该是:   用1-6六个数字,   写函数打印所有全排列,要求是:   4不能在第三位,3与5不能相连.  
   
  这个用图的遍历应该很简单吧,遍历的过程中加上条件即可.Top

25 楼fdlm_dark()回复于 2006-10-09 16:16:17 得分 0

http://community.csdn.net/Expert/topic/5068/5068524.xml?temp=.2967188  
   
  发两个怎么。。。Top

26 楼joylisten(浩渺)回复于 2006-10-09 16:17:42 得分 0

10分钟我写不出来,半小时将将够Top

27 楼wuhuiITren(乌龟)回复于 2006-10-09 19:00:00 得分 0

顶Top

28 楼fifadxj(坦克车)回复于 2006-10-09 19:22:13 得分 0

哎。。用了1个半小时。。  
   
   
  package   test;  
   
  import   java.util.ArrayList;  
  import   java.util.List;  
   
  import   javax.swing.JFrame;  
   
  public   class   test   extends   JFrame   {  
          public   static   void   main(String[]   arsg)   {          
                  List   results   =   new   ArrayList();  
                  String[]   nums   =   new   String[]{"1","2","2","3","4","5"};  
                  boolean[]   used   =   new   boolean[]{false,false,false,false,false,false};  
                  String   cur   =   "";  
                  int   i1,i2,i3,i4,i5,i6=0;  
                  for   (i1   =   0;   i1   <   nums.length;   i1++)   {  
                          if   (used[i1]   ==   true)   continue;  
                          used[i1]   =   true;  
                          for   (i2   =   0;   i2   <   nums.length;   i2++)   {  
                                  if   (used[i2]   ==   true)   continue;  
                                  used[i2]   =   true;  
                                  for   (i3   =   0;   i3   <   nums.length;   i3++)   {  
                                          if   (used[i3]   ==   true)   continue;  
                                          used[i3]   =   true;  
                                          for   (i4   =   0;   i4   <   nums.length;   i4++)   {  
                                                  if   (used[i4]   ==   true)   continue;  
                                                  used[i4]   =   true;  
                                                  for   (i5   =   0;   i5   <   nums.length;   i5++)   {  
                                                          if   (used[i5]   ==   true)   continue;  
                                                          used[i5]   =   true;  
                                                          for   (i6   =   0;   i6   <   nums.length;   i6++)   {  
                                                                  if   (used[i6]   ==   true)   {  
                                                                          continue;  
                                                                  }  
                                                                  used[i6]   =   true;  
                                                                  cur   =   nums[i1]+nums[i2]+nums[i3]+nums[i4]+nums[i5]+nums[i6];  
                                                                  if   (check(cur)   ==   true)   {  
                                                                          if   (!results.contains(cur))   {  
                                                                                  System.out.println(cur);  
                                                                                  results.add(cur);  
                                                                          }  
                                                                  }  
                                                                  used[i6]   =   false;  
                                                          }used[i5]   =   false;  
                                                  }used[i4]   =   false;  
                                          }used[i3]   =   false;  
                                  }used[i2]   =   false;  
                          }used[i1]   =   false;  
                  }  
                  System.out.println("count:   "+results.size());  
          }  
   
          public   static   boolean   check(String   s)   {  
                  if   (s.substring(2,3).equals("4"))   return   false;  
                  if   (s.substring(0,2).equals("35")   ||   s.substring(0,2).equals("53"))   return   false;  
                  if   (s.substring(1,3).equals("35")   ||   s.substring(1,3).equals("53"))   return   false;  
                  if   (s.substring(2,4).equals("35")   ||   s.substring(2,4).equals("53"))   return   false;  
                  if   (s.substring(3,5).equals("35")   ||   s.substring(3,5).equals("53"))   return   false;  
                  if   (s.substring(4,6).equals("35")   ||   s.substring(4,6).equals("53"))   return   false;  
                  return   true;  
          }  
   
  }  
   
   
   
   
  Top

29 楼fifadxj(坦克车)回复于 2006-10-09 19:22:42 得分 0

198种Top

30 楼changchunren520()回复于 2006-10-09 21:54:20 得分 0

帮顶下。请问各位大侠   for循环怎样才能运用自如。我能看懂。但是却写不出来。。Top

31 楼z_love()回复于 2006-10-09 22:03:25 得分 0

顶以下  
  太强了  
  什么时候能达到你这种程度呀!  
  你学了多长时间了!  
  羡慕呀!  
  该学习!!!!Top

32 楼maque83()回复于 2006-10-09 22:48:45 得分 0

头晕Top

33 楼zhuixun5506(>> narsil)回复于 2006-10-09 23:16:55 得分 0

markTop

34 楼arbiter(同济流氓)回复于 2006-10-10 10:39:47 得分 0

看见大家循环套循环,圈圈套圈圈的写法,我实在是忍无可忍了,6个数字还好,给你一百个数字,是不是准备百环大作战了?  
  我来实现一下我之前讲的基本思路:  
  1   把问题归结为图结构的遍历问题。实际上6个数字就是六个结点,把六个结点连接成无向连通图,对于每一个结点求这个图形的遍历路径,所有结点的遍历路径就是最后对这6个数字的排列组合结果集。  
  2   显然这个结果集还未达到题目的要求。从以下几个方面考虑:  
      1.   3,5不能相连:实际要求这个连通图的结点3,5之间不能连通,   可在构造图结构时就满足改条件,然后再遍历图。  
      2.   不能有重复:   考虑到有两个2,明显会存在重复结果,可以把结果集放在TreeSet中过滤重复结果  
      3.   4不能在第三位:   仍旧在结果集中去除满足此条件的结果。  
   
  采用二维数组定义图结构,最后的代码是:  
   
  import   java.util.Iterator;  
  import   java.util.TreeSet;  
   
  public   class   TestQuestion   {  
   
  private   String[]   b   =   new   String[]{"1",   "2",   "2",   "3",   "4",   "5"};  
  private   int   n   =   b.length;  
  private   boolean[]   visited   =   new   boolean[n];  
  private   int[][]   a   =   new   int[n][n];  
  private   String   result   =   "";  
  private   TreeSet   set   =   new   TreeSet();  
   
  public   static   void   main(String[]   args)   {  
  new   TestQuestion().start();  
  }  
   
  private   void   start()   {  
   
  //   Initial   the   map   a[][]  
  for   (int   i   =   0;   i   <   n;   i++)   {  
  for   (int   j   =   0;   j   <   n;   j++)   {  
  if   (i   ==   j)   {  
  a[i][j]   =   0;  
  }   else   {  
          a[i][j]   =   1;  
  }  
  }  
  }  
   
  //   3   and   5   can   not   be   the   neighbor.  
  a[3][5]   =   0;  
  a[5][3]   =   0;  
   
  //   Begin   to   depth search.  
  for   (int   i   =   0;   i   <   n;   i++)   {  
          this.depthFirstSearch(i);  
  }  
   
  //   Print   result   treeset.  
  Iterator   it   =   set.iterator();  
  while   (it.hasNext())   {  
  String   string   =   (String)   it.next();  
  //   "4"   can   not   be   the   third   position.  
  if   (string.indexOf("4")   !=   2)   {  
  System.out.println(string);  
  }  
  }  
  }  
   
  private   void   depthFirstSearch(int   startIndex)   {  
  visited[startIndex]   =   true;  
  result   =   result   +   b[startIndex];  
  if   (result.length()   ==   n)   {  
  //   Filt   the   duplicate   value.  
  set.add(result);  
  }  
  for(int   j   =   0;   j   <   n;   j++)   {  
  if   (a[startIndex][j]   ==   1   &&   visited[j]   ==   false)   {  
  depthFirstSearch(j);  
  }   else   {  
  continue;  
  }  
  }  
   
  //   restore   the   result   value   and   visited   value   after   listing   a   node.  
          result   =   result.substring(0,   result.length()   -1);  
          visited[startIndex]   =   false;  
  }  
  }  
   
  可以结贴了。Top

35 楼mahaixing(猪的克星)回复于 2006-10-10 11:59:17 得分 0

不就是一个排列组合嘛,搞那么复杂干吗!  
  package   com.mahaixing;  
   
   
  public   class   Permute   {  
   
  private   int[]   temp;  
  private   boolean[]   used;  
  private   int[]   array;  
  public   int   count   =   0;  
   
  private   void   printArray()   {  
  for   (int   i   =   0;   i   <   temp.length;   i++)   {  
  System.out.print(temp[i]);  
  }  
  System.out.println();  
  }  
   
  private   void   permuteInternal(int   pos)   {  
   
  if   (pos   ==   array.length)   {  
  count   ++;  
  printArray();  
  return;  
  }  
   
  for   (int   i   =   0;   i   <   array.length;   i++)   {  
   
  if   (used[i])    
  continue;  
   
  used[i]   =   true;  
  if   ((pos   ==   3)   &&   (array[i]   ==   4))   {  
  used[i]   =   false;  
  continue;  
  }  
   
  if   (pos   >   0)   {  
  if   ((temp[pos   -   1]   ==   5)   &&   (array[i]   ==   3))   {  
  used[i]   =   false;  
  continue;  
  }  
   
  if   ((temp[pos   -   1]   ==   3)   &&   (array[i]   ==   5))   {  
  used[i]   =   false;  
  continue;  
  }  
  }  
  temp[pos]   =   array[i];  
   
  permuteInternal(pos+1);  
  used[i]   =   false;  
  }  
   
  }  
   
  public   void   permute(int[]   array)   {  
   
  this.temp   =   new   int[array.length];  
  this.used   =   new   boolean[array.length];  
  this.array   =   array;  
  permuteInternal(0);  
   
  }  
   
  public   static   void   main(String   args[])   {  
   
  int[]   numbers   =   {1,   2,   3,   4,   5,   6};  
  Permute   ng   =   new   Permute();  
  ng.permute(numbers);  
  System.out.println("共有:"   +   ng.count   +   "   种排列");  
   
  }  
  }Top

36 楼arbiter(同济流氓)回复于 2006-10-10 13:57:14 得分 0

你写的不复杂?而且还算错了。重复结果算进去干吗?重写吧Top

37 楼horse_h(小马)回复于 2006-10-10 16:25:04 得分 0

学习Top

38 楼zhuang_zi(庄子)回复于 2006-10-10 16:50:04 得分 0

import   java.util.ArrayList;  
  import   java.util.Iterator;  
   
  public   class   Test   {  
   
  /**  
    *   @param   args  
    */  
  public   static   void   main(String[]   args)   {  
  Test   test   =   new   Test();  
  int[]   data   =   {   1,   2,   2,   3,   4,   5   };  
  ArrayList   result   =   new   ArrayList();  
  int   startPoint   =   0;  
  test.returnArrange(data,   startPoint,   result);  
  Iterator   it   =   result.iterator();  
  System.out.println("ArraySizeBefore="   +   result.size());  
  while   (it.hasNext())   {  
  int[]   dataMe   =   (int[])   it.next();  
  test.printArray(dataMe);  
  }  
  result   =   test.filter(result);  
  it   =   result.iterator();  
  System.out.println("ArraySizeAfterFitler="   +   result.size());  
  while   (it.hasNext())   {  
  int[]   dataMe   =   (int[])   it.next();  
  test.printArray(dataMe);  
  }  
  }  
   
  public   ArrayList   getResult(int[]   data)   {  
  ArrayList   result   =   new   ArrayList();  
  int   startPoint   =   0;  
  returnArrange(data,   startPoint,   result);  
  result   =   filter(result);  
  return   result;  
  }  
   
  private   ArrayList   filter(ArrayList   result)   {  
  ArrayList   resultList   =   new   ArrayList();  
  Iterator   it   =   result.iterator();  
  while   (it.hasNext())   {  
  int[]   dataMe   =   (int[])   it.next();  
  if   (isOK(dataMe))   {  
  resultList.add(dataMe);  
  }  
  }  
  return   resultList;  
  }  
   
  private   boolean   isOK(int[]   data)   {  
  return   data[2]   !=   4   &&   checkConnection(data);  
  }  
   
  private   boolean   checkConnection(int[]   data)   {  
  boolean   result   =   true;  
  for   (int   i   =   0;   i   <   data.length   -   1;   i++)   {  
  if   ((data[i]   ==   3   &&   data[i   +   1]   ==   5)  
  ||   (data[i]   ==   5   &&   data[i   +   1]   ==   3))  
  return   false;  
  }  
  return   result;  
  }  
   
  private   void   printArray(int[]   data)   {  
  String   s   =   "";  
  for   (int   i   =   0;   i   <   data.length;   i++)   {  
  s   +=   ","+data[i]   ;  
  }  
  System.out.println(s.substring(1));  
  }  
   
  private   void   returnArrange(int[]   data,   int   startPoint,   ArrayList   resultList)   {  
  int   currentStart   =   startPoint;  
  if   (isDESC(data,   startPoint))   {  
  resultList.add(copyArray(data));  
  return;  
  }   else   {  
  returnArrange(data,   startPoint   +   1,   resultList);  
  for   (int   index   =   data.length   -   1;   index   >   startPoint;   index--)   {  
  if   (data[index]   >   data[startPoint])   {  
  int   anotherStartPoint   =   startPoint   +   1;  
  exchangeData(data,   index,   startPoint);  
  ascArrayByFrom(data,   anotherStartPoint);  
  returnArrange(data,   anotherStartPoint,   resultList);  
  }  
  }  
  }  
   
  }  
   
  private   void   exchangeData(int[]   data,   int   positionA,   int   positionB)   {  
  int   temp   =   data[positionA];  
  data[positionA]   =   data[positionB];  
  data[positionB]   =   temp;  
  }  
   
  private   int   findSmallerPositionBeforeCurrent(int[]   data,   int   current,  
  int   end)   {  
  int   i   =   -1;  
  int   currentNum   =   data[current];  
  for   (int   index   =   end;   index   >=   current;   index--)   {  
  if   (data[index]   >   currentNum)   {  
  return   index;  
  }  
  }  
  return   i;  
  }  
   
  private   int[]   copyArray(int[]   data)   {  
  int[]   copy   =   new   int[data.length];  
  for   (int   i   =   0;   i   <   data.length;   i++)   {  
  copy[i]   =   data[i];  
  }  
  return   copy;  
   
  }  
   
  private   boolean   isDESC(int[]   data,   int   index)   {  
  for   (int   i   =   index;   i   <   data.length;   i++)   {  
  int   tempMax   =   data[i];  
  for   (int   j   =   i   +   1;   j   <   data.length;   j++)   {  
  if   (data[j]   >   tempMax)   {  
  return   false;  
  }  
  }  
  }  
  return   true;  
  }  
   
  private   void   ascArrayByFrom(int[]   data,   int   index)   {  
  for   (int   i   =   index;   i   <   data.length;   i++)   {  
  int   tempMin   =   data[i];  
  for   (int   j   =   i   +   1;   j   <   data.length;   j++)   {  
  if   (data[j]   <   tempMin)   {  
  tempMin   =   data[j];  
  data[j]   =   data[i];  
  data[i]   =   tempMin;  
  }  
  }  
  }  
  }  
  }  
  Top

39 楼zhuang_zi(庄子)回复于 2006-10-10 16:50:45 得分 0

试试我这个,不对找我Top

40 楼zhuang_zi(庄子)回复于 2006-10-10 16:52:19 得分 0

核心都在returnArrange(),其余都是辅助.Top

41 楼xulipeng()回复于 2006-10-10 17:04:48 得分 0

我好象还没看明白题目  
   
  "写一个main函数"   是不是意味着不能用递归,更不能定义其它的类啊?Top

42 楼zhaoyiguo()回复于 2006-10-10 17:57:41 得分 0

arbiter(同济流氓)的那个思路才是王道~!!!  
  支持~!!!  
  ...   ...  
  ...  
  有点羞于启齿...  
  ...   可不可以把思路再讲解得详细一些?!  
  虽然看懂了,但是还没有开窍.  
  请务必帮忙.  
   
  弄清这道问题,将对我帮助很大.  
   
  有劳Top

43 楼arbiter(同济流氓)回复于 2006-10-10 18:13:58 得分 0

总算遇到知音了,哪里不清楚的,你可以说出来,我针对你的问题再回答。否则无的放式。  
  我可以再多说点:  
   
  3,5不能相连:实际要求这个连通图的结点3,5之间不能连通,   可在构造图结构时就满足改条件,然后再遍历图。  
    代码中请注意这几行:  
    //   3   and   5   can   not   be   the   neighbor.  
    a[3][5]   =   0;  
    a[5][3]   =   0;  
   
  只要这样定义图,根本不用在代码中写IF   ELSE语句。  
  实际上基于图的算法好处在于,只要你能定义好满足题目要求的图结构,遍历的结果就是你要的结果,不用任何对遍历结果做任何处理。包括本题中的:4不能在第三位置,3,5不能相连,唯一  
  性要求,其实都可以在体现在构造的图形结构里,然后直接遍历图取得自己要的结果。而不用再次处理结果集。  
   
  只是说这里实际上对其它要求要体现在图结构里有困难(理论上是可以的),但起码3,5不能相接是很好构造的,就是上面的代码段来解释的。  
   
  关于图形数据结构建议先看看数据结构的书,主要是将如何利用二维数组描述图结构,再看看图的深度遍历实现原理。最后再应用到这个问题上来,自然就不难明白了。Top

44 楼jacklondon(jacklondon)回复于 2006-10-10 18:26:19 得分 0

应该用递归。Top

45 楼Areslp(努力ING)回复于 2006-10-11 00:12:37 得分 0

markTop

46 楼zsh6709(世界上没有后悔药吃的!!!)回复于 2006-10-11 10:37:04 得分 0

都强啊  
  本来我以为10分钟可以搞定的,   结果编写出来后n多错误,看来一个小时也未必能搞定,关键是思想。  
   
  我觉得  
    arbiter(同济流氓)    
  的思想很好,以前学数据结构时没发现有那么大用处,现在总算知道一点了,看来数据结构不能丢~~~~~~~~~Top

47 楼tongor(秦唐人)回复于 2006-10-11 11:22:14 得分 0

可以用数学排列组合的算法实现Top

48 楼jacklondon(jacklondon)回复于 2006-10-11 12:33:42 得分 0

我说说我的思路,递归。  
  n   个数字求不重复的全排列。  
  第一个数字可以为这   n   个中的一个,拿出一个,求剩下   n-1   个全排列,拼接在第一个后面。将第一个数字轮换,重复以上操作。  
  Top

49 楼zhl0369(T_stone)回复于 2006-10-11 14:24:16 得分 0

半个小时  
  不过好像算法不怎么样,以前学的算法都忘光了!!  
   
   
  public   class   Temp   {  
   
  public   static   void   main(String[]   args)   {  
  //   TODO   Auto-generated   method   stub  
  int   count   =0;  
  int[]   a={1,2,2,3,4,5};  
  for(int   i0=0;i0<6;i0++)  
  for(int   i1=0;i1<6;i1++)  
  for(int   i2=0;i2<6;i2++)  
  for(int   i3=0;i3<6;i3++)  
  for(int   i4=0;i4<6;i4++)  
  for(int   i5=0;i5<6;i5++)  
  if(check(i0,i1,i2,i3,i4,i5)){  
  System.out.println(""+a[i0]+a[i1]+a[i2]+a[i3]+a[i4]+a[i5]);  
  count++;  
  }  
  System.out.println("总计:"+count);  
  }  
   
  public   static   boolean   check   (int   i0,int   i1,int   i2,int   i3,int   i4,int   i5){  
  if   (i0==i1||i0==i2||i0==i3||i0==i4||i0==i5||i1==i2||i1==i3||i1==i4||i1==i5||i2==i3||i2==i4||i2==i5||i3==i4||i3==i5||i4==i5)  
  return   false;  
  if(i2==4)  
  return   false;  
  if   ((i0==3&&i1==5)||(i1==3&&i2==5)||(i2==3&&i3==5)||(i3==3&&i4==5)||(i4==3&&i5==5))  
  return   false;  
  if   ((i0==5&&i1==3)||(i1==5&&i2==3)||(i2==5&&i3==3)||(i3==5&&i4==3)||(i4==5&&i5==3))  
  return   false;  
  int[]   b   =   {i0,i1,i2,i3,i4,i5};  
  int   start=0;  
  int   end=0;  
  for   (int   i=0;i<6;i++){  
  if   (b[i]==1)  
  start   =   i;  
  if(b[i]==2)  
  end   =i;  
  }  
  if(start<end)  
  return   false;  
  return   true;  
  }  
  }  
  Top

50 楼eric0et(战鸦十四号)回复于 2006-10-11 14:52:09 得分 0

题目如下:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。  
  -----------------------  
   
  1、2、2、3、4、5     6个数字能组出412345?  
   
  Top

51 楼liuzhiyuan()回复于 2006-10-11 17:19:45 得分 0

需要考虑一下,关注可读性强的答案,呵呵Top

52 楼mahaixing(猪的克星)回复于 2006-10-17 10:58:46 得分 0

to:   arbiter(同济流氓)    
  刚才运行了一下你的程序,好像你的有重复吧。  
   
  头3个结果:  
  122345  
  122543  
  123245  
   
  最后3个结果  
  543122  
  543212  
  543221Top

53 楼arbiter(同济流氓)回复于 2006-10-17 15:00:43 得分 0

好几个算法都算出参考答案是   198   了。  
   
  你给头三个,最后三个,哪两个重了?Top

54 楼vulner(猪猪)回复于 2006-10-17 15:30:22 得分 0

笨笨的硬写一个:结果好像有198个.  
  public   static   void   main(String   args[])   {  
          int[]   a   =   new   int[6];  
          int[]   b   =   new   int[6];  
          int   total   =   0;  
          outer:for   (int   i   =   122345;   i   <=   543221;   i++)   {  
              for   (int   k   =   0;   k   <   b.length;   k++)   {  
                  b[k]   =   0;  
              }  
              a[0]   =   i   /   100000;  
              a[1]   =   i   /   10000   -   i   /   100000   *   10;  
              a[2]   =   i   /   1000   -   i   /   10000   *   10;  
              a[3]   =   i   /   100   -   i   /   1000   *   10;  
              a[4]   =   i   /   10   -   i   /   100   *   10;  
              a[5]   =   i   /   1   -   i   /   10   *   10;  
              if   (a[2]   ==   4)  
                  continue   outer;  
              for   (int   j   =   0;   j   <   a.length;   j++)   {  
                  if   (a[j]   >   5)  
                      continue   outer;  
                  if   (a[j]   ==   3)   {  
                      if   (j   !=   5   &&   a[j   +   1]   ==   5)  
                          continue   outer;  
                      if   (j   !=   0   &&   a[j   -   1]   ==   5)  
                          continue   outer;  
                  }  
                  switch   (a[j])   {  
                  case   1:  
                      b[1]++;  
                      break;  
                  case   2:  
                      b[2]++;  
                      break;  
                  case   3:  
                      b[3]++;  
                      break;  
                  case   4:  
                      b[4]++;  
                      break;  
                  case   5:  
                      b[5]++;  
                      break;  
                  }  
              }  
              if   (b[0]   ==   0   &&   b[1]   ==   1   &&   b[2]   ==   2   &&   b[3]   ==   1   &&   b[4]   ==   1   &&  
                      b[5]   ==   1)   {  
                  total++;  
                  System.out.println(i);  
              }  
          }  
          System.out.println("total="   +   total);  
      }Top

55 楼seeing2000(飞扬的秋)回复于 2006-10-17 15:56:24 得分 0

各位看下我的程序,应该没问题了:  
  /**  
    *   (c)   2006   Siemens   AG  
    *    
    *   Project         Corba   3GPP   North-Bound   Interface   Agent  
    *   Subproject   test  
    *   File               proTest.java  
    *   Created   on   Oct   17,   2006   by   CN1SY082.   (TODO   check   user   name)  
    *    
    *   History:  
    *   Date(Y.M.D)   User                       Reason   (plus   CR,   LM,   Fault   number)  
    *  
    */  
   
  package   test1;  
   
  import   java.awt.List;  
   
  public   class   proTest   {  
          private   static   int[]   num   =   new   int[]{1,2,2,3,4,5};  
           
          private   static   int   MAX   =   num.length;  
   
          private   static   boolean   state[]   =   new   boolean[MAX   +   1];  
   
          private   static   int   item[]   =   new   int[MAX   +   1];  
           
          static   List   numList   =   new   List();  
           
          public   static   void   proNum(){  
                  String   tempNum   =   "";//store   the   num   String  
                  int   tempIndex   =   0;  
                   
                  DoPermutation(1);  
                   
                  removeNum(numList);  
                   
          }  
           
          public   static   void   DoPermutation(int   pos)   {  
                  String   tt   =   "";  
                  if   (pos   >   MAX)   {  
                          for   (int   j   =   1;   j   <=   MAX;   j++){  
                                  tt   =   tt.concat(String.valueOf(num[item[j]-1]));  
                          }  
                           
                          boolean   reComp   =   compareBefor(tt,numList);  
                           
                          if(reComp   ==   true){  
                                  System.out.println("there   is   the   same   elements   :   "   +   tt);  
                          }else{  
                                  numList.add(tt);  
                          }  
                           
                          return;  
                  }  
                  for   (int   i   =   1;   i   <=   MAX;   i++)   {  
                          if   (!state[i])   {  
                                  state[i]   =   true;  
                                  item[pos]   =   i;  
                                  DoPermutation(pos   +   1);  
                                  state[i]   =   false;  
                          }  
                  }  
          }  
           
          public   static   boolean   compareBefor(String   temNum,List   temList){  
                  boolean   bol   =   false;//if   return   false   ,   then   there   are   no   same   String   ,   if   return   true   ,   then   there   is   the   same   String  
                   
                  for(int   i   =   0;   i   <   temList.countItems();   i++){  
                          String   getList   =   temList.getItem(i);  
                          if(getList.equalsIgnoreCase(temNum)){  
                                  bol   =   true;  
                          }else{  
                                  bol   =   false;  
                          }  
                  }  
                   
                  return   bol;  
          }  
           
          public   static   void   removeNum(List   listnum){  
                  int   i   =   0;  
                  for(;i<   listnum.countItems();   i++){  
                          String   sdd   =   listnum.getItem(i);  
                          if(String.valueOf(sdd.charAt(3)).equals("4")){  
                                  listnum.remove(i);  
                                  break;  
                          }else   if(sdd.contains("35")||sdd.contains("53")){  
                                  listnum.remove(i);  
                                  break;  
                          }else{  
                                  continue;  
                          }  
                  }  
                   
                  if(i<listnum.countItems()){  
                          removeNum(listnum);  
                  }else{  
                          numList   =   listnum;  
                  }  
          }  
   
          /**  
            *   @param   args  
            */  
          public   static   void   main(String[]   args)   {  
                  //   TODO   Auto-generated   method   stub  
                   
                  proNum();  
                  for(int   i   =   0   ;   i   <   numList.countItems();   i++){  
                          System.out.println(numList.getItem(i));  
                  }  
   
          }  
  }  
  /*   EOF   */Top

56 楼seeing2000(飞扬的秋)回复于 2006-10-17 16:06:02 得分 0

你们确定只有198个?我算的是386个Top

57 楼mahaixing(猪的克星)回复于 2006-10-17 16:56:38 得分 0

to:   arbiter(同济流氓)    
   
  抱歉,我弄错了。怪我没看清他的题目,没有考虑到重复的情况。结果应该是198个。Top

58 楼yanxiantong()回复于 2006-10-17 18:51:10 得分 0

vulner(猪猪)   我想对你说一个字"牛"!你的编程思想!简直是....Top

59 楼salia()回复于 2006-10-17 20:38:59 得分 0

package   yan;  
   
  public   class   RroTest   {  
   
  static   int   []   v={1,2,2,3,4,5};  
  static   void   check4(int   i){  
  if(v[i]==4){  
  //continue;  
  }  
  }  
  static   void   check35(int   i,   int   j){  
  if((v[i]==3   &   v[j]==5)||(v[i]==5   &   v[j]==3)   ){  
   
  }  
  }  
  public   static   void   main(String[]   args)   {  
  for(int   k1=0;   k1<6;   k1++){  
  int   b1=v[k1];  
  for(int   k2=0;   k2<6;   k2++){  
  if((v[k1]==3   &   v[k2]==5)||(v[k1]==5   &   v[k2]==3)   ){  
  continue;  
  }  
  int   b2=v[k2];  
  for(int   k3=0;   k3<6;   k3++){  
  if(v[k3]==4){  
  continue;  
  }  
  if((v[k2]==3   &   v[k3]==5)||(v[k2]==5   &   v[k3]==3)   ){  
  continue;  
  }  
  int   b3=v[k3];  
  for(int   k4=0;   k4<6;   k4++){  
  if((v[k3]==3   &   v[k4]==5)||(v[k3]==5   &   v[k4]==3)   ){  
  continue;  
  }  
  int   b4=v[k4];  
  for(int   k5=0;   k5<6;   k5++){  
  if((v[k4]==3   &   v[k5]==5)||(v[k4]==5   &   v[k5]==3)   ){  
  continue;  
  }  
  int   b5=v[k5];  
  for(int   k6=0;   k6<6;   k6++){  
  if((v[k5]==3   &   v[k6]==5)||(v[k5]==5   &   v[k6]==3)   ){  
  continue;  
  }  
  int   b6=v[k6];  
  System.out.println(""+b1+b2+b3+b4+b5+b6);  
  }  
  }  
  }  
  }  
  }  
  }  
   
  }  
  }  
  Top

60 楼blue_sky2008(IT->egg)回复于 2006-10-17 20:46:48 得分 0

都这么强啊  
  Top

61 楼salia()回复于 2006-10-17 20:47:43 得分 0

不好意思...重新发过:  
  按题目要求..我算到结果有:29358种...用了半个钟  
  package   yan;  
  public   class   RroTest   {  
      static   int   []   v={1,2,2,3,4,5};  
      public   static   void   main(String[]   args)   {  
  int   nunber=0;  
  for(int   k1=0;   k1<6;   k1++){  
        int   b1=v[k1];  
        for(int   k2=0;   k2<6;   k2++){  
  if((v[k1]==3   &   v[k2]==5)||(v[k1]==5   &   v[k2]==3)   ){continue;}  
  int   b2=v[k2];  
                for(int   k3=0;   k3<6;   k3++){  
  if(v[k3]==4){ continue;}  
  if((v[k2]==3   &   v[k3]==5)||(v[k2]==5   &   v[k3]==3)   ){continue;}  
  int   b3=v[k3];  
  for(int   k4=0;   k4<6;   k4++){  
  if((v[k3]==3   &   v[k4]==5)||(v[k3]==5   &   v[k4]==3)   ){continue;}  
  int   b4=v[k4];  
  for(int   k5=0;   k5<6;   k5++){  
  if((v[k4]==3   &   v[k5]==5)||(v[k4]==5   &   v[k5]==3)   ){continue;}  
  int   b5=v[k5];  
  for(int   k6=0;   k6<6;   k6++){  
  if((v[k5]==3   &   v[k6]==5)||(v[k5]==5   &   v[k6]==3)   ){continue;}  
  int   b6=v[k6];  
  nunber++;  
  System.out.println(""+nunber+"   :"+b1+b2+b3+b4+b5+b6);  
  }  
  }  
  }  
  }  
  }  
  }  
   
  }  
  }  
  Top

62 楼kymair(日向雏田)回复于 2006-10-17 21:21:41 得分 0

这下大家认识到数据结构课程的重要性了吧……  
   
  Top

63 楼green2008(开始8年抗战!)回复于 2006-10-17 21:25:36 得分 0

UPTop

64 楼zhangyuwei_(咸鱼)回复于 2006-10-18 01:24:21 得分 0

public   class   test  
  {  
  public   static   boolean   boo(int   i,int   j)  
  {  
  if(i==2   &&   j==4   ||   i==4   &&   j==2)  
  return   true;  
  return   false;  
  }  
  public   static   void   main(String[]   args)  
  {  
  String   str;  
  int[]   arr1={1,2,3,4,5};  
  int[]   arr2={1,2,3,4,5};  
  int[]   arr3={1,2,3,4,5};  
  int[]   arr4={1,2,3,4,5};  
  int[]   arr5={1,2,3,4,5};  
  for(int   i1=0;i1<5;i1++)  
  {  
  for(int   i2=0;i2<5;i2++)  
  {  
  if(boo(i1,i2))  
  continue;  
   
  for(int   i3=0;i3<5;i3++)  
  {  
  if(boo(i2,i3)   ||   i3==3)  
  continue;  
  for(int   i4=0;i4<5;i4++)  
  {  
  if(boo(i3,i4))  
  continue;  
  for(int   i5=0;i5<5;i5++)  
  {  
  if(boo(i4,i5))  
  continue;  
  str=arr1[i1]+""+arr2[i2]+""+arr3[i3]+""+arr4[i4]+""+arr5[i5];  
  System.out.println(str);  
  }  
  }  
  }  
  }  
  }  
  }  
  }  
  1780个结果,无重复  
  Top

65 楼flyineagle(纸上得来终觉浅,绝知此事要躬行)回复于 2006-10-18 01:51:02 得分 0

学习~~~~Top

66 楼vulner(猪猪)回复于 2006-10-18 13:33:33 得分 0

to:yanxiantong()    
   
  见笑,见笑:P,数据结构纯属是重修的补考过的,基本没什么概念,得系统的学习下了。Top

67 楼ak_2005(★★★★★)回复于 2006-10-18 13:53:10 得分 0

MARK   FIRSTTop

68 楼lgh2008(ar_guang)回复于 2006-10-18 14:29:33 得分 0

 
  to:   arbiter(同济流氓)   、  
          mahaixing(猪的克星)、  
          seeing2000(飞扬的秋)、  
          fifadxj(坦克车)、  
          vulner(猪猪)    
   
        请教一下,  
        你们的结果都不超过   300   个,   但我觉得结果应该会超过   400   个   ,   因为6个数的所有排列是:   720   个(   6   *   5   *   4   *   3   *   2   *   1   =   720   )   ,   去除少量不符合要求的(   应该不会超过   1/3   ),   应该会超过   400   个   。  
        不知我的分析对否,   请指正。    
         
     
  Top

69 楼arbiter(同济流氓)回复于 2006-10-18 14:37:11 得分 0

不要想当然,跑程序,看结果,再思考Top

70 楼lgh2008(ar_guang)回复于 2006-10-18 15:24:49 得分 0

 
  to:   arbiter(同济流氓)    
   
  我跑过上面的程序   ,我很佩服你们算法,但我总觉得结果会超过   198   个。Top

71 楼pirateRocy(海盗罗西)回复于 2006-10-18 16:59:02 得分 0

to:   arbiter(同济流氓)    
  想法不错,但是,个人认为,如果不是利用set来去处重复项,  
  就十全十美了。Top

72 楼cecoo(小风)回复于 2006-10-18 20:32:06 得分 0

到底谁强啊???  
  Top

73 楼zanbije()回复于 2006-10-18 21:05:51 得分 0

大家都好强.学习.Top

74 楼guzuoshantou(孤小小)回复于 2006-10-19 00:19:48 得分 0

下面是我以前所能研究出的最精简的序列算法(当然只是对于我来说,肯定还有比这更好的多的算法).我利用了递归算法,一个缺点是不能执行太多个数的序列,否则递归太深会抛出异常,但可以把递归改成for循环,就会避免这个问题,但因为我对递归比较着迷,所以就没去改.至于楼主说的那些不满足的条件,可以加个validate方法,在打印时验证一下即可.本人较懒所以没去做,只是研究算法而已,那些附加条件没什么技术含量.(在这提一点,千万别认为用一大堆for循环算出答案也算是种算法,那跟逐个打印出来没什么两样,试想一下,给你N个数的序列,你该怎么办)  
   
  public   class   TestMain   {  
          public   TestMain()   {  
          }  
   
          public   static   void   main(String[]   args)   {  
                  TestMain   testmain   =   new   TestMain();  
                  char[]   c=new   char[]{'1','2','3','4','5'};  
                  testmain.start(c);  
                  System.out.println(testmain.count(c.length));  
          }  
   
          public   void   start(char[]   c){  
                  start(c,c.length,this.count(c.length),1);  
          }  
   
          private   void   start(char[]   c,int   size,int   count,int   n){  
                  if(n>count)   return;  
                  int   f1=n%size;  
                  int   f2=f1-1;  
                  if(f2<0)   f2=size-1;  
                  char   temp   =   c[f1];  
                  c[f1]   =   c[f2];  
                  c[f2]   =   temp;  
                  System.out.println(c);  
                  start(c,size,count,++n);  
          }  
   
          private   int   count(int   n){  
                  if(n==1)   return   1;  
                  return   n*count(--n);  
          }  
  }Top

75 楼guzuoshantou(孤小小)回复于 2006-10-19 00:37:50 得分 0

在这里面   arbiter(同济流氓)   图构的思想是最好的,向往之!用图构思路非常清析,但用来解决这道题有点大材小用,效率不够好.(欢迎拍砖,被拍得越惨,就学到越多)Top

76 楼jy02209334(失意中......)回复于 2006-10-19 09:53:58 得分 0

public   class   Test  
  {  
  public   static   void   main(String[]   args)  
  {  
  int[]   a   =   {1,2,2,3,4,5};  
  int   sum   =   0;  
  for(int   i   =   0   ;   i   <   a.length   ;   i++   )  
  {  
  for(int   j   =   0   ;   j   <   a.length   ;   j++   )  
  {  
  if(j   ==   i||i   ==   3   &&   j   ==   5   ||   j   ==   3   &&   i   ==   5   )continue;  
  for(int   k   =   0   ;   k   <   a.length   ;   k++   )  
  {  
  if(k   ==   i   ||   k   ==   j   ||   k   ==   4   ||   j   ==   3   &&   k   ==   5   ||   k   ==   3   &&   j   ==   5)continue;  
  for(int   t   =   0   ;   t   <   a.length   ;   t++)  
  {  
  if(t   ==   i   ||   t   ==   j   ||   t   ==   k   ||   k   ==   3   &&   t   ==   5   ||   t   ==   3   &&   k   ==   5)continue;  
          for(int   s   =   0   ;   s   <   a.length   ;   s++   )  
          {  
          if(s   ==   i   ||   s   ==   j   ||   s   ==   k   ||   s   ==   t   ||   s   ==   3   &&   t   ==   5   ||   t   ==   3   &&   s   ==   5)continue;  
          for(int   n   =   0   ;   n   <   a.length   ;   n++   )  
          {  
          if(n   ==   i   ||   n   ==   j   ||   n   ==   k   ||   n   ==   t   ||   n   ==   s   ||   s   ==   3   &&   n   ==   5   ||   n   ==   3&&   s   ==   5)continue;  
          System.out.println("第"+   sum++   +"种:"+i+j+k+t+s+n);  
          }  
          }  
  }  
  }  
  }  
  }  
   
  }  
  }  
  我用的笨办法,为什么结果有395个?请问哪有问题吗Top

77 楼arbiter(同济流氓)回复于 2006-10-19 10:22:08 得分 0

pirateRocy(海盗罗西):  
   
  实际上基于图的算法好处在于,只要你能定义好满足题目要求的图结构,遍历的结果就是你要的结果,不用任何对遍历结果做任何处理。包括本题中的:4不能在第三位置,3,5不能相连,唯一  
  性要求,其实都可以在体现在构造的图形结构里,然后直接遍历图取得自己要的结果。而不用再次处理结果集。  
   
  只是说这里实际上对其它要求要体现在图结构里有困难(理论上是可以的),但起码3,5不能相接是很好构造的,就是上面的代码段来解释的。  
   
  所以不想用TREESET,可以把心思花在构造唯一性的图上,我这里用TREESET只是偷懒的做法,有兴趣的,可以把符合题目要求的图构造出来,然后直接深度遍历图求解。理论上确实存在你说的十全十美的解法。  
   
   
  TO:guzuoshantou(孤小小)    
   
  图的深度遍历原理也是递归,好处在于它首先构造了模型,再处理模型,模型代码和处理模型的代码是松耦合的,自然思路就很清晰,至于说到效率,其实并不低,你可以比较一下,我没跑过你的程序,但是我比较过的其它算法,这是最快的。Top

78 楼laoxing521(想做程序员的农民)回复于 2006-10-19 10:34:17 得分 0

数学不好,只能靠边看  
   
  顶一个Top

79 楼lgh2008(ar_guang)回复于 2006-10-19 11:51:37 得分 0

 
  再   to:   arbiter(同济流氓)  
   
  如果我没有看错的话,   你的结果没有包含排列:  
   
  532412  
  253241  
  531242  
  531422  
  412532  
  453212  
  453221  
  453122  
  241253  
  242531  
  253124  
  421253  
  221534  
  212534  
  425321  
  415322  
  253412  
  153242  
  532142  
  142532  
  215342  
  245321  
  425312  
  122534  
   
  当然,我只列举了一部分。  
  Top

80 楼lgh2008(ar_guang)回复于 2006-10-19 13:04:54 得分 0

 
  不好意思,看错了,有一个条件没有考虑。Top

81 楼kumao()回复于 2007-01-10 16:41:26 得分 0

做了一下,10分钟太难了,不过觉得自己这个思路比较简单,仅供大家参考。  
   
  因为是数字数列实际上如果不考虑重复情况,6个数就有6×5×4×3×2×1=720种情况,程序就是要编写出这个数列,然后重复不重复就很好解决了。我是用字符串解决的。  
     
     
     
  我谈一下我自己的思路,假设3个字符,1,2,3    
     
  传递   1,2,3   数组  
  取出     1    
      传递   2,3   数组  
              取出     2    
                    传递     3     数组  
                    得到   123  
              返回  
     
              取出     3      
                    传递     2     数组  
                    得到132  
              返回  
      返回  
     
  取出     2  
      传递   1,3   数组  
              取出     1    
                    传递     3     数组  
                    得到   213  
              返回    
              取出     3      
                    传递     1     数组  
                    得到   231  
              返回  
      返回  
     
  取出     3  
      传递   1,2   数组  
              取出     1    
                    传递     2     数组  
                    得到   312  
              返回    
              取出     2      
                    传递     1     数组  
                    得到   321  
              返回  
      返回  
  即依次在数组中抽取一个元素,然后将抽取后的数组传递下去,进行下一次抽取,直到剩下一个元素  
   
                 
     
  现在考虑4个   元素   1,2,3,4  
     
  应该是这样的结果    
     
  1     2     3     4  
  1     2     4     3  
  1     3     2     4  
  1     3     4     2  
  1     4     2     3  
  1     4     3     2  
     
  2     1     3     4  
  2     1     4     3  
  2     3     1     4  
  2     3     4     1  
  2     4     1     3  
  2     4     3     1  
     
  3     1     2     4  
  3     1     4     2  
  3     2     1     4  
  3     2     4     1  
     
  4     1     2     3  
  4     1     3     2  
  4     2     1     3  
  4     2     3     1  
  4     3     1     2  
  4     3     2     1  
     
  所以根据这个思路必须使用递归函数。根据这个思路写了以下一段程序  
     
  关键是2点,一个是递归的时候,每递归一次,传递一个新数组,数组元素去掉1个  
  第二是必须把丢掉的数组元素也一并传递进去,否则字符串就少了。  
     
  package   Test;  
  public   class   PrintListTest1   {  
      //计算总共有多数符合条件的列表  
      private   static   int   i=0;  
     
      //结果字符串  
      String   resultstr=""   ;  
     
  //将数组转换成字符串     也可以合并成一个数组什么的  
      private   String   getList(int[]   a){  
          String   result="";  
          for(int   len=0;len<a.length;len++)  
              result=result+a[len];  
          return   result;  
      }  
      //判断是否符合条件这个对程序意义不大的  
      private   boolean   isValidStr(String   str){  
          if   (str.charAt(2)=='4')  
              return   false;  
          if   (str.indexOf("35")>-1)  
              return   false;  
          if   (str.indexOf("53")>-1)  
              return   false;  
          return   true;  
      }  
      /*  
      传递去除元素的数组,好像数组没有直接方法可以删除一个元素  
      只能再造一个数组  
      */  
      private   int[]   DelArray(int[]   a,int   pos){  
          if   (pos>a.length-1)   return   a;  
          int   len=a.length-1;  
          int[]   newArray=new   int[len];  
          for(int   i=0;i<len+1;i++){  
              if   (i<pos)   newArray[i]=a[i];  
              if   (i>pos)   newArray[i-1]=a[i];  
          }  
          return   newArray;  
      }  
      void   GetList(String   prestr,int[]   a){  
      /*  
          prestr   就是被抽取得数组元素,   为了简便使用字符串  
          大家也可以使用   数组什么的  
      */  
          /*  
          这个是符合题目的一段,但是觉得打印出  
          完整数列才是题目的意义,符合条件什么的就很简单了  
          判断是否符合条件,判断是否重复  
          if   (a.length<2){  
              String   result;  
              result=prestr+getList(a);  
              if(isValidStr(result)){  
              //if(true){  
                  if   (resultstr.indexOf(result)==-1){