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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

要是面试的时候不会 怎么办
回复 使用道具 举报
大笑哈哈 发表于 2016-5-27 23:21
这个就是为了回答,开发这么写会被打死吧

为什么?这做法挺好的啊?
回复 使用道具 举报
yangben 发表于 2016-6-10 23:23
为什么?这做法挺好的啊?

我觉得局限性太强了,这种判断完全可以抽取成方法
回复 使用道具 举报
我也来深受指教啦!
回复 使用道具 举报
  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:31
26#
本帖最后由 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:38 编辑

看看都怎么写的
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马