黑马程序员技术交流社区

标题: 练习:用1、2、3、4这四个数字,用java写一个main函数, [打印本页]

作者: fmi110    时间: 2015-9-12 17:45
标题: 练习:用1、2、3、4这四个数字,用java写一个main函数,
打印出所有不同的排列,如:1234、1243等

  1. public class Test6 {

  2.         /**
  3.          * 用1、2、3、4这四个数字,用java写一个main函数,打印出所有不同的排列,如:1234、1243等,
  4.          * 要求:"4"不能在第一位,"1"与"3"不能相连。
  5.          */
  6.         public static void main(String[] args) {
  7.                 // TODO Auto-generated method stub
  8.                 //正则表达式,代表不以4开头的字符串
  9.                 String regex1 = "^[^4].*$";
  10.                
  11.                 //代表1和3相连的字符串
  12.                 String regex2 = ".*[1][3].*$";
  13.                 String regex3 = ".*[3][1].*$";

  14.                 //建立存储组合的字符
  15.                 StringBuilder sb = new StringBuilder("");
  16.                 int count = 0;//统计个数
  17.                
  18.                 for(int i = 1;i < 5;i++){
  19.                         for (int j = 1        ; j < 5; j++) {
  20.                                 for(int k = 1; k < 5 ; k++){
  21.                                         for(int h = 1 ; h < 5 ; h++){
  22.                                                 sb.append(i).append(j).append(k).append(h);
  23.                                                 String str = sb.toString();
  24.                                                
  25.                                                 if(str.matches(regex1))//不以4开头
  26.                                                 {
  27.                                                         if(!(str.matches(regex2)||str.matches(regex3))){//1和3不相连
  28.                                                                 count++;
  29.                                                                 System.out.println(str+"...第"+count+"个满足要求的组合");
  30.                                                         }
  31.                                                 }
  32.                                                 sb.delete(0,sb.length());
  33.                                         }
  34.                                 }
  35.                                
  36.                         }
  37.                 }
  38.                
  39.         }

  40. }
复制代码



作者: fmi110    时间: 2015-9-12 17:46
运行结果
  1. 3414...第117个满足要求的组合
  2. 3421...第118个满足要求的组合
  3. 3422...第119个满足要求的组合
  4. 3423...第120个满足要求的组合
  5. 3424...第121个满足要求的组合
  6. 3432...第122个满足要求的组合
  7. 3433...第123个满足要求的组合
  8. 3434...第124个满足要求的组合
  9. 3441...第125个满足要求的组合
  10. 3442...第126个满足要求的组合
  11. 3443...第127个满足要求的组合
  12. 3444...第128个满足要求的组合
复制代码

作者: llwhcm    时间: 2015-9-12 17:47
楼主还有其他题目不
作者: fmi110    时间: 2015-9-12 18:03
llwhcm 发表于 2015-9-12 17:47
楼主还有其他题目不

我是看被人发的题然后写的  论坛里也有人分享题的  你搜搜
作者: 往事如风555    时间: 2015-9-12 19:16
不知道怎么做
作者: fmi110    时间: 2015-9-12 20:23
往事如风555 发表于 2015-9-12 19:16
不知道怎么做

改进版,数字不能重复

  1. public class Test6 {
  2.         public static void main(String[] args) {
  3.                 // TODO Auto-generated method stub
  4.                 //正则表达式,代表不以4开头的字符串
  5.                 String regex1 = "^[^4].*$";
  6.                
  7.                 //代表1和3相连的字符串
  8.                 String regex2 = ".*[1][3].*$";
  9.                 String regex3 = ".*[3][1].*$";

  10.                 //建立存储组合的字符
  11.                 StringBuilder sb = new StringBuilder("");
  12.                 String str = null;
  13.                 int count = 0;//统计个数
  14.                
  15.                 for(int i = 1;i < 5;i++){
  16.                  for (int j = 1        ; j < 5; j++) {
  17.                         for(int k = 1; k < 5 ; k++){
  18.                                 for(int h = 1 ; h < 5 ; h++){
  19.                                         sb.append(i).append(j).append(k).append(h);
  20.                                         str = sb.toString();
  21.                                         if(str.matches(regex1))//不以4开头
  22.                                         {
  23.                                                 if(!(str.matches(regex2)||str.matches(regex3))){//1和3不相连
  24.                                                         if(single(str)){ //过滤,只要数字不重复的组合
  25.                                                                 count++;
  26.                                                                 System.out.println(str+"..."+count);
  27.                                                         }
  28.                                                 }
  29.                                         }                               
  30.                                         sb.delete(0,sb.length());
  31.                                 }
  32.                         }       
  33.                   }
  34.                 }
  35.         }

  36.         private static boolean single(String str) {  //去除相同数字
  37.                 // TODO Auto-generated method stub
  38.                 boolean flag = true;
  39.                 for(int i = 1;i < 5;i++){
  40.                         int count = 0;
  41.                         int offset = 0;
  42.                         while((offset = str.indexOf(String.valueOf(i),offset))!=-1){
  43.                                 offset += 1;
  44.                                 count++;
  45.                                 if(count > 1){
  46.                                         flag = false;
  47.                                         break;
  48.                                 }
  49.                         }
  50.                 }
  51.                 return flag;
  52.         }
  53. }
复制代码

作者: zrc203    时间: 2015-9-12 20:36
学习了,还有其他简单方法么?
作者: choseisstart    时间: 2015-9-12 20:39
赞!!!!!
作者: 洋葱头头    时间: 2015-9-12 21:08
真是可怕
作者: 水果牛牛    时间: 2015-9-12 21:26
厉害啊,学习了
作者: kingxiao    时间: 2015-9-12 21:27
加油加油
作者: fmi110    时间: 2015-9-12 21:28
zrc203 发表于 2015-9-12 20:36
学习了,还有其他简单方法么?

关键的问题是解决数字组合排序的问题
可能还有更好的正则表达式,暂时没想到
作者: fmi110    时间: 2015-9-12 21:30
洋葱头头 发表于 2015-9-12 21:08
真是可怕

多谢版主加分
作者: liufeibo    时间: 2015-9-14 12:04
楼主厉害喔
作者: lvfx    时间: 2015-9-14 12:31
完全看不懂,大神之路坎坷啊
作者: fmi110    时间: 2015-9-14 13:11
lvfx 发表于 2015-9-14 12:31
完全看不懂,大神之路坎坷啊

看到正则表达式部分的内容就懂了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2