Zigzag数组 -- 面试宝典
2016-01-06 15:53
204 查看
最近在看面试宝典,其中看到一个题目说:输入一个正整数n,输出它的zigzag数组。
分析:书上给出了数学方面的思考然后给了代码。但是我感觉如果真是面试或者考试遇到的话,我这种笨脑袋肯定是想不出来的,因此最好的方式是观察数组,然后找到规律。观察可知,数字递增的方向只有4个:right, left-down, down, right-up。因此我们可以设置一个switch语句,然后每走一步,判断下步要走的方向。因为输出的是n*n的数组,因此矩阵的右下角的数字肯定不会超过n*n,用它作为结束条件即可。
(需要注意的是:刚开始做时忘记考虑矩阵赋值了一半时,右下角的怎么赋值。因此每个方向走完了,下一步都会有两种方向。不要忘记右下角的赋值。)
代码如下:
分析:书上给出了数学方面的思考然后给了代码。但是我感觉如果真是面试或者考试遇到的话,我这种笨脑袋肯定是想不出来的,因此最好的方式是观察数组,然后找到规律。观察可知,数字递增的方向只有4个:right, left-down, down, right-up。因此我们可以设置一个switch语句,然后每走一步,判断下步要走的方向。因为输出的是n*n的数组,因此矩阵的右下角的数字肯定不会超过n*n,用它作为结束条件即可。
(需要注意的是:刚开始做时忘记考虑矩阵赋值了一半时,右下角的怎么赋值。因此每个方向走完了,下一步都会有两种方向。不要忘记右下角的赋值。)
代码如下:
public class Test { static int[][] zigzag(int n) { int[][] a = new int[100][100]; int right = 0, left_down = 1, down = 2, right_up = 3; int s = 0; int it = n * n; int flag = 0; int i = 0, j = 0; while(s <= it) { a[i][j] = s; switch (flag){ case 0: { //right j++; if(0 == i) flag = 1; else if(n-1 == i) flag = 3; break; } case 1: {//left-down i++; j--; if(j == 0) flag = 2; else if(i == n-1) flag = 0; break; } case 2: {//down i++; if(0 == j) flag = 3; else if(n-1 == j) flag = 1; break; } case 3: { i--; j++; if(0 == i) flag = 0; else if(n-1 == j) flag = 2; break; } } s++; } return a; } public static void main(String[] args) { // TODO Auto-generated method stub int n = 7; int[][]a = zigzag(n); for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { System.out.print(a[i][j] + " "); } System.out.println(); } } }
相关文章推荐
- 面试题42:数字在排序数组中出现的次数
- 程序员必须知道的10大基础实用算法及其讲解
- 面试题41:两个链表的第一个公共结点
- 12本最具影响力的程序员书籍(上)
- 代码面试最常用的10大算法
- 程序员的数学--简单的读书笔记
- iOS 面试题 11-20
- 不只是给面试加分 -- Java WeakReference的理解与使用
- 2015年阿里、网易、中兴、华为、美团等Java研发工程师面试心得
- 一个合格的程序员应该读过哪些书
- 月薪3万的程序员都避开了哪些坑
- 程序员的最高境界:呆若木鸡
- Android 面试题目总结(2)
- 程序员能力矩阵
- 程序员如何买保险?
- 这些年,我遇到过的奇葩面试官
- 程序员的3种美德
- 程序员的最高境界:呆若木鸡
- 程序开发路上的历程(上)
- iOS 面试题 10题目