额,因为上次在做小米面试题目的时候碰到了这样的一个题目,如下
说是打印1000*1000数组中的某个位置的数字,但是这些数字是按找回型排列的。
如:
1 2 3 4 5 6 7 8
28 29 30 31 32 33 34 9
27 48 49 50 51 52 35 10
26 47 60 61 62 53 36 11
25 46 59 64 63 54 37 12
24 45 58 57 56 55 38 13
23 44 43 42 41 40 39 14
22 21 20 19 18 17 16 15
思路:把这个数组看成一个回字形,然后回字里面再包裹一个回字。。。。
把每个数字的数组索引写在一旁做参考,能够帮助自己很快的找到想要位置。
先给上面最外边第一条数组赋值,方向是从左到右→
给第二条数组赋值,方向是从上到下↓
第三条,从右到左←
第四条,从下到上↑
上面几步为一个循环,反复重复上面的步骤。。
下面上代码,因为我想起了火影忍着里的鸣人- - 。
class naratoArr {
public static void main (String [] args) {
int gs = 8;
narato(gs);
}
static void narato (int size) {
int start = 0; //坐标的起始点
int end = size-1; //坐标的终止点
int values = 1; //每个坐标内的值,不断变化
int arr[][] = new int [size][size]; //二维方阵,里面每个元素的值都是values变量代表的
while (true) { //一直循环
if (start>=end) break; //当方阵的大小为奇数时,起始点等于终止点,就意味着在最里面的一圈了。但最中心还剩一个坐标
//为偶数时,起始点比终止点小1,在最里面的圈子。最中心没有坐标了
for (int i=start; i<=end; i++) { //如方阵为5时,为arr[0][0~4]进行赋值,方向从左到右,values值不断递增
arr[start][i] = values;
//System.out.print(values);
values++;
}
for (int i=start+1; i<=end; i++) { //如方阵为5时,为arr[0~4][4]进行赋值,方向从上到下,values值不断递增
arr[i][end] = values;
values++;
//System.out.print(values);
}
for (int i=end-1; i>=start; i--) { //如方阵为5时,为arr[4][3~0]进行赋值,方向从右到左,values值不断递增
arr[end][i] = values;
values++;
//System.out.print(values);
}
for (int i=end-1; i>start; i--) { //如方阵为5时,为arr[3~1][0]进行赋值,方向从下到上,values值不断递增
arr[i][start] = values;
values++;
//System.out.print(values);
}
start++; //两个坐标都减1,就像是方阵小了一圈
end--;
}
//System.out.println(start+""+end);
if ((size%2)==1) //当方阵大小为奇数时,为最中心的点赋值
arr[start][end] = size*size;
for (int i=0; i<size; i++) { //遍历二维数组,并打印
for (int j=0; j<size; j++)
System.out.print(arr[i][j]+"\t");
System.out.println();
}
}
}