Java-NowCoder-蛇形矩阵

//题目说明
//蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
//样例输入
//5
//样例输出
//1 3 6 10 15
//2 5 9 14
//4 8 13
//7 12
//11
//接口说明
//原型
//void GetResult(int Num, char * pResult);
//输入参数:
//        int Num:输入的正整数N
//输出参数:
//        int * pResult:指向存放蛇形矩阵的字符串指针
//        指针指向的内存区域保证有效
//返回值:
//        void
//输入描述:
//输入正整数N(N不大于100)
//输出描述:
//输出一个N行的蛇形矩阵。
//
//输入例子:
//4
//输出例子:
//1 3 6 10
//2 5 9
//4 8

//7

此题目要求的是打印蛇形矩阵,其思路的关键是确定要求的下一个位置的点和已知点的关系。本题中给出两种解答方法,但是两种方法的思路基本上是一致的,都是通过先确定第一行或者第一列的数值,然后依次推出其位置处的值。说明:第一种方法在牛客网站可以测试通过,但第二种方法只能在本机测试通过,在牛客网站测试不通过。自己也没找出原因,若测试通过的朋友可以留言。

第一种方法:

package test;
import java.util.Scanner;
public class NC_035_蛇形矩阵 {	
	public static void main(String args[]){
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()){
			int n=sc.nextInt();
			StringBuilder builder = new StringBuilder();   
			for (int i = 1; i <= n; i++) {
				// 每一行的第一个元素是(i-1)*i/2+1
				// 每一行的元素个数是n-i
				// 初始间隔是i+1,之后每一个间隔比上一个间隔多1,之后的每个元素是前一个元素加上间隔
				for (int j = 1, start = (i - 1) * i / 2 + 1, step = i + 1; 
						j <= n - i + 1; j++, start += step, step++) {
					builder.append(start).append(' ');
				}
				// 设置换行符
				builder.setCharAt(builder.length()-1, '\n');				
			}
			System.out.print(builder.toString());
		}
	}
		
}

第二种方法 :

import java.util.Scanner;

public class NC_035_蛇形矩阵 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()){
			int n = sc.nextInt();
			if(n < 0 || n > 100){
				return ;
			}
			int[][] result = new int[n][n];
			GetResult(n,result);
		}
	}
	public static void  GetResult(int N,int[][] result){
		result[0][0] = 1;
		for(int i = 1; i < N; i++){
			result[i][0] = result[i-1][0] + i;//先计算出第一列数字
			result[0][i] = result[0][i-1] + i + 1;//计算出第一行数字
			
			for(int j = 1; j <= N; j++){
				if(i + j < N)//由于只对矩阵的上三角进行赋值操作,故要满足i+j<N
					result[i][j] = result[i][j-1] + i + j + 1;//关键是找出(i,j)和(i,j-1)的函数关系
			}			
		}
		
		for(int i = 0; i < N; i++){
			for(int j = 0; j< N; j++){
				if(i+j < N)//只显示矩阵的上三角部分
					System.out.print(result[i][j] + " ");
			}
			System.out.println();
		}
	}
}
注:这两种方法的本质都是一样的,在算法的实现过程中时间复杂度都是O(n^2)级别的,自己在测试过程中想找出在O(n)级别时间内打印的结果,及让打印出的最大值n*(n+1)/2作为控制循环的条件,但是一直都没有实现,如果有朋友感兴趣或者测试通过O(n)级别的时间打印出来,可以留言一起交流。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值