黑马程序员技术交流社区

标题: 黑马面试笔试部分的一道题,求大神们帮忙看看.求个最简单... [打印本页]

作者: hailong154    时间: 2016-5-15 10:24
标题: 黑马面试笔试部分的一道题,求大神们帮忙看看.求个最简单...
求出1234四个数字的所有排序方式.要求13不能在一起,4不能作为开头.我的黑马面试题中笔试的一个题.老师说过这是一个很简单的逻辑思维题,但是就是没思路,最后用最笨的方法虽然写出来了,但觉得不应该是这样的.求大神给个简单明了的思路,并且代码实现....谢谢了
  1. public class Test {

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

  16.                                         }
  17.                                 }
  18.                         }
  19.                 }
  20.         }
  21. }
复制代码



作者: 罗勇    时间: 2016-5-15 22:18
  1. <blockquote>public static void main(String[] args) {
复制代码

我也遇到了同一个题目奥,但是我的做法跟你的不一样,你看看呗,要是觉得我这个简单点就给个分呗!嘻嘻
作者: 罗勇    时间: 2016-5-15 22:19
  1. public static void main(String[] args) {
  2.                 for (int qian = 1; qian < 4; qian++) {
  3.                         for (int bai = 1; bai < 5; bai++) {
  4.                                 if((bai+qian) %2 == 0){
  5.                                         continue;
  6.                                 } else {
  7.                                         for (int shi = 1; shi < 5; shi++) {
  8.                                                 if(((shi+bai) %4 == 0)|(shi == qian)|(shi==bai)){
  9.                                                         continue;
  10.                                                 } else {
  11.                                                         for (int ge = 1;ge < 5; ge++) {
  12.                                                                 if(((ge+shi) %4 == 0)|(ge == shi)|(ge ==bai)|(ge == qian)){
  13.                                                                         continue;
  14.                                                                 }else {
  15.                                                                         int i = qian*1000+bai*100+shi*10+ge;
  16.                                                
  17.                                                                         System.out.println(i);
  18.                                                                 }
  19.                                        
  20.                                                         }
  21.                                        
  22.                                        
  23.                                                 }       
  24.                                         }
  25.                                
  26.                                 }
  27.                                
  28.                         }
  29.                 }
  30.         }
  31. }
复制代码

作者: scalar    时间: 2016-5-16 19:58
感觉用位置交换+递归代码会短点,具体的代码我还没写出来,网上有很多。
作者: zhanghui1851155    时间: 2016-5-18 19:57
赞一个!
作者: hailong154    时间: 2016-5-20 00:23
罗勇 发表于 2016-5-15 22:19

先看看大神们的回答吧,你的思路跟我的其实是一样,你只是把我else判断,13不在一起的加在判断语句中,我是先写出所以得数,去掉不符合条件的.
作者: hailong154    时间: 2016-5-20 00:26
scalar 发表于 2016-5-16 19:58
感觉用位置交换+递归代码会短点,具体的代码我还没写出来,网上有很多。

是的,听过这个思路但是代码实现没做出来,不妨写出来试试.学习的动力在于多动手
作者: 罗勇    时间: 2016-5-20 01:19
hailong154 发表于 2016-5-20 00:26
是的,听过这个思路但是代码实现没做出来,不妨写出来试试.学习的动力在于多动手 ...

难道是传说中的女神头像
作者: 18735346124    时间: 2016-5-23 16:54
package com.heima.test;

import java.util.ArrayList;

public class Test_4 {
      public static void main(String[] args) {
      //创建集合,存储所有排列
        ArrayList<String> list = new ArrayList<>();
        int num = 0;
        for (int i = 1; i < 5; i++) {
               for (int j = 1; j < 5; j++) {
                    if (j != i) {
                for (int k = 1; k < 5; k++) {
                      if (k != i && k != j) {
                            for (int z = 1; z < 5; z++) {
                        if (z != i && z != j && z != k) {
                                  num = i * 1000 + j * 100 + k * 10 + z;                                                list.add(num+" ");
                        }
                           }
                      }
                        }
                  }
             }
        }
        System.out.println("1234四个数字的所有排序方式共有"+list.size()+"种,如下:");
        System.out.println(list);
        for (int i = 0; i < list.size(); i++) {
                 //如果可能排列以4开头,则去除
                 if (list.get(i).startsWith("4")) {
              //i在这里需要--,以免有漏掉的
                      list.remove(i--);
        }else if(list.get(i).contains("13") || list.get(i).contains("31")) {
                //i在这里也需要--,以免有漏掉的
                   list.remove(i--);
        }
           }
        System.out.println("符合要求的有"+list.size()+"种,如下:");
        System.out.println(list);
        }
}
作者: 欧胤祥    时间: 2016-5-26 16:44
18735346124 发表于 2016-5-23 16:54
package com.heima.test;

import java.util.ArrayList;

666666
作者: 大笑哈哈    时间: 2016-5-26 21:44
class Test2{
        public static void main(String[] args){
                for (int a=1 ; a<4 ; a++ ){
                        for (int b=1 ; b<=4 ; b++ ){
                                for (int c=1 ; c<=4 ; c++){
                                        for (int d=1 ; d<=4 ; d++ ){
if(a*b!=3 && b*c!=3 && c*d!=3 && a!=b && a!=c && a!=d  && b!=c && b!=d && c!=d){
                                                int s = a*1000 + b*100 + c*10 +d;
                                                        System.out.println(s);
                                                }
                                        }
                                }
                        }
                }
        }
}
作者: lyoivneg    时间: 2016-5-27 15:15
大笑哈哈 发表于 2016-5-26 21:44
class Test2{
        public static void main(String[] args){
                for (int a=1 ; a

兄弟 你这个好  牛x
作者: 大笑哈哈    时间: 2016-5-27 23:20
只想要5个黑马币没技术分怎么上就业班?
作者: 大笑哈哈    时间: 2016-5-27 23:21
lyoivneg 发表于 2016-5-27 15:15
兄弟 你这个好  牛x

这个就是为了回答,开发这么写会被打死吧
作者: 土菠萝    时间: 2016-5-28 10:59
本帖最后由 土菠萝 于 2016-5-28 11:13 编辑

/*
代码递归已画图解析了,有需要可以@我,或者加入QQ群 515848837 群里我会上传图片的
*/
public class Test {
   public static void main(String[] args) {
       String value = "1234";
       permutation(value.toCharArray(), 0);
   }
   public static void permutation(char[] str, int i) {
       if (i >= str.length)        //递归结束条件
           return;
       if (i == str.length - 1) {
               String result = String.valueOf(str);
               if(result.contains("13")||result.contains("31")||result.subSequence(0,1).equals("4")){
                       System.err.print("不满足条件的 :"+String.valueOf(str)+"\n");
               }else{
                       System.out.println("满足条件的:"+String.valueOf(str));
               }
       } else {
           for (int j = i; j < str.length; j++) {
               char temp = str[j];                //交换
               str[j] = str;
               str = temp;
               permutation(str, i + 1);//递归
               temp = str[j];
               str[j] = str;   //交换复原
               str = temp;
           }
       }
   }
}

作者: Linsa    时间: 2016-5-29 14:34
还有其他的题吗?
作者: Linsa    时间: 2016-5-29 14:35
[h1]还有其他的面试题吗?我下个月也就来见师姐了!!![/h1]
作者: chengxiankun    时间: 2016-6-4 09:02
不知道这样行不行
作者: chengxiankun    时间: 2016-6-4 09:04
不知道这样行不行public class test {
作者: chengxiankun    时间: 2016-6-4 09:05
public class test {
        public static void main(String[] args) {
                List<Integer> list = convertTolist();
                System.out.print(list.toString());
        }

        private static List<Integer> convertTolist() {
                List<Integer> list = new ArrayList<>();
                for(int i=1;i<=4;i++)
                {
                        for(int j=1;j<=4;j++)
                        {
                                for(int k=1;k<=4;k++)
                                {
                                        for(int m=1;m<=4;m++)
                                        {
                                                int num=i*1000+j*100+k*10+m;
                                                if(Integer.toString(num).startsWith("4")||
                                                                Integer.toString(num).contains("13")||
                                                                Integer.toString(num).contains("31"))
                                                {
                                                        continue;
                                                }
                                                else
                                                {
                                                        list.add(num);
                                                }
                                        }
                                }
                        }
                }
                        return list;
        }
       
}
作者: wzl100520    时间: 2016-6-4 11:19
要是面试的时候不会 怎么办

作者: yangben    时间: 2016-6-10 23:23
大笑哈哈 发表于 2016-5-27 23:21
这个就是为了回答,开发这么写会被打死吧

为什么?这做法挺好的啊?
作者: 大笑哈哈    时间: 2016-6-13 20:15
yangben 发表于 2016-6-10 23:23
为什么?这做法挺好的啊?

我觉得局限性太强了,这种判断完全可以抽取成方法
作者: TheLittlePrince    时间: 2016-6-28 22:01
我也来深受指教啦!
作者: ImKing    时间: 2016-7-6 14:36
  1. public class Test {

  2.         public static void main(String[] args) {

  3.                 for (int i = 1; i <= 4; i++)
  4.                         for (int j = 1; j <= 4; j++)
  5.                                 for (int k = 1; k <= 4; k++)
  6.                                         for (int l = 1; l <= 4; l++) {
  7.                                                 if (i == j || j == k || k == l || i == k || i == l
  8.                                                                 || j == l || i == 4) {
  9.                                                         continue;
  10.                                                 } else if ((i % 2 != 0) && (k % 2 != 0) || (j % 2 != 0)
  11.                                                                 && (l % 2 != 0) || (i % 2 != 0) && (l % 2 != 0)) {

  12.                                                         System.out.println("" + i + j + k + l);
  13.                                                 }
  14.                                         }
  15.         }
  16. }
复制代码


PS : 题主也肯定想要一个比较满意的答案,然而,看到这个问题,从早上一直思考到现在。期间也查过一些资料,这里还是从笨的方面入了手,还是有不同的地方。
首先关于解题思路想说 2 点:
(1)可以尝试使用正则表达式来排除不满足条件的字符串,然后输出(一个思路,可以试试)。
(2)笨办法:逐条筛选

上面代码思路分析:
(1)通过 4 层循环来分别确定 4 位数字
(2)第一个 if 排除数字重复、第一位为 4 的情况
(3)第二个 if 判断 (1 和 3)或者 (2 和 4)的位置,要么是在1、3;1、4;2、4。判断这些位置同奇、同偶即可。具体分布参考下方图片



希望有所帮助,{:3_56:}
作者: cat73    时间: 2016-7-10 19:49
本帖最后由 cat73 于 2016-7-14 17:53 编辑

NumberIteraror.java
  1. import java.util.Arrays;
  2. import java.util.Iterator;
  3. import java.util.NoSuchElementException;

  4. /**
  5. * 一个数字的迭代器<br>
  6. * 可通过 next 返回一个 Integer 数组,每一个元素代表在这一位上的数字,返回值是大端序的<br>
  7. * 此实现不是多线程安全的<br>
  8. * 最大可描述不大于 2 ^ 32 进制、不长于 Integer.MAX_VALUE 位的所有数字
  9. *
  10. * @author Cat73
  11. */
  12. public class NumberIterator implements Iterator<Integer[]> {
  13.     private final int min;
  14.     private final int max;
  15.     private final int length;
  16.     private boolean hasNext = true;
  17.     private final Integer[] number;

  18.     /**
  19.      * 构造一个新的数字迭代器
  20.      *
  21.      * @param min 每个位上的数字最小是多少?
  22.      * @param max 每个位上的数字最大是多少?
  23.      * @param length 这个数字有多长?
  24.      * @throws RuntimeException 如果 min > max
  25.      * @throws IndexOutOfBoundsException 如果长度小于 1
  26.      */
  27.     public NumberIterator(final int min, final int max, final int length) {
  28.         // 输入检查
  29.         if (min > max) {
  30.             throw new RuntimeException("max: " + max + ", min: " + min);
  31.         } else if (length < 1) {
  32.             throw new IndexOutOfBoundsException(Integer.toString(length));
  33.         }

  34.         // 初始化属性
  35.         this.min = min;
  36.         this.max = max;
  37.         this.length = length;
  38.         this.number = new Integer[this.length];

  39.         // 初始化值到最小值
  40.         for (int i = 0; i < this.length; i++) {
  41.             this.number[i] = this.min;
  42.         }
  43.     }

  44.     @Override
  45.     public Integer[] next() {
  46.         // 如果没有下一个元素则抛出异常
  47.         if (!this.hasNext) {
  48.             throw new NoSuchElementException();
  49.         }

  50.         // 将当前数值当做结果
  51.         final Integer[] result = Arrays.copyOf(this.number, this.length);

  52.         // 将数字加 1
  53.         this.number[0] += 1;
  54.         for (int i = 0; i < this.length && this.number[i] > this.max; i++) {
  55.             // 如果无法再进位则视为没有下一个元素
  56.             if (i + 1 >= this.length) {
  57.                 this.hasNext = false;
  58.             } else {
  59.                 this.number[i] = this.min;
  60.                 this.number[i + 1] += 1;
  61.             }
  62.         }

  63.         // 返回当前元素
  64.         return result;
  65.     }

  66.     @Override
  67.     public boolean hasNext() {
  68.         return this.hasNext;
  69.     }
  70. }
复制代码


Main.java
  1. import java.util.Iterator;

  2. public final class Main {
  3.     public static void main(final String args[]) throws Exception {
  4.         // 初始化一个数字迭代器
  5.         final Iterator<Integer[]> it = new NumberIteraror(1, 4, 4);

  6.         // 循环判断每一个数字
  7.         loop: while (it.hasNext()) {
  8.             // 获取下一个数字
  9.             final Integer[] num = it.next();

  10.             // 4 不能做开头
  11.             if (num[0] == 4) {
  12.                 continue loop;
  13.             }

  14.             // 1 与 3 不能在一起
  15.             for (int i = 0; i < num.length - 1; i++) {
  16.                 if (num[i] == 1 && num[i + 1] == 3 || num[i] == 3 && num[i + 1] == 1) {
  17.                     continue loop;
  18.                 }
  19.             }

  20.             // 数字不能重复
  21.             for (int i = 0; i < num.length; i++) {
  22.                 for (int j = 0; j < num.length; j++) {
  23.                     if (i != j && num[i] == num[j]) {
  24.                         continue loop;
  25.                     }
  26.                 }
  27.             }

  28.             // 输出结果
  29.             for (final int n : num) {
  30.                 System.out.print(n);
  31.             }
  32.             System.out.println();
  33.         }
  34.     }
  35. }
复制代码


输出
  1. 3421
  2. 3241
  3. 2341
  4. 3412
  5. 1432
  6. 1423
  7. 2143
  8. 1243
  9. 3214
  10. 1234
复制代码


作者: 水月灬清影    时间: 2016-9-6 13:36
本帖最后由 水月灬清影 于 2016-9-6 13:38 编辑

看看都怎么写的




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