2020.2.21学习记录

2020.2.21学习记录

一. 题目练习

蓝桥杯练习——基础训练

杨辉三角

问题描述

杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。

它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。

下面给出了杨辉三角形的前4行:

1

1 1

1 2 1

1 3 3 1

给出n,输出它的前n行。

【输入】输入包含一个数n。

【输出】输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格。

解题思路

1.首先按观察杨辉三角,发现每一行除了第一个数和最后一个数都等于1以外,第i行第j个数都等于第i-1行第j个数与第i-1行第j-1个数之和。
2.用一个二维数组存放杨辉三角矩阵,将每行的第一个和最后一个设置为1,然后从第二行开始,剩下的数都是上一行对应的两数相加得到完整的杨辉三角。

代码

import java.util.Scanner;
public class YangHui {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner=new Scanner(System.in);
		int n=scanner.nextInt();
		int yh[][]=new int[n+1][n+1];
		int i,j,k=1;
		for(i=1;i<=n;i++) {
			yh[i][1]=1;
			yh[i][i]=1;
			if(i>2) {
				for(j=2;j<i;j++) {
					yh[i][j]=yh[i-1][j]+yh[i-1][j-1];
				}
			}
		}
		for(i=1;i<=n;i++) {
			for(j=1;j<=i;j++)
				System.out.print(yh[i][j]+" ");
			System.out.println();
}
	}
}

二. 视频学习

视频链接:递归
经典例题

结果视频里面涉及到String的时候有好多没见过的方法,又临时补了一下String类

String类型

概述

1.字符串是常量,创建后不可改变

2.字符串字面值储存在字符串池中,可共享

拓展解释

栈:存放基本类型数据

堆:存对象

方法区:字符串池在方法区中

当一个类创建一个属性时,比如属性num,赋值"12456",此时在栈中开辟一块空间,同时在字符串池中开辟一块空间存放"123456",同时栈中的空间存放地址指向字符串池中的位置。

如果此时给num重新赋值为"456789",那么并不会改变num原本的值,而是在字符串池中开辟一个新的空间并指向它,原先的数据作废,所以说不可改变。

此时在创建另一个变量num1,也赋值"456789",则两个变量指向字符串池中的同一个空间,为共享

3.String str=“123546”

String str=new String(“123456”) 后者比前者多在堆中创建一个对象,此时String str1=new String(“123456”),在堆中创建了两个不同的对象,都指向池中的同一个数据。所以比较的时候不用str==str1,这样比较的是地址,而要用str.equals(str1),比较的是数据。

常用方法

1.length(); 返回字串长度

2.charAt(int index); 返回某位置字符

3.contains(String str); 判断是否含有某字符串

4.toCharArray(); 字符串转数组

5.indexOf(String str); 查找str首次出现下标,存在,返回下标;不存在,返回-1(可以从某个脚标开始找)

6.lastIndexOf(String str); str最后一次出现的下标

7.trim(); 去掉字符串前后空格

8.toUpperCase(); 小写转大写

9.toLowerCase();

10.endWith(String str); 判断是否以str结尾

11.replace(char old,char new); 用new替换old

12.split(char c); 根据str分割

小技巧

例如:str.split("[ ,]"); 遇到空格和逗号都要分割

​ str.split("[ ,]+"); 空格和逗号可以有多个

13.compare(String str); 比较字典大小

更多方法可以查看API文档:在线API

下面进入正题:

蓝桥杯练习——递归(1)

循环与递归

循环与递归有一定的相似性,这是将循环改为递归的关键,就是发现逻辑的相似性

递归最重要的一点,就是找到递归的出口,及返回的条件

构造相似性

有时候相似性并不会太明显,需要去构造

另外,找不到相似性很可能是因为缺少参数

递归在数学上类似递推

递归调用

递归不是什么很高级的过程,仅仅是计算机按照指令完成任务,在递归函数中每次都调用自己,每次调用的层次是不同的

对于递归调用的形参,每次调用,即每一层次都是不同的,所以在碰到例如将整个数组传进去当形参的情况要额外注意,要设置别的参数指定对数组的哪部分进行操作,否则会造成无法进入下一层的死循环

注意逐层返回时的顺序

例题

1.输出n到m的和

【输入】数据总数N,起点n,终点m

​ N个数据

【输出】n到m个数据之和

思路

可以想象成第一个数和后面所有数的和,再计算后面数的时候,又可以想成第二个数和后面数之和的和,以此类推,直到最后一个数开始返回

代码
import java.util.Scanner;
public class Sum {
	//     *[*[*[***********[**]]]]
	public static int sum(int a[], int start,int end) {
		if(start==end)return end;
		int x=sum(a, a[start+1], end);
		return a[start]+x;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner=new Scanner(System.in);
		int n,m,i,N,c;
		N=scanner.nextInt();
		n=scanner.nextInt();
		m=scanner.nextInt();
		int a[]=new int[N+1];
		for(i=0;i<N;i++) {
			c=scanner.nextInt();
			a[i]=c;
		}
		int s=sum(a, a[n], a[m]);
		System.out.println(s);
	}
}

2.n个球中选出m个

问题:从n个球中取m个,有几种解决方法?

【输入】n m

【输出】解决方法的数量

思路

假如有一个“幸运球”,那么只有两种情况,那就是取这个球和不取这个球

取这个球:f(n-1,m-1); 因为已经内定了这个球,所以在n-1个球中选m-1个球

不取这个球:f(n-1,m); 已经内定不选这个球,所以在n-1个球中再选m个球

返回条件:1.n小于m,0种取法

​ 2.n==m,1种取法

​ 3.m==0,1种取法

代码
import java.util.Scanner;
public class NforM {
	public static int fun(int n,int m) {
		if(n<m)return 0;
		if(n==m)return 1;
		if(m==0)return 1;
		return fun(n-1, m-1)+fun(n-1, m);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner=new Scanner(System.in);
		int n=scanner.nextInt();
		int m=scanner.nextInt();
		int x=fun(n, m);
		System.out.println(x);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值