黑马程序员技术交流社区

标题: 入学测试题之一.另我现场懵逼了,求大神解 [打印本页]

作者: hailong154    时间: 2016-5-14 15:36
标题: 入学测试题之一.另我现场懵逼了,求大神解
写一个方法输出所有1234四个数字的排序组合,13不能在一起,4不能作为开头.(面试环节的笔试题之一.45分钟时间,这是第四道题,我表示当场放弃了该题,老师说这是一个很简单的逻辑题,虐的我瞬间觉得自己的逻辑思维好差啊)

作者: w1001566    时间: 2016-5-14 20:15
看不懂这个题目要求是什么
作者: yaolv7    时间: 2016-5-14 20:44
简单点的用几个嵌套for循环(只适合这个题目)
复杂点的就是把所有的排序组合排出来,再保留符合规则的
作者: 刘凯强    时间: 2016-5-14 21:02
我感觉我有思路,但是不会写语句
作者: pal_xie    时间: 2016-5-14 23:11
  1. for (int a = 1; a < 4; a++) {
  2.                         for (int b = 1; b < 5; b++) {
  3.                                 for (int c = 1; c < 5; c++) {
  4.                                         for (int d = 1; d < 5; d++) {
  5.                                                 String s = "" + a + b + c + d;
  6.                                                 if (s.contains("13") || s.contains("31")) {
  7.                                                         continue;
  8.                                                 } else {
  9.                                                         System.out.println(s);
  10.                                                 }
  11.                                                
  12.                                         }
  13.                                 }
  14.                         }
  15.                 }
复制代码

作者: hailong154    时间: 2016-5-15 10:02
pal_xie 发表于 2016-5-14 23:11

不满足要求,要的是1234的所以排序,你这个中间有1123之类的重复
作者: hailong154    时间: 2016-5-15 10:05
yaolv7 发表于 2016-5-14 20:44
简单点的用几个嵌套for循环(只适合这个题目)
复杂点的就是把所有的排序组合排出来,再保留符合规则的 ...

俺也曾这么想过但是代码实现起来没思路了,先获取所有的1234的所有排序组合,然后去掉不符合的,但是怎么弄出他的所有排序啊
作者: hailong154    时间: 2016-5-15 10:12
public class Test {

        public static void main(String[] args) {
                String[] s = { "1", "2", "3", "4" };
                for (int w = 0; w< s.length; w++) {
                        for (int x = 0; x < s.length; x++) {
                                for (int y = 0; y < s.length; y++) {
                                        for (int z = 0; z < s.length; z++) {
                                                if (w==x||w==y||w==z||x==y||x==z||y==z) {
                                                        continue;
                                                } else {
                                                        String ss = s[w] + s[x] + s[y] + s[z];
                                                        if(!(ss.contains("13")||ss.contains("31")||ss.startsWith("4"))){
                                                                System.out.println(ss);
                                                        }
                                                }

                                        }
                                }
                        }
                }
        }
}
我用笨方法实现的,单我觉得不应该是着这样的.求一个高明的思路.有个老师给我提供一个思路,用插入法.
作者: pal_xie    时间: 2016-5-15 10:29
本帖最后由 pal_xie 于 2016-5-15 10:37 编辑

哦,每个数字只能用一次是吗,那再加个相等的判断就好了语句可能有点长,不过算是比较方便的解决方法啦,写的也快

作者: sincere126    时间: 2016-5-15 10:31
学习了,琢磨了半天,在最后阶段把设限的条件都排除一遍。。。
作者: 何亚辉    时间: 2016-5-15 12:21
class Play {
        public static void main(String[] args){
        /*写一个方法输出所有1234四个数字的排序组合,13不能在一起,4不能作为开头.
        (面试环节的笔试题之一.45分钟时间,这是第四道题,我表示当场放弃了该题,老师说这是一个很简单的逻辑题,虐的我瞬间觉得自己的逻辑思维好差啊)*/

                a: for (int i =1234; i<=4321;i++ ) {
                        int[] arr = new int[4];
arr[0]=i%10;
arr[1]=i/10%10;
arr[2]=i/100%10;
arr[3]=i/1000%10;

if (!compare(arr)) {
        continue a;
}
if (arr[0]==4) {
        continue a;
}
for (int j =0;j<=3 ;j++ ) {
if ((arr[0]==1||arr[0]==3)&&(arr[1]==1||arr[1]==3)) {
        continue a;
}
else if ((arr[3]==1||arr[3]==3)&&(arr[2]==1||arr[2]==3)) {
        continue a;
}else if ((j!=0&&j!=3)&&arr[j]==1&&(arr[j-1]==3||arr[j+1]==3)) {
        continue a;
}


}

for (int k =0;k<=3 ;k++ ) {
        System.out.print(arr[k]+"  ");
}
System.out.println();

               
                }
        }

        public static boolean compare(int[] arr){
int[] a = {1,2,3,4};
int sum =0;
a: for (int i =0;i<=3 ;i++ ) {
        for (int j =0;j<=3 ;j++ ) {
                if (arr[i]==a[j]) {
                        sum++;
                        a[j]=100;
                        continue a;                       
                }
        }       
}

if (sum==4) {
        return true;
}else {
return false;
}
}
}
作者: 何亚辉    时间: 2016-5-15 12:24
http://bbs.itheima.com/forum.php?mod=attachment&aid=MTA5ODYwfGJiNzBkNDQwMDNjN2IxN2ExYjBmMDY5NDlkMWQ1N2Q4fDE3MzEzNjM2OTQ%3D&request=yes&_f=.png

5%[5BI(`8RP3A]S325AXL3T.png (7.1 KB, 下载次数: 57)

5%[5BI(`8RP3A]S325AXL3T.png

作者: yaolv7    时间: 2016-5-15 14:07
本帖最后由 yaolv7 于 2016-5-15 14:08 编辑
  1. /**
  2. * method02  适用所有
  3. * */
  4. public static void method02() {
  5. Object[] arr = {1, 2, 3, 4};
  6. sort("", arr);
  7. }

  8. private static void sort(String str, Object[] arr) {
  9. if (arr.length == 1) {
  10. str = str + arr[0];
  11.                // 排除不符合的
  12. if (! str.contains("13") && ! str.contains("31") && ! str.startsWith("4"))
  13. System.out.println(str);
  14. }

  15. for (int i = 0; i < arr.length; i++) {
  16.            // 递归调用
  17. sort(str + arr[i], copy(arr, i));
  18. }
  19. }

  20. private static Object[] copy(Object[] arr, int index){
  21. Object[] tempArr = new Object[arr.length-1];

  22. System.arraycopy(arr, 0, tempArr, 0, index);
  23. System.arraycopy(arr, (index + 1), tempArr, index, (arr.length - index - 1));

  24. return tempArr;
  25. }

  26. /**
  27. * method01   只适用本题
  28. * */
  29. public static void method01() {
  30. for (int i = 1234; i <= 4321; i++) {

  31. String str = String.valueOf(i);
  32.           // 跳过不符合的
  33. if (str.contains("13") || str.contains("31") || str.startsWith("4"))
  34. continue;

  35. char[] c = str.toCharArray();
  36. Arrays.sort(c);
  37.         // 跳过这些数字之外的组合
  38. if (!String.valueOf(c).equals("1234"))
  39. continue;

  40. System.out.println(str);

  41. }
  42. }
复制代码
只能说黑马论坛太渣了,代码发上去都没了
作者: yanzhendong    时间: 2016-5-15 14:09
可以参考我之前的帖子,把values和pattern改一下就行了
http://bbs.itheima.com/thread-300863-1-1.html


作者: luomoss    时间: 2016-5-15 16:29
public class Ti2 {
        public static void main(String[] args) {
                for(int i =1;i<=3;i++){
                        for(int ii =1;ii<=4;ii++){
                                if((i==1&&ii==3)||i==3&&ii==3)
                                        continue;
                                for(int j =1;j<=4;j++){
                                        if((j==1&&ii==3)||j==3&&ii==3)
                                                continue;
                                        for(int jj =1;jj<=4;jj++){
                                                if((j==1&&jj==3)||j==3&&jj==3)
                                                        continue;
                                                if(i!=ii&&i!=j&&i!=jj&&ii!=j&&ii!=jj&&j!=jj){
                                                System.out.print(i);
                                                System.out.print(ii);
                                                System.out.print(j);
                                                System.out.println(jj);}
                                        }
                                }
                        }
                }
        }
}
简单的代码,用循环就行
作者: a825105162    时间: 2016-5-15 22:58
public class StringDemo {
        public static void main(String[] args) {
                for (int i = 1; i < 4; i++) {
                        for (int j = 1; j < 5; j++) {
                                for (int m = 1; m < 5; m++) {
                                        for (int n = 1; n < 5; n++) {
                                                String s = "" + i + j + m + n;
                                                if (s.contains("13")
                                                                || s.contains("31") || i == j || i == m || i == n || j == m || j == n || m == n) {
                                                        continue;
                                                } else {
                                                        System.out.println(s);
                                                }
                                        }
                                }
                        }
                }

        }
}


作者: a825105162    时间: 2016-5-15 23:01


作者: lovelife    时间: 2016-5-16 18:08
pal_xie 发表于 2016-5-14 23:11

你的代码已经复制 谢谢
作者: lovelife    时间: 2016-5-16 18:22
感谢楼主 让我对for循环有了更深刻的了解  
作者: sfz6012    时间: 2016-5-16 21:06
看题2分钟左右
定义一个int数组  包含  1  2  3  4
定义4个for循环,获取所有组合.应该是256个  以字符串存入集合
然后过滤掉不要的

作者: 石头stone    时间: 2016-5-16 22:15
pal_xie 发表于 2016-5-14 23:11

还没学到这,表示不懂,不过我想问一下你们发的代码为什么是这种格式的呢?能不能教教我
作者: pal_xie    时间: 2016-5-16 22:21
石头stone 发表于 2016-5-16 22:15
还没学到这,表示不懂,不过我想问一下你们发的代码为什么是这种格式的呢?能不能教教我 ...

回复输入框 上面  表情左边有个  左右括号图标  
点开  把代码粘到里面  提交就好
作者: 石头stone    时间: 2016-5-16 22:25
pal_xie 发表于 2016-5-16 22:21
回复输入框 上面  表情左边有个  左右括号图标  
点开  把代码粘到里面  提交就好 ...

原来是这样,谢谢喽
作者: 可以假装看不见    时间: 2016-5-16 22:36
表示已跪....




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