iteye_5215 2009-12-15 11:39
浏览 224
已采纳

遇到了一个面试题, 要求顺时针打印数字, 好像在问答里看到过, 但再也没找到

这道题在javaeye上好像见过, 估计是一家公司的面试. 呵呵.
题目要求输入一个大于1的数字, 按顺时针转圈圈打印数字, 打印的数字范围从1到这个数字的平方, 本人苦思半天做了出来, 面试的说代码太长了. 求更简单方法.
如输入数字5, 则打印如下形式的数字
1 2 3 4 5

16 17 18 19 6

15 24 25 20 7

14 23 22 21 8

13 12 11 10 9

如输入数字6, 则打印如下形式的数字
1 2 3 4 5 6

20 21 22 23 24 7

19 32 33 34 25 8

18 31 36 35 26 9

17 30 29 28 27 10

16 15 14 13 12 11

本人苦思半个多小时的代码, 其中grid的值就是那个输入的数字
public class QuanQuan {

public static void main(String[] args) {        
    int grid = 6;
    int min = 0;
    int max = grid -1 - min;
    int[][] datas = new int[grid][grid];
    int first = 1;      
    while(true) {
        first = printRowFromMinToMax(min, max, min, first, datas);
        first = printColFromMinToMax(min, max, max, first, datas);
        first = printRowFromMaxToMin(min, max, max, first, datas);
        first = printColFromMaxToMin(min, max, min, first, datas);
        min = min + 1;
        max = grid - 1 - min;
        if (min == max) {
            datas[min][max] = first;
            break;
        }
        if (min > max) {
            break;
        }
    }

    for (int[] data:datas){
        for (int d:data) {
            System.out.print(d + "\t");
        }
        System.out.println();
    }

}

public static int printRowFromMinToMax(int minCol, int maxCol, int row, int first, int[][] datas) {
    for (int col=minCol; col<maxCol; col++) {
        datas[row][col] = first;
        first++;
    }
    return first;
}

public static int printRowFromMaxToMin(int minCol, int maxCol, int row, int first, int[][] datas) {
    for (int col=maxCol; col>minCol; col--) {
        datas[row][col] = first;
        first++;
    }
    return first;
}
public static int printColFromMinToMax(int minRow, int maxRow, int col, int first, int[][] datas) {
    for (int row=minRow; row<maxRow; row++) {
        datas[row][col] = first;
        first++;
    }
    return first;
}
public static int printColFromMaxToMin(int minRow, int maxRow, int col, int first, int[][] datas) {
    for (int row=maxRow; row>minRow; row--) {
        datas[row][col] = first;
        first++;
    }
    return first;
}

}

  • 写回答

1条回答 默认 最新

  • CaiHuajiang 2009-12-15 18:21
    关注

    [code="java"]public class Test {
    static int n = 10;
    static int[][] arr = new int[n][n];

    public static void main(String[] args) {
        int x = 0, y = 0;
        for (int i = 1; i <= n * n; i++) {
            arr[x][y] = i;
            if (canSet(x + 1, y) && !canSet(x, y - 1)) {
                x = x + 1;
            } else if (canSet(x, y + 1) && !canSet(x + 1, y)) {
                y = y + 1;
            } else if (canSet(x - 1, y) && !canSet(x, y + 1)) {
                x = x - 1;
            } else if (canSet(x, y - 1) && !canSet(x - 1, y)) {
                y = y - 1;
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print(arr[j][i] + " ");
            }
            System.out.println("");
        }
    }
    
    private static boolean canSet(int x, int y) {
        if (x < 0 || y < 0 || x >= n || y >= n)
            return false;
        if (arr[x][y] != 0)
            return false;
        return true;
    }
    

    }[/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器