题解 | #蛇形矩阵#

蛇形矩阵

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即是这个代码的思路

全部评论

相关推荐

评论
7
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务