Java蓝桥杯-java基础知识笔记

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()
  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小罗のdiary

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值