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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

zhangbo123

中级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© zhangbo123 中级黑马   /  2015-11-5 21:45  /  3503 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
输出 n=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

17 个回复

倒序浏览
前两天的笔试题,你看看吧,应该对你有帮助。
/*
*  写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:     
* 示例
*         1        2        3        4
*
*        12        13        14        5
*
*        11        16        15        6
*
*        10        9        8        7
*思路:1.给二维数组复制肯定使用循环
*    2.找规律,然后循环
*    3.每一圈为一次大循环,然后四个边各遵循一个规律,总结归路
*    4.打印
*/
public class Test9 {

        public static void main(String[] args) {

                int n = 6;
                int count = 1;
                int[][] arr = new int[n][n];

                // 循环圈数,以大圈为准,大圈规律,开始数组角标x=y=z;z表示第z-1圈
                for (int z = 0; z < (n + 1) / 2; z++) {

                        // 上横排规律,x不变,y自增
                        for (int x = z, y = z; y < n - z - 1; y++) {
                                arr[x][y] = count++;
                        }
                       
                        // 右竖排,y不变,x自增
                        for (int x = z, y = n - z - 1; x < n - z - 1; x++) {
                                arr[x][y] = count++;
                        }
                       
                        // 下横排,x不变,y自减
                        for (int x = n - z - 1, y = x; y >= z; y--) {
                                arr[x][y] = count++;
                        }
                       
                        // 右竖排,y不变,x自减
                        for (int x = n - z - 2, y = z; x > z; x--) {
                                arr[x][y] = count++;
                        }
                }
               
                // 打印
                for (int i = 0; i < n; i++) {
                        for (int j = 0; j < n; j++) {
                                System.out.print("        " + arr[i][j]);
                        }
                        System.out.println();
                        System.out.println();
                }
        }
}
回复 使用道具 举报
顶个帖子
回复 使用道具 举报
import java.util.Scanner;
class Demo
{
public static void main(String[] args) {
  int size=5;
  Scanner sc=new Scanner(System.in);
  System.out.println("输入数组大小:");
  size=sc.nextInt();
  
  int count=0;  
  int [][]array=new int[size][size];
  int m=0,n=0;
  int down,right,up=0,left=0;
  down=size-1;
  right=size-1;
  int max=size*size;
  while(true){
   count++;
   if(m==up){
    array[m][n]=count;
    n++;
    if(n>right){
     n=right;
     m++;
    }
   }
   else if(n==right){
    array[m][n]=count;
    m++;
    if(m>down){
     m=down;
     right--;
    }
   }
   else if(m==down){
    array[m][right]=count;
    right--;
    if(right<left){
     right=left;
     down--;
    }
   }
   else if(right==left){
    array[down][left]=count;
    down--;
    if(down<=up){
     down=up;
     left++;
    }
   }
   else{
           up++;
           down=n-1;
           right=m-1;
           m=up;
           n=left;
           count--;
   }
   
         if(count>=max){
                break;
                }
  }// end loop
  for (int i = 0; i < size; i++) {
   for (int j = 0; j < size; j++) {
    System.out.print(array[i][j]+"\t");
                        }
        System.out.println();
        }
   }
}
回复 使用道具 举报
这面试题好难啊,对于我这新手来说基本没戏
回复 使用道具 举报
马克一下.....
回复 使用道具 举报
大自然的搬运工 发表于 2015-11-6 00:04
前两天的笔试题,你看看吧,应该对你有帮助。
/*
*  写一方法,打印等长的二维数组,要求从1开始的自然数 ...

解答不错,有没有更好的算法啊。
回复 使用道具 举报
这个题目很经典啊
回复 使用道具 举报
main()
{void build_array(int a[],int m,int n);
int a[15][15]={0};
int m,n;
printf("please input the fac nuuber of the uatrix m and n:(1~15):");
scanf("%d,%d",&m,&n);
build_array(a,m,n);
}
void build_array(int a[],int m,int n)
{int i,j,k=0,u=0;
do
{
for(j=u,i=u;i<m-u;i++)
{k++;
a[i*n+j]=k;
}
for(i=m-u-1,j=u+1;j<n-u;j++)
{k++;
a[i*n+j]=k;
}
for(j=n-u-1,i=m-u-2;i>=u;i--)
{k++;
a[i*n+j]=k;
}
for(i=u,j=m-u-2;j>u;j--)
{k++;
a[i*n+j]=k;
}
u++;
}while(u<=(m+n+1)/2);
printf("\nThe uatrix is:\n");
for(i=0;i<m;i++)
{for(j=0;j<n;j++)
printf("%4d",a[i*n+j]);
printf("\n");
}
}
回复 使用道具 举报
Jared 中级黑马 2015-11-8 22:32:19
10#
挺有意思的题啊
回复 使用道具 举报
  1. import java.util.Scanner;
  2. public class SpiralMatrix {
  3.         public static void main(String [] args){
  4.                 Scanner scn= new Scanner(System.in);
  5.                 System.out.println("请输入螺旋方阵的阶数: ");
  6.                 int order=scn.nextInt();
  7.                
  8.                 SpiralMatrix sm=new SpiralMatrix();
  9.                 sm.printClockWise(order);
  10.         }
  11.         //找到一个函数能够计算出order阶矩阵中  row 行, col列上的数值大小, 想到递归
  12.         public int getValue(int row, int col, int order) {
  13.                 //基准条件
  14.                 if(1==order)      //最简单的一阶
  15.                         return order;
  16.                 if(0==order)      //偶数阶的最简单形式
  17.                         return order;
  18.                
  19.                 // 高阶矩阵而元素又位于矩阵的最外层, 能够通过简单的计算得出.
  20.                 //由于涉及多个 return语句, 只用if即可 .
  21.                 if(0==row)
  22.                         return col+1;
  23.                 if (col==order-1)
  24.                         return col+row+1;
  25.                 if(row==order-1)
  26.                         return 3*order-2-col;
  27.                 if(0==col)
  28.                         return 4*order-3-row;
  29.                 //所有简单的情况排除后,进行脱阶运算.
  30.                 return (order*4-4)+getValue(row-1, col-1, order-2);
  31.         }
  32.         public void  printClockWise(int order) {
  33.                 int value;
  34.                 for(int i=0;i<order; i++) {
  35.                         for(int j=0;j<order; j++) {
  36.                                 value=getValue(i,j,order);
  37.                                 System.out.print(value+"\t");
  38.                         }
  39.                         System.out.println();
  40.                 }
  41.         }
  42. }
复制代码
回复 使用道具 举报

  1. /*
  2. 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:     
  3. */
  4. class Test8
  5. {
  6.         public static void main(String[] args)
  7.         {
  8.                 printArray(10);

  9.                 System.out.println("Hello World!");
  10.         }
  11.         public static void printArray(int len){
  12.                
  13.                 //定义递增
  14.                 int val=1;
  15.                 //定义二维数组
  16.                 int[][] it=new int[len][len];
  17.                 //定义循环次数,如果为偶数,则循环测试为长度的一般,如果为奇数,则为长度-1的一半
  18.                 int count=len%2==0? len/2:(len-1)/2;
  19.                 for(int x=0;x<count;x++){
  20.                         //定义口子上面的数字顺序
  21.                         for(int i=x,j=i;j<len-x;j++){
  22.                                 it[i][j]=val++;
  23.                                        
  24.                         }
  25.                         //定义右面的数字顺序
  26.                         for(int j=len-x-1,i=x+1;i<len-x;i++){
  27.                                 it[i][j]=val++;
  28.                         }
  29.                         //定义下面的数字顺序
  30.                         for(int i=len-x-1,j=len-x-2;j>x-1;j--){
  31.                                 it[i][j]=val++;
  32.                         }
  33.                         //定义左面的数字顺序
  34.                         for(int j=x,i=len-x-2;i>x;i--){
  35.                                 it[i][j]=val++;
  36.                         }
  37.                
  38.                 }
  39.                 if(len%2==1){
  40.                         it[(len-1)/2][(len-1)/2]=val++;
  41.                 }
  42.                 for(int m=0;m<len;m++){
  43.                         for(int n=0;n<len;n++){
  44.                                 System.out.print(it[m][n]+"\t");
  45.                         }
  46.                         System.out.println();
  47.                 }
  48.         }
  49. }
复制代码
回复 使用道具 举报
学习一下
回复 使用道具 举报
陌忆 中级黑马 2015-11-10 22:49:15
14#
算法有很多种,反正第一行是打印1.。。。。n,n为奇数,最大数在n+1/2行n+1/2列,为偶数就在n/2+1行n/2列,最大数为n的平方,说白了就是以正方形遍历1.。。。。n*n找出规律总结出来
回复 使用道具 举报
import java.util.Scanner;

public class Helix {

/**
  * 螺旋输
  */
public static void main(String[] args) {
  int size=5;
  Scanner sc=new Scanner(System.in);
  System.out.println("输入数组:");
  size=sc.nextInt();
  
  int count=0;  
  int [][]array=new int[size][size];
  int m=0,n=0;
  int down,right,up=0,left=0;
  down=size-1;
  right=size-1;
  int max=size*size;
  while(true){
   count++;
   if(m==up){
    array[m][n]=count;
    n++;
    if(n>right){
     n=right;
     m++;
    }
   }
   else if(n==right){
    array[m][n]=count;
    m++;
    if(m>down){
     m=down;
     right--;
    }
   }
   else if(m==down){
    array[m][right]=count;
    right--;
    if(right<left){
     right=left;
     down--;
    }
   }
   else if(right==left){
    array[down][left]=count;
    down--;
    if(down<=up){
     down=up;
     left++;
    }
   }
   else{
   up++;
   down=n-1;
   right=m-1;
   m=up;
   n=left;
   count--;
   }
   /////////////////////////////////////////////
   if(count>=max){
    break;
   }
  }// end loop
  for (int i = 0; i < size; i++) {
   for (int j = 0; j < size; j++) {
    System.out.print(array[i][j]+"\t");
   }
   System.out.println();
  }
   }
}
回复 使用道具 举报
import java.util.Scanner;

public class Helix {

/**
  * 螺旋输出
  */
public static void main(String[] args) {
  int size=5;
  Scanner sc=new Scanner(System.in);
  System.out.println("输入数组大小:");
  size=sc.nextInt();
  
  int count=0;  
  int [][]array=new int[size][size];
  int m=0,n=0;
  int down,right,up=0,left=0;
  down=size-1;
  right=size-1;
  int max=size*size;
  while(true){
   count++;
   if(m==up){
    array[m][n]=count;
    n++;
    if(n>right){
     n=right;
     m++;
    }
   }
   else if(n==right){
    array[m][n]=count;
    m++;
    if(m>down){
     m=down;
     right--;
    }
   }
   else if(m==down){
    array[m][right]=count;
    right--;
    if(right<left){
     right=left;
     down--;
    }
   }
   else if(right==left){
    array[down][left]=count;
    down--;
    if(down<=up){
     down=up;
     left++;
    }
   }
   else{
   up++;
   down=n-1;
   right=m-1;
   m=up;
   n=left;
   count--;
   }
   /////////////////////////////////////////////
   if(count>=max){
    break;
   }
  }// end loop
  for (int i = 0; i < size; i++) {
   for (int j = 0; j < size; j++) {
    System.out.print(array[i][j]+"\t");
   }
   System.out.println();
  }
   }
}
回复 使用道具 举报
顶一个哈哈哈
回复 使用道具 举报
我就看看 跟大神学习一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马