1.题目
这个题目意思就是,按照这个蛇形把数字一一填出来,然后找出第20行第20列的数是多少。
2.理解
其实我也没有多少经验,首先想到的是,声明一个20*20的二维数组,然后把数字从1开始填进去,但是后来发现麻烦了。
然后我就在纸上画图,进行对比。
那么我可以发现,n行n列对应的数字为
不难发现,5 = 1 + 4 * 1;13 = 5 + 4 * 2;25 = 13 + 4 * 3 …
那么这就有一个规律,在n行n列中的数nextnum和(n-1)行(n-1)列中的数lastnum有着这么一种关系:nextnum = lastnum + 4 * (n - 1),这里的n是nextnum所在的行(行列相同,n行n列),由此,我们可以用两种不同的方法实现来求解
3.for循环实现
1.算法
(1)声明ret = 1,如果n不大于1,则不进入循环,否则进入循环,(取i=2开始,循环条件为i<=n),执行ret = ret + 4 * (n - 1);
(2)返回ret;
2.代码
int getNum_circulate(int n){
int ret = 1;
for(int i = 2;i <= n;i++){
ret = ret + 4 * (n - 1);
}
return ret;
}
4.递归实现求解
递归和循环在一定程度上是可以替换的,因为这都是逐渐求解的思想。
1.算法
假设我们把n行n列对应的数字看作result,由上我们知道:
result(n) = result(n - 1) + (n - 1) * 4,则有
(1)如果n等于1则直接返回1
(2)如果n不等于1,则返回(n-1) * 4 + result(n-1)
2.代码
int getNum_recursion(int n){
if(n == 1){
return 1;
}
return (n - 1) * 4 + getNum_recursion(n - 1);
}
5.结语
当局者迷,旁观者清,身临其境的时候肯定会急,所以面对一个看似复杂的题目,特别是有时间限制做出来时,是会感觉有压力吧,所以多练习练习,让自己稳点。