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);
}
}