蓝桥杯:算法提升-等腰三角形

等腰三角形

本题目要求你在控制台输出一个由数字组成的等腰三角形。
具体的步骤是:

  1. 先用1,2,3,…的自然数拼一个足够长的串
  2. 用这个串填充三角形的三条边。从上方顶点开始,逆时针填充。
    比如,当三角形高度是8时:
       1
      2 1
     3   8
    4     1
   5       7
  6         1
 7           6
891011121314151

分析:
-------思路.通过规律可得:所填充的数字不大于 2*n+3。 创建二位数组 根据规律填充数组最后打印

import java.util.Scanner;


public class Main {
/*
标题:等腰三角形

本题目要求你在控制台输出一个由数字组成的等腰三角形。
具体的步骤是:
1. 先用1,2,3,...的自然数拼一个足够长的串
2. 用这个串填充三角形的三条边。从上方顶点开始,逆时针填充。
比如,当三角形高度是8时:

       1
      2 1
     3   8
    4     1
   5       7
  6         1
 7           6
891011121314151
*/
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[][]arr = new int[n][];//二维数组
		int ii = 0;//变量代表二维数组下标
		for (int i = n; i < n*2; i++) {
			arr[ii++] = new int[i];//每一个二维数组 装一维数组
		}
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr[i].length; j++) {
				arr[i][j]=10;//填充数据两位数,因为填充的都是一位数的数据 用于最后打印
			}
		}
		int a = 1;//数字123456~~
		int bj = 1;//标记判断 加到当前数a 的第几位了(百:1, 十:2, 个:3)||(十:1, 个:2)
		//斜着向左下
		for (int j = 0; j < arr.length-1; j++) {
			//判断当前a的数值为几位数(根据数据模要求 300 根据公式算的不大于300*2+3=603 最多三位数)
			if(a<10){
				arr[j][--n] = a++;//直接填充数据 a加1
			}else if(a<100){//两位数
				if(bj==1){
					arr[j][--n] = a/10;//取十位 a不做变化
					bj++;//标记改变为2
				}else if(bj==2){
					arr[j][--n] = a%10;//第二位取个位
					a++;// a加1
					bj=1;//标记改为1
				}
			}else{//三位数
				if(bj==1){//取百位
					arr[j][--n] = a/100;
					bj++;
				}else if(bj==2){//取十位
					arr[j][--n] = a/10%10;
					bj++;
				}else{//取个位
					arr[j][--n] = a%10;
					a++;
					bj=1;
				}
			}
		}
		//横着从左向右 同上理
		for (int i = 0; i < arr[arr.length-1].length; i++) {
			if(a<10){
				arr[arr.length-1][i] = a++;
			}else if(a<100){
				if(bj==1){
					arr[arr.length-1][i] = a/10;
					bj++;
				}else if(bj==2){
					arr[arr.length-1][i] = a%10;
					a++;
					bj=1;
				}
			}else{
				if(bj==1){
					arr[arr.length-1][i] = a/100;
					bj++;
				}else if(bj==2){
					arr[arr.length-1][i] = a/10%10;
					bj++;
				}else{
					arr[arr.length-1][i] = a%10;
					a++;
					bj=1;
				}
			}
		}
		//斜着向左上 同上理
		for (int j = arr.length-2; j >=1; j--) {
			if(a<10){
				arr[j][arr[j].length-1] = a++;
			}else if(a<100){
				if(bj==1){
					arr[j][arr[j].length-1] = a/10;
					bj++;
				}else if(bj==2){
					arr[j][arr[j].length-1] = a%10;
					a++;
					bj=1;
				}
			}else{
				if(bj==1){
					arr[j][arr[j].length-1] = a/100;
					bj++;
				}else if(bj==2){
					arr[j][arr[j].length-1] = a/10%10;
					bj++;
				}else{
					arr[j][arr[j].length-1] = a%10;
					a++;
					bj=1;
				}
			}
		}
		//打印结果:
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr[i].length; j++) {
				if(arr[i][j]==10){
					System.out.print(" ");
				}else{
					System.out.print(arr[i][j]);
				}
			}
			System.out.println();
		}
	}
}

由于上面的方法对于数据位数的处理很麻烦下面做了一下优化~~~~

import java.util.Scanner;


public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		char[][]arr = new char[n][];//二维数组
		int ii = 0;//变量代表二维数组下标
		for (int i = n; i < n*2; i++) {
			arr[ii++] = new char[i];//每一个二维数组 装一维数组
		}
		//设置默认值
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr[i].length; j++) {
				arr[i][j]=' ';
			}
		}
		//生成字符串(数字拼接)123456789101112~
		String s = "";
		for (int i = 1; i <=n*2+3; i++) {
			s+=i;
		}
		//System.out.println(s);
		int a = 0;//数字123456~~
		//斜着向左下
		for (int j = 0; j < arr.length-1; j++) {
			arr[j][--n] = s.charAt(a++);//取一次 下标变量加1
		}
		//横着从左向右 同上理
		for (int i = 0; i < arr[arr.length-1].length; i++) {
			arr[arr.length-1][i] = s.charAt(a++);
		}
		//斜着向左上 同上理
		for (int j = arr.length-2; j >=1; j--) {
			arr[j][arr[j].length-1] = s.charAt(a++);
		}
		//打印结果:
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr[i].length; j++) {
				if(arr[i][j]==' '){
					System.out.print(" ");
				}else{
					System.out.print(arr[i][j]);
				}
			}
			System.out.println();
		}
	}
}

总结:
如果一个算法很麻烦,那么不如去寻找一些简单的方法。当然是对于有精力和兴趣的人来言的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值