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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

打印出所有不同的排列,如: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. }
复制代码


评分

参与人数 1技术分 +1 收起 理由
洋葱头头 + 1

查看全部评分

15 个回复

倒序浏览
运行结果
  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
楼主还有其他题目不

我是看被人发的题然后写的  论坛里也有人分享题的  你搜搜
回复 使用道具 举报
不知道怎么做
回复 使用道具 举报

改进版,数字不能重复

  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:41
7#
学习了,还有其他简单方法么?
回复 使用道具 举报
赞!!!!!
回复 使用道具 举报
真是可怕
回复 使用道具 举报
厉害啊,学习了
回复 使用道具 举报
加油加油
回复 使用道具 举报
zrc203 发表于 2015-9-12 20:36
学习了,还有其他简单方法么?

关键的问题是解决数字组合排序的问题
可能还有更好的正则表达式,暂时没想到
回复 使用道具 举报

多谢版主加分
回复 使用道具 举报
楼主厉害喔
回复 使用道具 举报
lvfx 来自手机 中级黑马 2015-9-14 12:31:32
15#
完全看不懂,大神之路坎坷啊
回复 使用道具 举报
lvfx 发表于 2015-9-14 12:31
完全看不懂,大神之路坎坷啊

看到正则表达式部分的内容就懂了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马