1.如果发现我哪里写错了就跟我说一下,这是我用来复习的。
2.大佬们如果还有其他蓝桥杯常考的java方法也可以跟我说
完善一下我的笔记,谢谢!
一、输入和输出
1.输入
//所在包import java.util.*;内
Scanner scan=new Scanner(System.in);
//输入字符串
scan.next(); //不会吸入"空格符和TAB键符",遇到空格/Tab键/回车截止吸取
scan.nextLine(); //会吸入"空格符和TAB键符",回车截止吸取
//输入基本类型
scan.nextInt(); //吸入数字,遇到空格/Tab键/回车截止吸取,其他类型差不多
scan.next(2); //2表示以二进制输入,输出还是为10进制,其他类型差不多
2.输出
//可写入任何类型,“+”符号作为连接符连接各个类型,输出字符串
System.out.print();
//与print相同,多了个换行
System.out.println();
//与c语言printf几乎一样,只是只能输入一个类型
//%5d,表示占5个空间大小向右对齐,%05d,表示占5个空间大小,不足则向左补0,负号则相反
System.out.printf("字符串格式",类型);
二、基本数据类型和字符串
1.常用基本数据类型
数据类型 | 内存 | 取值(十进制) |
int | 32位 | -10^10~10^10 |
long | 64位 | -10^19~10^19 |
double | 64位 | 4.9*10^-324~1.79*10^308 4.9E-324~1.79E308 |
char | 16位 | |
boolean | 1位 |
2.字符串(String类)
(1)创建
String str=new String();
//为什么不用实例化可以使用String类?
//String底层是通过string数据类型实现的
String str="";
(2)操作方法
//连接字符串和其他类型
String str=s1+s2; //与字符串连接
String str=in+s1; //与int类型连接,其他同理,与输出语句类似
String str=in+"";
String str=in; //错误
//获取信息
//1长度
str.length();
//2查找字符串(没找到返回-1)
str.indexOf("a"); //查找字符串a首次出现的位置
str.lastIndexOf("a"); //查找字符串a最后出现的位置
str.indexOf("ab"); //查找字符串ab首次出现的位置
str.lastIndexOf("ab"); //查找字符串ab最后出现的位置
//3获取和截取字符串
str.substring(3); //获取索引为3(包含)~length(不包含)的字符串
str.substring(3,6); //获取索引为3(包含)~6(不包含)的字符串
//4字符串的替换
str.replace("a","A"); //将字符串str中的a->A
//5判断字符串的开头或结尾(返回值boolean)
str.startWith(childstr); //以childstr开头返回true否则false
str.endWith(childstr); //以childstr结尾返回true否则false
//6判断字符串是否相等(返回值boolean)
str.equals(otherstr); //相等true否则false
//7字符串比较以ascii大小比较即:字典顺序
str.compareTo(otherstr); //str>other,返回正整数,=返回0,<返回负整数
//8字符串的大小写转换
str.toLowerCase(); //转换为小写
str.toUpperCase(); //转换为大写
//9字符串的分割
String[] arr=str.split("/");//其中/为分割符
String[] arr=str.split("\\.");//.和|比较特殊必须加\\
//注意:除了.和|在实际应用中用到需要特殊字符分割的概率很低如:\,$,*等
(3)格式化字符串
String.format("字符串格式",类型);//与printf类似
3.数据类型转换
//1基本数据类型转String类
in+"";//int转String,其他同理
//2包装类转String类
i.toString();//Integer类转String
//String类转基本数据类型和包装类
Integer.parseInt(str);//String转int型或Integer,其他同理
三、数组
1.数组的创建
//一维数组的创建
Object[] OB={1,2,3};
Object[] OB=new Object[5];
Object[] OB=new Object[]{1,2,3};
Object[][] OB={{1},{2},{3}};
Object[][] OB=new Object[5][5];
Object[][] OB=new Object[][]{{1},{2},{3}};
//以上数组的创建方法都有一个共同点,都分配了内存,没分配内存数组无法操作
2.数组操作
//1.遍历方式有2种(一维和二维)
//第一种
for(int i=0;i<arr.length;i++) arr[i];
for(int i=0;i<arr.length;i++)
for(int j=0;j<arr[i].length;i++)
arr[i][j];
//第二种
for(int x:arr) x;
for(int x[]:arr)
for(int y:x)
y;
//2.替换数组元素
Arrays.fill(arr,1); //将arr数组元素值全部替换成1
Arrays.fill(arr,1,2,3);//将arr数组中下标从1(包含)到2(不包含)的元素值替换成3
//3.对数组排序
Arrays.sort(arr); //对arr数组进行排序复杂度(nlogn)
//4.复制数组
Arrays.copyOf(arr,3); //将arr数组下标从0(包含)到3(不包含)的复制给新数组,新数组的长度为3
Arrays.copyOfRange(arr,3,5);//将arr数组下标从3(包含)到5(不包含)复制给新数组,新数组的长度为2
//5.数组查询
Arrays.binarySearch(arr,5); //查询arr数组中有无值为5的元素
Arrays.binarySearch(arr,1,2,5);//arr数组下标从1(包含)到2(不包含)中有无值为5的元素
四、包装类
1.常用包装类
1.Integer 2.Long 3.Boolean 4.Character 5.Double
注意:必须分配内存空间才能使用
Integer in=new Integer("0");
2.包装类常用的方法
//1.比较值大小
in.compareTo(otherin);//in>otherin返回正值,in=otherin返回0,in<other返回负值
//2.返回一个字符串
in.toString();//可转换为字符串
//3.返回包装类对象
Integer in=Integer.valueOf(33);//返回一个Integer对象
//4.以基本类型返回包装类对象
Integer in=new Integer("33");
int i=in.intValue();
//5.对象的比较
in.equals(otherin);//相等则返回true,否则false
//常数
Integer.MAX_VALUE;//2^31-1;
Integer.MIN_VALUE;//-2^31;
五、数据处理类
1.Math类
//1.常用的数字常量
Math.PI;//常量π
//2.指数函数
Math.exp(a);//返回e^a
Math.sqrt(a);//返回a的平方根
Math.cbrt(a);//返回a的立方根
Math.pow(a,b);//返回a^b
//3.取值
Math.max(a,b);//返回a,b当中的最大值
Math.min(a,b);//返回a,b当中的最小值
Math.abs(a);//返回a的绝对值
//4.取整
Math.floor(a);//向下取整:5.5->5
Math.ceil(a);//向上取整:5.5->6
Math.rint(a);//四舍五入,返回double
Math.round(a);//四舍五入,返回int或long(输入float或double)
2.大数字类
//注意:使用时必须分配内存,因为是类
//大整数类
//1.常数
BigInteger.ONE;
BigInteger.ZERO;
BigInteger.valueOf(long a);
//2.创建
BigInteger Big=new BigInteger("2");
BigInteger Big=常数;
//3.运算
Big.add(otherBig); //加
Big.subtract(otherBig); //减
Big.multiply(otherBig); //乘
Big.divide(otherBig); //除
Big.remainder(yushu);Big.mod(yushu);//取模或取余,正数时没区别
//4.取值
Big.max(otherBig); //返回两数之间最大值
Big.min(otherBig); //返回两数之间最小值
//大实数类(比大整数类多了小数)
六、集合类
1.Collection接口
Collection的子接口有List和Set
//常用方法
add(e); //添加元素
remove(e); //删除元素
clear(); //清空集合
isEmpty(); //返回boolean判断集合里全部元素是否为空
iterator(); //用于遍历
size(); //返回int,获取集合元素个数
(1)List接口
//list常用操作方法
set(i,value); //修改索引为i的元素值,value为修改值
get(i); //获取索引为i的元素(从0开始)
//1.创建集合
//根据频繁操作的复杂度选择,一般随便选
List<Object> al=new ArrayList<Object>();
List<Object> ll=new LinkedList<Object>();
//2.遍历
//(1).for
for(Object x:list)
x;
for(int i=0;i<list.size();i++)
list.get(i);
//(2)迭代器遍历
Iterator<Object> it=list.iterator();
while(it.hasNext)
it.next();
//注意:List中的Remove和Collection的不一样remove(i)是索引而不是元素值
(2)Set接口
//优点:不能包含重复元素,可以去重
//1.创建集合
Set<Object> hs=new HashSet<Object>();
Set<Object> ts=new TreeSet<Object>();
//2.遍历
//(1)for
for(Object x:set)
x;
//(2)迭代器遍历
Iterator<Object> it=set.iterator();
while(it.hasNext)
it.next();
2.Map接口
//常用方法
put(key,value); //添加元素
get(key); //获取元素
remove(key); //删除元素
clear(); //清空集合
contains(element);//判断是否在集合内
通过迭代器
//每个key只能映射一个value,可将key和value看成2个集合
//1.创建集合
Map<Object,Object> hm=new HashMap<Object,Object>();
Map<Object,Object> tm=new TreeMap<Object,Object>();
//2.遍历
//(1)for
//遍历key集合
for(int x:hm.keySet()) {
System.out.println("key="+x+" "+"value="+hm.get(x));
}
//(2).迭代器遍历
Set<Integer> set=hm.keySet();
Iterator it=set.iterator();
while(it.hasNext)
it.next();
3.关于迭代器
//常用方法
it.next() //返回下一个元素
it.hasNext() //是否有元素
it.remove() //删除元素
六、常用的包
import java.math.*;
import java.util.*;
七、例题回顾
例题1:时间显示(输入范围的18次方的正整数)
/*由题意得:
*1.输入一个单位为毫秒的整数(范围10的18次方)
*2.舍弃毫秒和年月日
*3.输出格式为HH:MM:SS
*/
Scanner scan=new Scanner(System.in);
//不能用int范围只有10的10次方
long number=scan.nextLong();
//舍弃步骤不可颠倒:由于不是舍弃10的倍数
number=number/1000; //舍弃毫秒,将单位变成秒
number=number%(3600*24);//舍弃年月日,即取1天秒数的模
//输出
System.out.printf("%02d:",number/3600); //时
System.out.printf("%02d:",number%3600/60);//分
System.out.printf("%02d",number%3600%60); //秒
例题2:圆的面积
/*
*由题意得
*圆的面积=PI*r*r;
*输入半径r(整数)
*输出面积(保留7位小数)
*/
/*当我们无法判断算出来的结果为小数点后几位时
*选精度大的double
*/
Scanner scan=new Scanner(System.in);
double r=scan.nextFloat();
double result=Math.PI*r*r;
//小数点第八位四舍五入
//rint和round都可以
result=Math.rint(result*10000000);
result=result/10000000;
//输出保留7位小数的值
System.out.printf("%.7f",result);
例题3:fibonacci数列(1<=n<=10^6)
/*
*由题意得
*输入整数n(1<=n<=10^6)
*输出fb(n)和%10007
*/
/*分析
*增长速率:指数级别(a^b)
*证明:用数学方法->通项f(n)=f(n-1)+f(n-2)
*通过增长速率我们知道后一项是前一项的指数级别且范围是(1<=n<=10^6)
*所以java的数据类型是值会溢出的
*我们可以对这个大数进行分解处理
*取余公式(a*b)%p=(a%p+b%p)%p
*分解成多个数取余数来求大数的余数
*/
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
//存储n个斐波那契数列的余数
int[] fb=new int[n];
//分三种情况
if(n==1) {
System.out.print("1");
}else if(n==2){
System.out.print("1");
}else if(n>2){
fb[0]=1;
fb[1]=1;
for(int i=2;i<n;i++) {
//f[2]=(f[1]+f[0])%10007
fb[i]=(fb[i-1]+fb[i-2])%10007;
}
System.out.print(fb[n-1]);
}
例题4:成绩分析
/*
*由题意得
*输入:第一行输入整数n(1<=n<=10^4)代表人数,
* 第二行输入整数score(0<=score<=100)代表个人分数
*输出:第一行最高分,第二行最低分,第三行平均分(四舍五入保留两位小数)
*/
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int[] score=new int[n];
int sum=0;
for(int i=0;i<score.length;i++){
score[i]=scan.nextInt();
sum+=score[i];
}
double average=(double)sum/(double)n;
//在小数点第2位四舍五入rint或round
average=Math.rint(average*100);
average=average/100;
//从小到大排序
Arrays.sort(score);
System.out.println(score[score.length-1]);
System.out.println(score[0]);
System.out.printf("%.2f",average);
例题2:重复字符串
Scanner scan=new Scanner(System.in);
int k=scan.nextInt();
String S=scan.next();
//最终结果
int result=0;
/*怎样能算出最少次数呢?
*比如说我们知道相同的数最多有20个,而总数有50个
*那我们就将其余的30个数改成与相同的数一样就是最少次数
*最少次数=每一对元素的数量-重复最多的数量,例如某一层:abca 4-2=2次
*/
//每一个元素的数量
int number=k;
//用于记录每对元素中在a~z范围内哪个数量最多
ArrayList<Integer> record=new ArrayList<Integer>();
//若S长度不能k平分,则返回-1
if(S.length()%k!=0) {
System.out.print(-1);
}else {
//处理第i对元素,i从0开始,共有S.length()/k对元素
for(int i=0;i<S.length()/k;i++) {
//每记录完1对初始化记录数组为0
for(int v=0;v<26;v++) {
record.add(0);
}
//将第i对元素的数据逐个统计
for(int j=i;j<S.length();j+=S.length()/k) {
//记录
record.set((int)S.charAt(j)-97, record.get((int)S.charAt(j)-97)+1);
}
//记录累加结果,Collections.max(record),可获取集合中元素的最大值
result=result+(number-Collections.max(record));
//检验代码:验证是否符合自己的结果
//System.out.println(result+" "+Collections.max(value));
//每记录完1对清空记录数组
record.clear();
}
System.out.print(result);
//收获
//获取子类list or set集合中值最大的元素
Collections.max()