黑马程序员技术交流社区

标题: 十万火急求回复!!!!!!!!!!! [打印本页]

作者: a4903913    时间: 2015-9-12 12:34
标题: 十万火急求回复!!!!!!!!!!!
今天面试了,被这道题给坑了,大神给个代码和思路,加上注释!!1拜谢!!!!!
用1、2、3、4这四个数字,用java写一个main函数,打印出所有不同的排列,如:1234、1243等,要求:"4"不能在第一位,"1"与"3"不能相连。
作者: zjingwen    时间: 2015-9-12 13:06
坐等搞手
作者: a4903913    时间: 2015-9-12 13:07
楼主做出来了!!!!1哇哈哈
作者: a4903913    时间: 2015-9-12 13:08
写条件的时候写错了一个细节。找了半天没找到。后来闪现了 终于找到了!!!!!!!!!!!
作者: a4903913    时间: 2015-9-12 13:13
楼主可能会中安卓就业班78期,谁知道住宿是怎么弄的........
作者: yz112069947    时间: 2015-9-12 13:23
观摩下···
作者: alex322326    时间: 2015-9-12 13:25
楼主多少分啊
作者: a4903913    时间: 2015-9-12 13:27
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
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;
        }
}

作者: fmi110    时间: 2015-9-12 17:48

  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. }
复制代码

作者: ln0491    时间: 2015-9-12 19:25
好东东。。。。。。。。。。
作者: 小小成很拽    时间: 2015-9-13 23:41
看评论。。。
作者: 193936696    时间: 2015-9-14 00:04
收藏了 加油不气馁
作者: 大头爱傻瓜    时间: 2015-9-14 00:10
很有意思的代码
作者: 15738320440    时间: 2015-9-14 00:26
好,可以用正则表达式吧!
作者: Anmyre    时间: 2015-9-14 09:23
学习了 加油啊
作者: 平凡的鱼    时间: 2015-9-14 16:43
好像还可以用数组实现把  可以吗?
作者: foreverfun    时间: 2015-9-14 20:31
应该可以用正则表达式吧,希望有大神来做
作者: kenfans    时间: 2015-9-14 20:39
全部排出来然后判断
作者: chenyannna    时间: 2015-9-14 20:52
新手一看到题就迷茫了
作者: TseW30    时间: 2015-9-14 21:25
坐等高高手~
作者: 往事如风555    时间: 2015-9-14 23:18
还没学到这呢
作者: 霹雳三口组    时间: 2015-9-14 23:32
本帖最后由 霹雳三口组 于 2015-9-14 23:37 编辑

只想到使用for循环和if语句实现,等看几天视频再看可不可以使用其他方法实现吧,楼上的几个代码使用了还没有学到的知识点。
  1. package Test1;

  2. /**
  3. 用1、2、3、4这四个数字,用java写一个main函数,打印出所有不同的排列,如:1234、1243等,要求:"4"不能在第一位,"1"与"3"不能相连
  4. */
  5. public class Test2 {
  6.         public static void main(String args[]){
  7.                 String str="";
  8.                 for (int x=1;x<4;x++){
  9.                         for (int y=1;y<5;y++){
  10.                                 for(int z=1;z<5;z++){
  11.                                         for(int k=1;k<5;k++){
  12.                                                 //for循环语句得到所有不以4开头的包含1234的组合
  13.                                                 if((x+y+z+k)==10){
  14.                                                         if ((x!=y) & (y!=z) & (z!=k) & (x!=k) &(y!=k) & (x!=z)){
  15.                                                                 //两个if语句得到所有含有1234的组合
  16.                                                                 str=""+x+y+z+k;
  17.                                                                 if (!str.contains("13") & !str.contains("31")){ //排除包含的“13”或者“31”的组合
  18.                                                                         System.out.println(str);
  19.                                                                 }
  20.                                                         }
  21.                                                        
  22.                                                 }
  23.                                                
  24.                                         }
  25.                                 }
  26.                         }
  27.                 }
  28.                
  29.         }

  30. }
复制代码




作者: 莫盛强    时间: 2015-9-15 10:19
感觉晕晕的
作者: a4903913    时间: 2015-9-17 20:59
霹雳三口组 发表于 2015-9-14 23:32
只想到使用for循环和if语句实现,等看几天视频再看可不可以使用其他方法实现吧,楼上的几个代码使用了还没 ...

厉害,这思路!!!!!!!!!!!!
作者: 行而受之    时间: 2015-9-17 21:17
我得好好研究研究
作者: zzq18217362451    时间: 2015-9-17 21:22
感觉好难啊
作者: a4903913    时间: 2015-9-20 15:42
这是用正则写的,正则写会简单很多的
作者: 哈哈我赢了    时间: 2015-9-20 21:53
新手来看看。。。。




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