前两天同事出去面试,遇到这样一个算法题让我试试。求胜心里让我花了好几个消息才搞定,希望能帮助到看到的朋友!
有如下一个二维数组,按照顺时针画圈的方式打印出来(数据已经排好序,正确结果为2~ 43) int[][] secondNums = { {2, 3, 4, 5, 6, 7}, {23, 24, 25, 26, 27, 8,}, {22, 37, 38, 39, 28, 9}, {21, 36, 43, 40, 29, 10}, {20, 35, 42, 41, 30, 11}, {19, 34, 33, 32, 31, 12}, {18, 17, 16, 15, 14, 13} };
输出效果:
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43]看起来没有什么问题,但当前我们将规则二维数组换成不规整的呢?如下:
static int[][] secondNums2 = { {1, 2, 3, 4, 5, 6}, {23, 24, 25, 26, 27, 28, 7}, {22, 40, 41, 42, 43, 44, 29, 8}, {21, 39, 45, 30, 9}, {20, 38, 46, 31, 10}, {19, 37, 47, 32, 11}, {18, 36, 49, 48, 33, 12}, {17, 35, 34, 13}, {16, 15, 14} };理论效果为 1~49,我们用刚才的方式看下效果!
Connected to the target VM, address: '127.0.0.1:60362', transport: 'socket' Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 at utils.DemoTest.arrangementArray(DemoTest.java:261) at utils.DemoTest.main(DemoTest.java:78)结果显然不是咱们想要的,原因是上面的方法只能做到标准的矩阵数组(每一个子数组都必须长度一致才可以)
这里我用到了Deque接口,配合实现类LinkedList中的重要方法:pollLast peekLast offerFirst offerlast等方法,这里不再描述这些方法含义,大家可以自己查资料了解,下面直接上代码:
/** * @param secondNums 原始二位数组 * @return void * @Description 使用队列排列数组 * @author JKR * @date 2020/10/22 11:23 */ public static void arrangementArrayByQueue(int[][] secondNums) { Deque<Deque<Integer>> secondList = new LinkedList<>(); // 构建二位队列 Deque<Integer> firstList; for (int[] secondNum : secondNums) { firstList = new LinkedList<>(); for (int num : secondNum) { firstList.add(num); } secondList.add(firstList); } // 最终结果集 List<Integer> resultList = new ArrayList<>(); // 数组矩阵高 int height = secondList.size(); // 首次标识 boolean firstFlag = true; // 换行次数 int LineBreak = 1; // 转向标识 boolean turnTo = false; while (!secondList.isEmpty()) { Deque<Integer> poll; if (turnTo) { poll = secondList.peekLast(); } else { poll = secondList.peek(); } while (!Objects.isNull(poll) && !poll.isEmpty()) { // 打印第一行 if (firstFlag) { resultList.add(poll.poll()); if (poll.isEmpty()) { secondList.poll(); height--; firstFlag = false; } continue; } // 当换行次数不等于当前高度需要换行取值 if (LineBreak != height) { Integer num; if (turnTo) { num = poll.poll(); } else { num = poll.pollLast(); } resultList.add(num); if (turnTo) { if (poll.isEmpty()) { secondList.pollLast(); } else { secondList.offerFirst(secondList.pollLast()); } } else { if (poll.isEmpty()) { secondList.poll(); } else { secondList.offer(secondList.poll()); } } LineBreak++; break; } else { Integer num; if (turnTo) { num = poll.poll(); } else { num = poll.pollLast(); } resultList.add(num); if (poll.isEmpty()) { if (turnTo) { secondList.pollLast(); } else { secondList.poll(); } height--; LineBreak = 1; turnTo = !turnTo; } } System.out.println(resultList); } } // System.out.println(resultList); }看下效果: 第一次:
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43]第二次:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]我们发现,方法二无论是标准的矩阵二维数组 还是不规则的二维数组都可以如期输出结果(这里需要注意的是,二维数组需要正常可以绕回去(一笔能够圈画所有的数),不可以中途就中断了)
本人第一次写博客,有不对的地方希望大家指正 _!
