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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© bjuth 中级黑马   /  2014-12-25 11:11  /  1651 人查看  /  15 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 bjuth 于 2014-12-25 11:47 编辑

最近一直在做各位学长学姐提供的面试题,感觉还没有融汇贯通,心里没底,都不敢面了

昨天也看到了打印正方形的题,自己写了一个,用了一下枚举,感觉不错,分享一下

理解上很容易,就是效率不高,各位多指点:)

不过通过枚举,应该可以打印很多有趣的图形

  1. package com.success;

  2. /*写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
  3. 1    2    3    4
  4. 12   13   14   5
  5. 11   16   15   6
  6. 10   9    8    7*/
  7. /**
  8. *
  9. * @author 魏超
  10. * @date 2014年12月24日 下午2:43:04
  11. */
  12. public class Success15 {
  13.         public static void sop(Object obj) {
  14.                 System.out.println(obj);
  15.         }

  16.         public static void main(String[] args) {

  17.                 int v = 9;// 边长

  18.                 int[][] arr = new int[v][v];
  19.                 arr = func(v);

  20.                 for (int[] ar : arr) {// 遍历打印
  21.                         for (int a : ar) {
  22.                                 if (a < 10)
  23.                                         System.out.print(" " + a + " ");
  24.                                 else
  25.                                         System.out.print(a + " ");
  26.                         }
  27.                         System.out.println();
  28.                 }

  29.         }

  30.         static int[][] func(int v) {
  31.                 int[][] arr = new int[v][v];

  32.                 int x = v - 1, y = v - 1;// 起点
  33.                 arr[v - 1][v - 1] = 1;// 起点初值
  34.                 Dir dir = Dir.left;// 初始方向

  35.                 for (int i = 0; i < 2 * v - 1; i++) {// 2*v-1 为方向改变次数
  36.                         if (String.valueOf(dir).equals("right")) {
  37.                                 // sop(y + " " + (x + 1) + ":" + arr[y][x + 1]);
  38.                                 while (arr[y][x + 1] == 0) {
  39.                                         arr[y][x + 1] = arr[y][x] + 1;
  40.                                         x++;
  41.                                         if (x == v - 1) {// 防止第一圈数组越界
  42.                                                 // sop(y + " " + x);
  43.                                                 break;
  44.                                         }
  45.                                 }
  46.                         }
  47.                         if (String.valueOf(dir).equals("down")) {
  48.                                 // sop((y + 1) + " " + x + ":" + arr[y + 1][x]);
  49.                                 while (arr[y + 1][x] == 0) {
  50.                                         arr[y + 1][x] = arr[y][x] + 1;
  51.                                         y++;
  52.                                         if (y == v - 1) {// 防止第一圈数组越界
  53.                                                 // sop(y + " " + x);
  54.                                                 break;
  55.                                         }
  56.                                 }
  57.                         }
  58.                         if (String.valueOf(dir).equals("left")) {
  59.                                 // sop(y + " " + (x - 1) + ":" + arr[y][x - 1]);
  60.                                 while (arr[y][x - 1] == 0) {
  61.                                         arr[y][x - 1] = arr[y][x] + 1;
  62.                                         x--;
  63.                                         if (x == 0) {// 防止第一圈数组越界
  64.                                                 // sop(y + " " + x);
  65.                                                 break;
  66.                                         }
  67.                                 }
  68.                         }
  69.                         if (String.valueOf(dir).equals("up")) {
  70.                                 // sop((y - 1) + " " + x + ":" + arr[y - 1][x]);
  71.                                 while (arr[y - 1][x] == 0) {
  72.                                         arr[y - 1][x] = arr[y][x] + 1;
  73.                                         y--;
  74.                                         if (y == 0) {// 防止第一圈数组越界
  75.                                                 // sop(y + " " + x);
  76.                                                 break;
  77.                                         }
  78.                                 }
  79.                         }
  80.                         // sop(dir.nextDir());
  81.                         dir = dir.nextDir();// 切换方向
  82.                 }
  83.                 return arr;
  84.         }
  85. }

  86. enum Dir {
  87.         right("down"), down("left"), left("up"), up("right");
  88.         String nextDir;

  89.         Dir(String nextDir) {
  90.                 this.nextDir = nextDir;
  91.         }

  92.         Dir nextDir() {
  93.                 return Dir.valueOf(nextDir);
  94.         }

  95. }
复制代码



无标题.png (194.12 KB, 下载次数: 9)

无标题.png

点评

几年前的题了,没发现最近几个月都不考枚举了么,技术在变,题库也在变。  发表于 2014-12-25 16:03

15 个回复

倒序浏览
本帖最后由 bjuth 于 2014-12-25 11:48 编辑

还真是不会用论坛
回复 使用道具 举报
  1. public class Test9 {
  2.         static int n=1;       
  3.         public static void main(String[] args) {
  4.                 int n=20;        //二维数组长度,名称跟上面重复了,懒得改了
  5.                 int[][] arr=new int[n][n];
  6.                 for(int x=0,y=n-1;y-x>=0;x++,y--){                        //循环调用f方法
  7.                         if(y==x){                                        //当x=y时,则只有最中间的数没有赋值
  8.                                 arr[n/2][n/2]=n*n;
  9.                                 break;
  10.                         }
  11.                         f(x,y,arr);
  12.                 }
  13.                 for(int[] i:arr){                        //遍历输出
  14.                         for(int j:i){
  15.                                 System.out.print(j+"\t");
  16.                         }
  17.                         System.out.println();
  18.                 }
  19.         }
  20.         static void f(int x,int y,int[][] arr){                        //指定圈数赋值
  21.                 for(int i=x;i<=y;i++,n++){
  22.                         arr[x][i]=n;
  23.                 }
  24.                 for(int i=x+1;i<=y;i++,n++){
  25.                         arr[i][y]=n;
  26.                 }
  27.                 for(int i=y-1;i>=x;i--,n++){
  28.                         arr[y][i]=n;
  29.                 }
  30.                 for(int i=y-1;i>x;i--,n++){
  31.                         arr[i][x]=n;
  32.                 }
  33.         }
  34. }
复制代码


回复 使用道具 举报 1 0
好悲剧的有木有
回复 使用道具 举报

我下载的题里给的答案也是这个 应该是效率比较高的吧 :)
回复 使用道具 举报
bjuth 发表于 2014-12-25 11:31
我下载的题里给的答案也是这个 应该是效率比较高的吧

不是吧!  我自己做入学考试题时自己写的呀。。。准备明天面试了,完全没信心
回复 使用道具 举报
bjuth 中级黑马 2014-12-25 11:39:14
7#
本帖最后由 bjuth 于 2014-12-25 11:42 编辑
tao3634398 发表于 2014-12-25 11:34
不是吧!  我自己做入学考试题时自己写的呀。。。准备明天面试了,完全没信心 ...

哦 不好意思啊
祝你成功啊!!!!!!:)
回复 使用道具 举报
huoxy 中级黑马 2014-12-25 11:40:35
8#
面试时的代码题都很简单的,10分钟做出来就可以。楼主可以大胆的去面试,掌握好毕老师视频中的知识就可以。像这道题,如果是第一次做,估计99%的人十分钟之内做不出来,肯定不会出这种题。面试只是在短时间内检验一下你的基础是否掌握好。
回复 使用道具 举报
bjuth 中级黑马 2014-12-25 11:43:37
9#
huoxy 发表于 2014-12-25 11:40
面试时的代码题都很简单的,10分钟做出来就可以。楼主可以大胆的去面试,掌握好毕老师视频中的知识就可以。 ...

恩恩 多谢鼓励
回复 使用道具 举报
感觉也有点懵
回复 使用道具 举报
  1. package Int_sort;

  2. public class Arr_Tow {
  3.         static int[][] arr;
  4.         static int x = 0;
  5.         static int y = 0;
  6.         static int tem = 1;// 号码计录器
  7.         static int com = 0;// 循环递归记录器,每次递归,x和y的开始都会加一,而结束少一

  8.         public static void main(String[] args) {

  9.                 show(5);
  10.         }

  11.         public static void show(int nub) {//用于打印和号码判断
  12.                 if (nub < 100 && nub > 1) {
  13.                         arr = new int[nub][nub];
  14.                         sort(arr, nub);
  15.                         for (int[] ar : arr) {
  16.                                 for (int a : ar) {
  17.                                         System.out.print(a + "\t");
  18.                                 }
  19.                                 System.out.println("");
  20.                                 System.out.println("");
  21.                         }
  22.                 }else{
  23.                         System.out.println("输入的数过大或小:必须是小于 100并且大于 1的数");
  24.                 }

  25.         }

  26.         public static void sort(int[][] arr, int nub) {//对数字进行排列功能
  27.                
  28.                 for (int xx = com; xx < nub + com; xx++) {
  29.                         x = xx;
  30.                         arr[y][x] = tem++;
  31.                         // System.out.println("xx1.." + x + "==" + y + "...." + tem);
  32.                 }
  33.                 for (int yy = 1 + com; yy < nub + com; yy++) {
  34.                         y = yy;
  35.                         arr[y][x] = tem++;
  36.                 /*        System.out.println("yy1:" + "" + "::" + x + "==" + y + "........."
  37.                                         + tem);*/
  38.                 }
  39.                 for (int xx = 1 + com; xx < nub + com; xx++) {
  40.                         x--;
  41.                         arr[y][x] = tem++;
  42.                         // System.out.println("xx:" + x + "==" + y + "...." + tem);
  43.                 }
  44.                 for (int yy = 2 + com; yy < nub + com; yy++) {
  45.                         y--;
  46.                         arr[y][x] = tem++;
  47.                         /*
  48.                          * System.out.println("yy:" + "" + "::" + x + "==" + y + "........."
  49.                          * + tem);
  50.                          */
  51.                 }
  52.                 // System.out.println("号码是:" + nub);
  53.                 if ((nub - 2) >= 2) {
  54.                         com++;
  55.                         sort(arr, (nub - 2));

  56.                 } else if ((nub - 2) == 1) {
  57.                
  58.                         arr[y][x + 1] = tem++;
  59.                 }
  60.         }
  61. }
复制代码

看看我写的这个代码,功能是一样的
回复 使用道具 举报
感觉这题有点难度呢
回复 使用道具 举报
雨祭 中级黑马 2014-12-25 23:39:17
13#
这道题估计是我以后要学的内容了。。
回复 使用道具 举报
也来学习一下
回复 使用道具 举报
huoxy 发表于 2014-12-25 11:40
面试时的代码题都很简单的,10分钟做出来就可以。楼主可以大胆的去面试,掌握好毕老师视频中的知识就可以。 ...

层主精致分析啊!!还以为十分钟会让做这么有技术的题。。感谢分享经验。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马