【北京直真笔试题】打印数组如下44数组,要求打印NN的数组?
1 12 11 10
2 13 16 9
3 14 15 8
4 5 6 7
【思路】:

1.发现规律
如上图所示,仔细发现是有规律的,先第1、2、3、4步骤;我们发现第5、6、7…步骤和前面的1、2、3、4步骤是相同的,只是边界值不同。
2.考虑实现
实现的问题转换为先定义二维数组,数组的元素为0.然后的操作就是填值的过程。边界值的确定采用层层剥离的思想。我们容易看出循环的次数正是N/2次。存在当N为奇数时需要单独处理最后一个数的情况。
【算法实现】:
//design[思想:层层剥离.]
void designArray(int nArray[][g_nCnt], int nSize){ int n = 1; for(int i = 0; i < g_nCnt/2; i++) { for(int j = i; j < g_nCnt-i; j++) { nArray[i][j] = n ++; } for(int j = i+1; j < g_nCnt-i; j++) { nArray[j][g_nCnt-i-1] = n ++; } for(int j = g_nCnt-i-2; j >= i; j--) { nArray[g_nCnt-i-1][j] = n ++; } for(int j = g_nCnt-i-2; j > i; j--) { nArray[j][i] = n ++; } if(nSize%2 == 1) { nArray[nSize/2][nSize/2] = n ; } }//end for i} //printArrayvoid printArray(int nArray[][g_nCnt], int nSize){ static int s_nCnt = 0; cout << "----------------------DESIGN " << ++s_nCnt ; cout << "----------------------" << endl; for(int i=0; i <nSize; i++) { for(int j =0; j < nSize; j++) { cout << nArray[i][j] << " "; }//end for j cout << endl; }//end for i cout << "----------------------DESIGN " << s_nCnt ; cout << "----------------------" << endl; cout << endl << endl;} void designArray_t(int nArray[][g_nCnt], int nSize){ int n = 1; for(int i = 0; i < g_nCnt/2; i++) { for(int j = i; j < g_nCnt-i; j++) { nArray[j][i] = n ++; } for(int j = i+1; j < g_nCnt-i; j++) { nArray[g_nCnt-i-1][j] = n ++; } for(int j = g_nCnt-i-2; j >= i; j--) { nArray[j][g_nCnt-i-1] = n ++; } for(int j = g_nCnt-i-2; j > i; j--) { nArray[i][j]= n ++; } if(nSize%2 == 1) { nArray[nSize/2][nSize/2] = n ; //N为奇数,最后元素的处理. } }//end for i}[运行结果]:

或者大家还有什么好的思路,欢迎交流探讨!
继续阅读与本文标签相同的文章
上一篇 :
Java内存模型(定义Java内存模型)详细讲解
下一篇 :
在NLP中,词性标注有个很多重要用途
-
精彩回放|《安全说道》节目合集
2026-05-18栏目: 教程
-
实时 OLAP 系统 Druid
2026-05-18栏目: 教程
-
简单了解 Knative Eventing 0.9 版本新特性
2026-05-18栏目: 教程
-
Mybatis源码的9种设计模式
2026-05-18栏目: 教程
-
x86-64 寄存器只有6个寄存器来存参数,那 C 函数为什么还能超过6个参数
2026-05-18栏目: 教程
