黑马程序员技术交流社区

标题: 关于打印二维数组的一道面试题分享下,初学,不喜勿喷 [打印本页]

作者: 209920266    时间: 2015-1-21 10:53
标题: 关于打印二维数组的一道面试题分享下,初学,不喜勿喷
本帖最后由 209920266 于 2015-1-22 08:34 编辑

package com.itheima;

import java.util.Scanner;

public class Test11 {

        public static void main(String[] args) {
                System.out.println("请输入一个大于0的整数");
                Scanner sc = new Scanner(System.in);
                int num = sc.nextInt();
                print(num);
        }

        private static void print(int num) {
                int[][] arr = new int[num][num];// 定义等长的二维数组。
                int x = 0;// x控制横坐标
                int y = 0;// y控制纵坐标
                int n = arr.length;
                int value = 0;
                getArr(arr, x, y, n, value);
                printArr(arr);// 执行打印
        }

        private static void printArr(int[][] arr) {
                // 双重循环打印
                for (int[] ar : arr) {// 外循环,遍历二维数组中的一维数组
                        for (int a : ar) {// 内循环,遍历一位数组中的每一个元素
                                System.out.print(a + "\t");

                        }
                        System.out.println();
                }
        }

        private static void getArr(int[][] arr, int x, int y, int n, int value) {
                if (n > 0) {
                        // (n-1)*4代表每一圈的数值范围
                        for (int i = 0; i < (n - 1) * 4; i++) {
                                if (i < n - 1) {// 上
                                        arr[x][y] = ++value;
                                        y++;
                                } else if (i < 2 * n - 2) {// 右
                                        arr[x][y] = ++value;
                                        x++;
                                } else if (i < 3 * n - 3) {// 下
                                        arr[x][y] = ++value;
                                        y--;
                                } else if (i < 4 * n - 4) {// 左
                                        arr[x][y] = ++value;
                                        x--;
                                }
                        }
                        // 通过上面的循环,x,y的值为此圈循环的起始坐标,下一圈的起始位置为x+1,y+1
                        n -= 2;// 边界每次减少2
                        x += 1;// 下一圈起始横坐标值
                        y += 1;// 下一圈起始纵坐标值
                        if (n == 1)// 特殊情况,最里圈只有一个值
                                arr[x][y] = value + 1;
                        getArr(arr, x, y, n, value);// 递归
                }

        }
}


作者: '丫头片子'    时间: 2015-1-21 18:54
路过,写的挺好
作者: d7142947    时间: 2015-1-21 23:01
学习学习
作者: xiaoyi    时间: 2015-1-22 15:51
学习一下




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