题解 | #蛇形矩阵#
蛇形矩阵
http://www.nowcoder.com/practice/649b210ef44446e3b1cd1be6fa4cab5e
思路:
第0行的元素(行和列都从0开始) 可以用等差数列求和的思想
第0列的元素(行和列都从0开始) 也可以用等差数列求和的思想
看题之前,先分析下这个。如何表示下面这行元素:
1 2 3 4 5 6 7
int sum = 1;
1 = sum;
2 = (1)+1;
3 = (1+2)+1
4 = (1+2+1)+1
每个元素可以表示为 sum = sum + 1; 这个很好理解吧
如果你有疑问,这不是i++吗,是的,i = i + 1;和 sum = sum + 1; 结果是一样的。为了更好的理解此题,这里用sum表示,因为i++更容易让大家想到是顺序的增加,而这里强调的是每个元素与元素和(结果)之间的关系。
对于此题
每行的元素可以看成是等差数列的和(上面例子中加的数是不变的,一直是1,这里加的数是递增的),比如:
第0行:
第0个元素:sum = 1;
第1个元素:sum = sum + 2;// 3: 1 + 2
第2个元素:sum = sum + 3;// 6: 3 + 3
第n个元素:sum = sum + j;
解析A
此题,第0行的元素(即 第0行每列的元素)可以表示为:
int xSum = 1;
int inputNum = 5;//假设输入的数
int j = 2;//第1个数等于第0个数+2,即加的数从 2 开始
for (int n = 0; n < inputNum; n++) {
System.out.print(xSum + " ");
xSum = xSum + j;
j = j + 1;// +2, +3
}
解析B
每列的元素也可以看成是等差数列的和,比如:
第0列:
第0个元素:sum = 1;
第1个元素:sum = sum + 1;// 2: 1 + 1
第2个元素:sum = sum + 2;// 4: 2 + 2
第m个元素:sum = sum + i;
此题,第0列的元素(即 第0列每行的元素)可以表示为:
int ySum = 1;
int inputNum = 5;//输入的数
int i = 1;//第1个数等于第0个数+1,即加的数从 1 开始
for (int m = 0; m < inputNum; m++) {
System.out.print(ySum + " ");
ySum = ySum + i;
i = i + 1;// +1, +2
}
解析C
因为第0列的每个元素,都是每一行的首个元素(比如1是第0行首元素,2是第1行首元素,4是第2行首元素...),所以遍历的过程中,如果换行了(比如遍历到第2行了),则需要将通过等差数列思想求出来的列元素 赋值给这一行的首个元素,即xSum = ySum;
解析D
第0行加的数是从2开始:1,1+2,(1+2)+3,(1+2+3)+4
第1行加的数是从3开始:2,2+3,(2+3)+4,(2+3+4)+5
第2行加的数是从4开始:4,4+4,(4+4)+5,(4+4+5)+6
则,第m行加的数就是 m+2,即没行第一加的数 跟行的关系是 m+2;
这样再理解下面的代码,就好理解了
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) {
int xSum = 1;
int ySum = 1;
Scanner sc = new Scanner(System.in);
int inputNum = sc.nextInt();
int i = 1;//列的每个元素开始加的数,见解析B
for (int m = 0; m < inputNum; m++) {
int j = 2 + m;//见解析D
//下面for循环里面的是遍历第m行的元素,见解析A
//内循环外的可以理解为列的遍历,内循环外的见解析B
for (int n = 0; n < inputNum - m; n++) {
System.out.print(xSum + " ");
xSum = xSum + j;
j++;
}
ySum = ySum + i;
i++;
xSum = ySum;//见解析C
System.out.println();
}
sc.close();
}
}
将A、B混合到一块,加上C、D即是这个代码的思路

