用1、2、2、3、4、5这六个数字,用java写一个程序,打印出所有不同的排列

用1、2、2、3、4、5这六个数字,用java写一个程序,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连

这道笔试题相当的出名,我也有幸遇到了。确切的说这是一道算法题,像我这种离散,数据结构都半吊子的人实在拿它没撤,回来小发愤了一下,找到了多个不同的实现算法

第一个:

Java代码 收藏代码
  1. packagecom.audition;
  2. //排序组合算法
  3. publicclassPermutationAlgo{
  4. privateintcount=0;
  5. publicvoidcalculate(){
  6. StringeleStr="122345";
  7. depthSearch(eleStr,"");
  8. System.out.println("符合条件的总结果数为:"+count+"条");
  9. }
  10. /**
  11. *@parameleStr-待分配字符组成的串
  12. *@paramrstStr-已分配字符组成的串
  13. */
  14. publicvoiddepthSearch(StringeleStr,StringrstStr){
  15. if(eleStr.length()==0){
  16. count++;
  17. System.out.println(rstStr);
  18. return;
  19. }
  20. for(inti=0;i<eleStr.length();i++){
  21. StringcurrEle=eleStr.substring(i,i+1);//取出当前位的值
  22. if(rstStr.length()==2&&"4".equals(currEle))continue;//剪掉第三位为4的分支
  23. if(rstStr.endsWith("3")&&"5".equals(currEle))continue;//剪掉"35"相连的分支
  24. if(rstStr.endsWith("5")&&"3".equals(currEle))continue;//剪掉"53"相连的分支
  25. if(eleStr.substring(0,i).indexOf(currEle)!=-1)continue;//剪掉同一位上字符重复的分支(此题即剪掉重复的2)
  26. depthSearch(eleStr.substring(0,i)+eleStr.substring(i+1),rstStr+currEle);//用剩余的合法串继续递归
  27. }
  28. }
  29. publicstaticvoidmain(String[]args){
  30. newPermutationAlgo().calculate();
  31. }
  32. }

第二个

Java代码 收藏代码
  1. packagecom.audition;
  2. publicclassPermutationAlgo2{
  3. privatestaticintcount=0;
  4. publicstaticvoidmain(String[]args){
  5. //本题的思路是先用1,3,4,5进行全排列
  6. //后边再将另外两个2往里插入,并判断是否符合要求
  7. int[]arr={1,3,4,5};
  8. printCom(arr,0);
  9. System.out.printf("符合要求的排列共有%d种",count);
  10. }
  11. publicstaticvoidprintCom(int[]arr,intindex){
  12. if(index==arr.length-1){
  13. insertTwo(arr,0);
  14. return;
  15. }
  16. printCom(arr,index+1);
  17. for(inti=index+1;i<arr.length;i++){
  18. arr[index]^=arr[i];
  19. arr[i]^=arr[index];
  20. arr[index]^=arr[i];
  21. printCom(arr,index+1);
  22. arr[index]^=arr[i];
  23. arr[i]^=arr[index];
  24. arr[index]^=arr[i];
  25. }
  26. }
  27. //将2在符合要求的情况下插入数组
  28. privatestaticvoidinsertTwo(int[]arr,intindex){
  29. if(index==arr.length+1)
  30. return;
  31. for(inti=index+1;i<arr.length+2;i++){
  32. int[]tar=newint[arr.length+2];
  33. tar[i]=2;
  34. tar[index]=2;
  35. innerInsert(arr,tar);
  36. }
  37. insertTwo(arr,index+1);
  38. }
  39. privatestaticvoidinnerInsert(int[]arr,int[]tar){
  40. intindex=0;
  41. intindexArr=0;
  42. while(index<tar.length){
  43. if(tar[index]==0){
  44. if((index>0&&tar[index-1]+arr[indexArr]==8)
  45. ||(index==2&&arr[indexArr]==4))
  46. return;
  47. tar[index]=arr[indexArr++];
  48. }
  49. index++;
  50. }
  51. count++;
  52. System.out.printf("[%d]",count);
  53. for(inti=0;i<tar.length;i++){
  54. System.out.print(tar[i]+"");
  55. }
  56. if(count%5==0){
  57. System.out.println();
  58. }
  59. }
  60. }

第三个

Java代码 收藏代码
  1. packagecom.audition;
  2. /**
  3. *用1、2、2、3、4、5这六个数字,用java写一个程序,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"
  4. *不能相连。
  5. *
  6. *
  7. *@authorAdministrator
  8. *
  9. */
  10. publicclassPermutationAlgo3{
  11. privateint[]numbers=newint[]{1,2,2,3,4,5};
  12. publicintn;
  13. privateStringlastResult="";
  14. privatebooleanvalidate(Strings){
  15. if(s.compareTo(lastResult)<=0)
  16. returnfalse;
  17. if(s.charAt(2)=='4')
  18. returnfalse;
  19. if(s.indexOf("35")>=0||s.indexOf("53")>=0)
  20. returnfalse;
  21. returntrue;
  22. }
  23. publicvoidlist(Stringindex,Stringresult){
  24. for(inti=0;i<numbers.length;i++){
  25. if(index.indexOf(i+48)<0){
  26. Strings=result+String.valueOf(numbers[i]);
  27. if(s.length()==numbers.length){
  28. if(validate(s)){
  29. System.out.println(s);
  30. lastResult=s;
  31. n++;
  32. }
  33. break;
  34. }
  35. list(index+String.valueOf(i),s);
  36. }
  37. }
  38. }
  39. publicstaticvoidmain(String[]args){
  40. PermutationAlgo3algo3=newPermutationAlgo3();
  41. algo3.list("","");
  42. System.out.println("总数:"+algo3.n);
  43. }
  44. }

用1、2、2、3、4、5这六个数字,用java写一个程序,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连

这道笔试题相当的出名,我也有幸遇到了。确切的说这是一道算法题,像我这种离散,数据结构都半吊子的人实在拿它没撤,回来小发愤了一下,找到了多个不同的实现算法

第一个:

Java代码 收藏代码
  1. packagecom.audition;
  2. //排序组合算法
  3. publicclassPermutationAlgo{
  4. privateintcount=0;
  5. publicvoidcalculate(){
  6. StringeleStr="122345";
  7. depthSearch(eleStr,"");
  8. System.out.println("符合条件的总结果数为:"+count+"条");
  9. }
  10. /**
  11. *@parameleStr-待分配字符组成的串
  12. *@paramrstStr-已分配字符组成的串
  13. */
  14. publicvoiddepthSearch(StringeleStr,StringrstStr){
  15. if(eleStr.length()==0){
  16. count++;
  17. System.out.println(rstStr);
  18. return;
  19. }
  20. for(inti=0;i<eleStr.length();i++){
  21. StringcurrEle=eleStr.substring(i,i+1);//取出当前位的值
  22. if(rstStr.length()==2&&"4".equals(currEle))continue;//剪掉第三位为4的分支
  23. if(rstStr.endsWith("3")&&"5".equals(currEle))continue;//剪掉"35"相连的分支
  24. if(rstStr.endsWith("5")&&"3".equals(currEle))continue;//剪掉"53"相连的分支
  25. if(eleStr.substring(0,i).indexOf(currEle)!=-1)continue;//剪掉同一位上字符重复的分支(此题即剪掉重复的2)
  26. depthSearch(eleStr.substring(0,i)+eleStr.substring(i+1),rstStr+currEle);//用剩余的合法串继续递归
  27. }
  28. }
  29. publicstaticvoidmain(String[]args){
  30. newPermutationAlgo().calculate();
  31. }
  32. }

第二个

Java代码 收藏代码
  1. packagecom.audition;
  2. publicclassPermutationAlgo2{
  3. privatestaticintcount=0;
  4. publicstaticvoidmain(String[]args){
  5. //本题的思路是先用1,3,4,5进行全排列
  6. //后边再将另外两个2往里插入,并判断是否符合要求
  7. int[]arr={1,3,4,5};
  8. printCom(arr,0);
  9. System.out.printf("符合要求的排列共有%d种",count);
  10. }
  11. publicstaticvoidprintCom(int[]arr,intindex){
  12. if(index==arr.length-1){
  13. insertTwo(arr,0);
  14. return;
  15. }
  16. printCom(arr,index+1);
  17. for(inti=index+1;i<arr.length;i++){
  18. arr[index]^=arr[i];
  19. arr[i]^=arr[index];
  20. arr[index]^=arr[i];
  21. printCom(arr,index+1);
  22. arr[index]^=arr[i];
  23. arr[i]^=arr[index];
  24. arr[index]^=arr[i];
  25. }
  26. }
  27. //将2在符合要求的情况下插入数组
  28. privatestaticvoidinsertTwo(int[]arr,intindex){
  29. if(index==arr.length+1)
  30. return;
  31. for(inti=index+1;i<arr.length+2;i++){
  32. int[]tar=newint[arr.length+2];
  33. tar[i]=2;
  34. tar[index]=2;
  35. innerInsert(arr,tar);
  36. }
  37. insertTwo(arr,index+1);
  38. }
  39. privatestaticvoidinnerInsert(int[]arr,int[]tar){
  40. intindex=0;
  41. intindexArr=0;
  42. while(index<tar.length){
  43. if(tar[index]==0){
  44. if((index>0&&tar[index-1]+arr[indexArr]==8)
  45. ||(index==2&&arr[indexArr]==4))
  46. return;
  47. tar[index]=arr[indexArr++];
  48. }
  49. index++;
  50. }
  51. count++;
  52. System.out.printf("[%d]",count);
  53. for(inti=0;i<tar.length;i++){
  54. System.out.print(tar[i]+"");
  55. }
  56. if(count%5==0){
  57. System.out.println();
  58. }
  59. }
  60. }

第三个

Java代码 收藏代码
  1. packagecom.audition;
  2. /**
  3. *用1、2、2、3、4、5这六个数字,用java写一个程序,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"
  4. *不能相连。
  5. *
  6. *
  7. *@authorAdministrator
  8. *
  9. */
  10. publicclassPermutationAlgo3{
  11. privateint[]numbers=newint[]{1,2,2,3,4,5};
  12. publicintn;
  13. privateStringlastResult="";
  14. privatebooleanvalidate(Strings){
  15. if(s.compareTo(lastResult)<=0)
  16. returnfalse;
  17. if(s.charAt(2)=='4')
  18. returnfalse;
  19. if(s.indexOf("35")>=0||s.indexOf("53")>=0)
  20. returnfalse;
  21. returntrue;
  22. }
  23. publicvoidlist(Stringindex,Stringresult){
  24. for(inti=0;i<numbers.length;i++){
  25. if(index.indexOf(i+48)<0){
  26. Strings=result+String.valueOf(numbers[i]);
  27. if(s.length()==numbers.length){
  28. if(validate(s)){
  29. System.out.println(s);
  30. lastResult=s;
  31. n++;
  32. }
  33. break;
  34. }
  35. list(index+String.valueOf(i),s);
  36. }
  37. }
  38. }
  39. publicstaticvoidmain(String[]args){
  40. PermutationAlgo3algo3=newPermutationAlgo3();
  41. algo3.list("","");
  42. System.out.println("总数:"+algo3.n);
  43. }
  44. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值