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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

今天面试了,被这道题给坑了,大神给个代码和思路,加上注释!!1拜谢!!!!!
用1、2、3、4这四个数字,用java写一个main函数,打印出所有不同的排列,如:1234、1243等,要求:"4"不能在第一位,"1"与"3"不能相连。

28 个回复

倒序浏览
坐等搞手
回复 使用道具 举报
楼主做出来了!!!!1哇哈哈
回复 使用道具 举报
写条件的时候写错了一个细节。找了半天没找到。后来闪现了 终于找到了!!!!!!!!!!!
回复 使用道具 举报
楼主可能会中安卓就业班78期,谁知道住宿是怎么弄的........
回复 使用道具 举报
观摩下···
回复 使用道具 举报
楼主多少分啊
回复 使用道具 举报
package heima;

import java.util.Set;
import java.util.TreeSet;

/***
* 2.        用1、2、3、4这四个数字,用java写一个main函数,打印出所有不同的排列,
* 如:1234、1243等,要求:"4"不能在第一位,"1"与"3"不能相连。

* @author Administrator
*
*/
public class Test2 {
        public static void main(String[] args) {
                Set<String> s = new TreeSet<String>();
                StringBuilder sb = new StringBuilder();
                int aa = 0;
                //因为不知道有多少个 所以写了个200
                while (aa < 200) {
                        for (int i = 0; i < 4; i++) {
                                sb.append((int)(Math.random() * 4 +1));
                        }
                        char[] cha = sb.toString().toCharArray();
                        //4的不要
                        if (cha[0] == '4') {
                                sb = sb.delete(0, 4);
                                continue;
                        }
                        for (int i = 0; i < cha.length; i++) {
                                if (i+1 == 4) {
                                        continue;
                                }
                                //13相连的
                                if (cha[i] == '1' && cha[i+1] == '3') {
                                        sb = sb.delete(0, 4);
                                        continue;
                                }
                                //31相连的
                                if (cha[i] == '3' && cha[i+1] == '1') {
                                        sb = sb.delete(0, 4);
                                        continue;
                                }
                        }
                        s.add(sb.toString());
                        sb = sb.delete(0, 4);
                        aa++;
                }
                //有多少个
                System.out.println(s.size());
                for (String string : s) {
                        System.out.println(string);
                }
        }
}
回复 使用道具 举报
ashun 初级黑马 2015-9-12 15:06:05
9#
import java.util.ArrayList;
import java.util.List;

public class abc3 {
        /*
         * 输出"1234"的所有四位组合
         */
        public static void main(String[] args) {
                String str = "1234";
               
                //调用组合函数
                List<String> res = method(str, "");
               
                for (String s : res) {
                        // 输出首位不等于"4" 并且不含"13" 和"31"的所有组合
                        if (s.charAt(0) != '4' && !s.contains("13") && !s.contains("31")) {
                                System.out.print(s + " ");
                        }
                }
        }
       
        // 组合函数
        private static List<String> method(String str, String buf) {
                List<String> res = new ArrayList<String>();
               
                // 当组合含有四个字符时 添加到res中
                if (str.length() <= 0)
                        res.add(buf);

                for (int i = 0; i < str.length(); i++) {
                        // 递归调用组合函数
                        List<String> temp = method(new StringBuilder(str).deleteCharAt(i).toString(), buf + str.charAt(i));
                        res.addAll(temp);
                }
               
                return res;
        }
}
回复 使用道具 举报

  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. }
复制代码
回复 使用道具 举报
好东东。。。。。。。。。。
回复 使用道具 举报
看评论。。。
回复 使用道具 举报
收藏了 加油不气馁
回复 使用道具 举报
很有意思的代码
回复 使用道具 举报
15738320440 来自手机 中级黑马 2015-9-14 00:26:59
15#
好,可以用正则表达式吧!
回复 使用道具 举报
学习了 加油啊
回复 使用道具 举报
好像还可以用数组实现把  可以吗?
回复 使用道具 举报
应该可以用正则表达式吧,希望有大神来做
回复 使用道具 举报
全部排出来然后判断
回复 使用道具 举报
新手一看到题就迷茫了
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马