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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王小丑 中级黑马   /  2013-2-8 22:51  /  1756 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天看到某公司(中兴)一道面试编程题,题目如下:
用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:”4″不能在第三位,”3″与”5″不能相连,并用1、2、2、3、4、5这六个数字排列“递增”序列!
这道题咋一看很简单啊,可是如果你要是仔细看一下就发现,其实不那么好做,我的想法是:
这道题显然应该是递归,比如初始序列122345,先从末两位(45)变化(45,54),然后末三位(345) … 直到最后六位.
可是怎样解决重复问题呢?这个我想了好久,有一种简单的想法,由于是递增序列,每生成新序列可与前一生成序列比较,如<放弃当前序列。
由于本人很想以后去中兴,所以很重视这道题,我试着编写出一个。基本上能运行出来,只是在跳出循环的时候感觉不太理想,一下是我的程序,我只是一个小菜鸟,忘高手给出简单的方法,多谢!
class test
{
  // 当前固定部分
  private String CurFixPart;
  private String PreGenNum;

public static void main(String[] args)
{
test t=new test();
t.GenControll(“122345″);
}

// 调整字符串s位置pos字符到最前
private String shift(String s, int pos)
{
String newStr;
if (s.length()>pos+1)
  newStr=s.substring(pos, pos+1)
        +s.substring(0, pos)
        +s.substring(pos+1);
else
  newStr=s.substring(pos)
        +s.substring(0, pos);
return newStr;
}

protected int Validate(String newNum)
{
  String newGenNum=CurFixPart+newNum;
  if (Integer.valueOf(newGenNum)<=Integer.valueOf(PreGenNum))
    return 0;
  if (newGenNum.substring(2,3).equals(“4″) ||
       (newGenNum.indexOf(“35″)!=-1) || (newGenNum.indexOf(“53″)!=-1))
    return 0;
     
  PreGenNum=newGenNum;
System.out.println(newGenNum);
return 0;
}

public void GenControll(String Base)
{
  PreGenNum=”0″;
CurFixPart=”";
GenNext(Base, 0);
}

void GenNext(String varPart, int curPos)
{
if (varPart.length()==2)
{
  Validate(varPart);
  Validate(shift(varPart, 1));
  return;
}
// Next Layer
String newGen=shift(varPart, curPos);
String SavedFixPart=CurFixPart;
CurFixPart=CurFixPart+newGen.substring(0,1);
GenNext(newGen.substring(1), 0);
CurFixPart=SavedFixPart;
// 同层递增
if (curPos==varPart.length()-1)
  return;
GenNext(varPart, curPos+1);
}
}

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1 新年祝你能早日进中兴。

查看全部评分

7 个回复

倒序浏览
补充一下:对于递归我感觉当然有更好效率,如预先预测法,但是还是那个比较辣手问题即怎样解决重复问题,我感觉这个问题很关键,希望高手给出程序,我几天后会做一个总结,谢谢大家支持!
回复 使用道具 举报
顶起,期待解法
回复 使用道具 举报
本帖最后由 许晓华 于 2013-2-12 15:42 编辑

一共有198种满足要求的排列,结果如下:(代码见下一楼)
1 2 2 3 4 5
1 2 2 5 4 3
1 2 3 2 4 5
1 2 3 2 5 4
1 2 3 4 2 5
1 2 3 4 5 2
1 2 5 2 3 4
1 2 5 2 4 3
1 2 5 4 2 3
1 2 5 4 3 2
1 3 2 2 4 5
1 3 2 2 5 4
1 3 2 4 2 5
1 3 2 4 5 2
1 3 2 5 2 4
1 3 2 5 4 2
1 4 2 3 2 5
1 4 2 5 2 3
1 4 3 2 2 5
1 4 3 2 5 2
1 4 5 2 2 3
1 4 5 2 3 2
1 5 2 2 3 4
1 5 2 2 4 3
1 5 2 3 2 4
1 5 2 3 4 2
1 5 2 4 2 3
1 5 2 4 3 2
2 1 2 3 4 5
2 1 2 5 4 3
2 1 3 2 4 5
2 1 3 2 5 4
2 1 3 4 2 5
2 1 3 4 5 2
2 1 5 2 3 4
2 1 5 2 4 3
2 1 5 4 2 3
2 1 5 4 3 2
2 2 1 3 4 5
2 2 1 5 4 3
2 2 3 1 4 5
2 2 3 1 5 4
2 2 3 4 1 5
2 2 3 4 5 1
2 2 5 1 3 4
2 2 5 1 4 3
2 2 5 4 1 3
2 2 5 4 3 1
2 3 1 2 4 5
2 3 1 2 5 4
2 3 1 4 2 5
2 3 1 4 5 2
2 3 1 5 2 4
2 3 1 5 4 2
2 3 2 1 4 5
2 3 2 1 5 4
2 3 2 4 1 5
2 3 2 4 5 1
2 3 2 5 1 4
2 3 2 5 4 1
2 4 1 3 2 5
2 4 1 5 2 3
2 4 2 3 1 5
2 4 2 5 1 3
2 4 3 1 2 5
2 4 3 1 5 2
2 4 3 2 1 5
2 4 3 2 5 1
2 4 5 1 2 3
2 4 5 1 3 2
2 4 5 2 1 3
2 4 5 2 3 1
2 5 1 2 3 4
2 5 1 2 4 3
2 5 1 3 2 4
2 5 1 3 4 2
2 5 1 4 2 3
2 5 1 4 3 2
2 5 2 1 3 4
2 5 2 1 4 3
2 5 2 3 1 4
2 5 2 3 4 1
2 5 2 4 1 3
2 5 2 4 3 1
3 1 2 2 4 5
3 1 2 2 5 4
3 1 2 4 2 5
3 1 2 4 5 2
3 1 2 5 2 4
3 1 2 5 4 2
3 1 5 2 2 4
3 1 5 2 4 2
3 1 5 4 2 2
3 2 1 2 4 5
3 2 1 2 5 4
3 2 1 4 2 5
3 2 1 4 5 2
3 2 1 5 2 4
3 2 1 5 4 2
3 2 2 1 4 5
3 2 2 1 5 4
3 2 2 4 1 5
3 2 2 4 5 1
3 2 2 5 1 4
3 2 2 5 4 1
3 2 5 1 2 4
3 2 5 1 4 2
3 2 5 2 1 4
3 2 5 2 4 1
3 2 5 4 1 2
3 2 5 4 2 1
3 4 1 2 2 5
3 4 1 2 5 2
3 4 1 5 2 2
3 4 2 1 2 5
3 4 2 1 5 2
3 4 2 2 1 5
3 4 2 2 5 1
3 4 2 5 1 2
3 4 2 5 2 1
3 4 5 1 2 2
3 4 5 2 1 2
3 4 5 2 2 1
4 1 2 3 2 5
4 1 2 5 2 3
4 1 3 2 2 5
4 1 3 2 5 2
4 1 5 2 2 3
4 1 5 2 3 2
4 2 1 3 2 5
4 2 1 5 2 3
4 2 2 3 1 5
4 2 2 5 1 3
4 2 3 1 2 5
4 2 3 1 5 2
4 2 3 2 1 5
4 2 3 2 5 1
4 2 5 1 2 3
4 2 5 1 3 2
4 2 5 2 1 3
4 2 5 2 3 1
4 3 1 2 2 5
4 3 1 2 5 2
4 3 1 5 2 2
4 3 2 1 2 5
4 3 2 1 5 2
4 3 2 2 1 5
4 3 2 2 5 1
4 3 2 5 1 2
4 3 2 5 2 1
4 5 1 2 2 3
4 5 1 2 3 2
4 5 1 3 2 2
4 5 2 1 2 3
4 5 2 1 3 2
4 5 2 2 1 3
4 5 2 2 3 1
4 5 2 3 1 2
4 5 2 3 2 1
5 1 2 2 3 4
5 1 2 2 4 3
5 1 2 3 2 4
5 1 2 3 4 2
5 1 2 4 2 3
5 1 2 4 3 2
5 1 3 2 2 4
5 1 3 2 4 2
5 1 3 4 2 2
5 2 1 2 3 4
5 2 1 2 4 3
5 2 1 3 2 4
5 2 1 3 4 2
5 2 1 4 2 3
5 2 1 4 3 2
5 2 2 1 3 4
5 2 2 1 4 3
5 2 2 3 1 4
5 2 2 3 4 1
5 2 2 4 1 3
5 2 2 4 3 1
5 2 3 1 2 4
5 2 3 1 4 2
5 2 3 2 1 4
5 2 3 2 4 1
5 2 3 4 1 2
5 2 3 4 2 1
5 4 1 2 2 3
5 4 1 2 3 2
5 4 1 3 2 2
5 4 2 1 2 3
5 4 2 1 3 2
5 4 2 2 1 3
5 4 2 2 3 1
5 4 2 3 1 2
5 4 2 3 2 1
5 4 3 1 2 2
5 4 3 2 1 2
5 4 3 2 2 1
一共有198种满足要求的排列
回复 使用道具 举报
本帖最后由 许晓华 于 2013-2-12 15:41 编辑
  1. public class c
  2. {
  3.         static int MAX=6;
  4.         static int []rcd=new int[MAX];
  5.         static int []used=new int[MAX];
  6.         static int []num=new int[MAX];;   //存放互不相同的m个数
  7.         static int n=MAX,m=0;   //n个数,互不相同有m个
  8.         static int count=0;//记数器
  9.         static void unrepeat_full_permutation(int l)
  10.         {
  11.             int i;
  12.             if(l == n)
  13.             {
  14.                 if(rcd[2]==4) return;//4不能在第3位
  15.                         for(i=0;i<n-1;i++)//3与5不能相连
  16.                                 if(rcd[i]==3&&rcd[i+1]==5||rcd[i]==5&&rcd[i+1]==3)  return;
  17.                         count++;//记数器自增
  18.                         for(i=0; i<n; i++)
  19.                         {
  20.                                 System.out.print(rcd[i]);
  21.                                 if(i < n-1) System.out.print(" ");
  22.                         }
  23.                         System.out.println();
  24.                 return ;
  25.             }
  26.             for(i=0; i<n; i++)
  27.             {
  28.                 if(used[i] > 0)
  29.                 {
  30.                     used[i]--;
  31.                     rcd[l] = num[i];
  32.                     unrepeat_full_permutation(l+1);
  33.                     used[i]++;
  34.                 }
  35.             }
  36.         }
  37.         public static void main(String[] args)
  38.         {
  39.             int i, j;
  40.             int ori[]={1,2,2,3,4,5};
  41.             for(i=0; i<n; i++)
  42.             {
  43.                 for(j=0; j<m; j++)
  44.                 {
  45.                     if(num[j] == ori[i])
  46.                     {
  47.                         used[j]++;
  48.                         break;
  49.                     }
  50.                 }
  51.                 if(j == m)
  52.                 {
  53.                     num[m] = ori[i];
  54.                     used[m++] = 1;
  55.                 }
  56.             }
  57.             unrepeat_full_permutation(0);
  58.             System.out.printf(" 一共有%d种满足要求的排列\n",count);
  59.         }
  60. }

复制代码

评分

参与人数 1技术分 +2 收起 理由
杨志 + 2 新年好。。。

查看全部评分

回复 使用道具 举报
递归这个鬼东西,我怎么越学越糊涂?杯具!!
回复 使用道具 举报
许晓华 发表于 2013-2-9 15:15

很给力 支持
回复 使用道具 举报
谢谢前辈 我会努力的!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马