本篇文章是跟着B站的一位大佬(UP:只学算法找工作)学习制作的,本篇文章的内容都是观看该视频所记录下的笔记,希望能对大家有所帮助。(原B站UP视频连接:保姆级 | 零基础备赛蓝桥杯java组 | )
这篇是本栏目的第一篇内容,主要学习JAVA的基础数据类型和输入输出以及数组。在未来也会继续更新下去,直到学习完毕。
在本栏目编写过程中,也会对视频内容的一些知识进行变化,并且会增加一些我自己的思考。所以本栏目的内容不是和视频一样一成不变的知识。只是为了我自己能够更好的理解或者拓展所以做了一些些的修改,希望对大家能够有所帮助。如果发现我的文章编写内容有错误的话,欢迎大家在评论区留言或者自己私信我,我会第一时间进行更改的!
最后祝各位能够早日学会算法,在蓝桥杯比赛中获得优异的成绩٩(๑ᵒ̴̶̷͈᷄ᗨᵒ̴̶̷͈᷅)و!
基础格式
//java常用固定格式
public class Main{
public static void main(String [] args){
//声明变量语句
int a = 10;
long b =Integer.MAX_VALUE+1;//Integer.MAX_VALUE就是Int类型的最大值
//打印输出语句
System.out.print(a);//print是不换行
System.out.println(b);//println是自动换行
}
}
数据类型
本文章只记录做题常用到的基础数据类型.
-
Int (整型)
- 数据类型是32位
- 最小值是-2^31
- 最大值是2^31 -1
- 默认值是0
-
Long (长整型)
- 数据类型是64位
- 最小值是-2^63
- 最大值是2^63 -1
- 默认值是0
-
float (单精度浮点数)
- 数据类型是单精度32位
- 默认值是0.0
- PS:不能表示精确的值
-
double (双精度浮点数)
- 数据类型是双精度64位
- 默认值是0.0
- PS:同样也不能表示精确的值
-
boolean (布尔类型)
- 数据类型表示1位信息
- 只有"true"和"false"
- 默认值是"false"
-
char(字符类型)
-
单一的16位Unicode字符
-
案例
char a = 'b'; System.out.println(a);
-
输入输出
代码示例:
//导入java.util包
import java.util.*;
public class Main{
public static void main(String [] args){
Scanner a = new Scanner(System.in);//引入Scanner对象
int b = a.nextint();
System.out.println(a);
String c = a.next();
System.out.println(c);
}
}
next()
与nextLine()
的区别区别就在于next()就是敲下空格键之后就停止
而nextLine()会打印一整段的内容,不会因为空格而失去接收信息
精选例题
import java.util.*;
public class Main{
public static void main(String [] args){
Scanner a = new Scanner(System.in);
float a = a.nextFloat();
System.out.println("%.3f",a);
/*
按要求输出多少位浮点数
如果要输出5位的话就改成("%.5f",a)
*/
}
}
数组
特点介绍
- 数组中的元素在内存中是依次紧密排列的有序的.
- 数组一旦初始化完成,其长度就是确定的,而数组的长度一旦确定就不能修改.
- 数组的索引是从0开始的.
代码语句
int []arr = new int [10]; //new一个长度为10的静态数组
int []arr1 ={1,2,3,4,5}; //new一个有5个元素的动态数组
System.out.println(arr.length) //arr.length 打印出数组的长度
//遍历数组
for(int i=0;i<5;i++){
System.out.println(arr1[i]);
}
完整代码
import java.util.*;
public class Main{
public static void main(String [] args){
Scanner a=new Scanner(System.in);
int []arr = new int [10]; //new一个长度为10的静态数组
int []arr1 ={1,2,3,4,5}; //new一个长度为5的动态数组
System.out.println(arr.length) //arr.length 打印出数组的长度
//遍历数组
for(int i=0;i<5;i++){
System.out.println(arr1[i]);
}
}
}
经典例题
答案
哈希表
特点介绍
哈希表
是一个不允许出现重复元素,并且无序的集合,主要有HashSet实现类。- 在判断重复元素的时候,Set集合会调用hashCode(和equal0方法来实现。
- 注重独一无二的性质,该体系集合可以知道某物是否已近存在于集合中,不会存储重复的元素.
- 用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复.
特点:
- 可以用来去重
- 元素无序
代码语句
Set<数据类型>set = new HashSet<>(); //声明一个存放该数据类型的哈希表
完整代码
import java.util.*;
public class Main{
public static void main(String [] args){
Scanner a=new Scanner(System.in);
Set<Integer>set = new HashSet<>(); //声明一个存放该数据类型的哈希表
set.add(1); //向set哈希表中添加一个1
boolean text = set.add(1); //在再次向set表中添加一个1,并且由一个布尔类型text对添加进行一个测试.
System.out.println(text); //发现测试结果是false,说明再次添加就会返回flase.
set.remove(1); //删除掉刚刚添加的1
text = set.contains(1);
System.out.println(text); //检查text中是否还存在1,最后的结果是flase,说明1不存在了.这是因为刚刚执行了set.remove方法
set.clear(); //最后就是清楚set里面的内容
}
}
详细介绍
问题一:观察这一段代码,为什么
boolean text = set.add(1); System.out.println(text);
打印出来结果是false
?public class Main{ boolean text = set.add(1); System.out.println(text); //在这段代码中,boolean text = set.add(1);语句的作用是将元素1添加到HashSet集合中,并返回一个布尔值表示添加操作的结果。如果元素1之前不存在于集合中,则添加成功,返回true;如果元素1已经存在于集合中,则添加失败,返回false。
问题二: 为什么
text = set.contains(1);
不能改成set =set.contains(1);
在Java中,
set.contains(1)
是用来判断集合set
中是否包含元素1的方法。它返回一个布尔值,表示是否包含该元素。因此,text = set.contains(1)
将返回一个布尔值,并将其赋值给变量text
。如果将代码改为
set = set.contains(1)
,则会导致编译错误。因为set.contains(1)
返回的是一个布尔值,而不是一个集合对象。所以不能将布尔值赋给集合对象set
。如果你想要判断集合中是否包含元素1,并将结果赋给变量
set
,可以使用以下方式:boolean text = set.contains(1);
经典例题
https://www.luogu.com.cn/problem/P4305
答案
List和哈希Map
特点介绍
ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。
比较常用的是前三个方法
代码语句
//实例化List
List<lnteger>list = new ArrayList<>();
完整代码
import java.util.*;
public class Main {
public static void main (String []args){
List<Integar>list = new ArrayList<>();
list.add(1); //这里使用的是List方法一
list.add(2);
System.out.println(list.size()); //List方法二,打印列表中的所有元素
System.out.println(list.get(1)); //输出下标为1的数字,也就是2 //这里使用的是List方法三
}
}
HashMap
特点介绍
- HashMap是一个散列表,它存储的内容是键值对(keyi-value)的映射.
- HashMap实现了Map接口,可以根据键的HashCode值存储数据,具有很快的访问速度.
- HashMap是无序的,即不会记录插入的顺序.
注意:方法四getOrDefault
中的D
需要大写!!!
代码语句
//实例化HashMap
Map<Integer,Integer>map = new HashMap<>();
map.put(1,2); //HashMap中的put方法
map.put(2,1);
int x = map.get(2);
System.out.println(x); //此时输出的是1
System.out.println(map.size()); //输出的是2
System.out.println(map.getOrDefault(3,-1)); //此时因为没有,所以返回给k的是默认值-1
完整代码
import java.util.*;
public class Main{
public static void main(String [] args){
//实例化HashMap
Map<Integer,Integer> map = new HashMap<>();
map.put(1,2); //HashMap中的put方法
map.put(2,1);
int x = map.get(2);
System.out.println(x); //此时输出的是1
System.out.println(map.size()); //输出的是2
System.out.println(map.getOrDefault(3,-1));
}
}
经典例题
链接: https://www.luogu.com.cn/problem/P1102
答案
栈
特点介绍
Stack的特点:先进后出.
代码语句
Stack <Integer> stack = new Stack<>();
stack.add(1); //.add和.push都是压入栈
stack.add(2);
stack.add(3);
//如果栈不为空的话,就出栈
while(!stack.isEmpty()){
System.out.println(stack.pop()); //stack.pop()就是出栈
}
经典例题
链接:https://www.luogu.com.cn/problem/P1427
链接:https://www.luogu.com.cn/problem/P1739
答案
第一题答案
第二题答案
队列
特点介绍
队列的特点是先进先出
常用方法:
Bollean add(Object element)
从队尾压入元素,返回是否压入成功.Object poll()
删除并且返回对头被删除的那个元素.Object peek()
返回对头元素,但是不删除boolean isEmpty()
删除队列是否为空
代码语句
//通过LinedList类创建对象
Queue<Integer> q = new LinkedList<>();
//压入元素
q.add(1);
q.add(2);
q.add(3);
//检测是非为空
while (!q.IsEmpty()){
System.out.println(p.peek())
}
经典例题
链接:https://www.luogu.com.cn/problem/P1996
答案
排序
特点介绍
数组排列
通过Arrays.sort()
方法对一个数组所以元素进行排序,并且默认按从小到大的顺序排列.
集合排列
通过Collections.sort()
方法对一个集合的所以元素进行排列,并且从小到大的顺序.
代码语句
数组排列
//Arrays.sort(int []a)
/*lambada表达式进行自定义排序
Arrays.sort(int []arr,(o1,o2)->01-02 ) //进行升序排列
Arrays.sort(int []arr,(o1,o2)->o2-o1 ) //进行降序排列
*/
//输出一个排序数组
Integer []a={3,6,3};
Arrays.sort(a);
//通过for循环打印
for(int i=0;i<a[i].length;i++){
System.out.println( a[i]+" " );
}
//通过lambada表达式输出一个二维数组排序
Integer [][]a={{1,2,3},{2,3,4}};
Arrays.sort(a,(o1,o)->o2[0])-o1[0]; //?????
//通过for循环打印
for(int i=0;i<a[i].length;i++){
for(int j=0;j<a[i].lngth;j++)
System.out.println( a[i][j]+" " );
System.out.println();
}
集合排列
//Collections.sort(List<> arr)
//lambda表达式也与数组排序方法类似
//Collections.sort(List<> arr,(o1,o2)->o1-o2) 升序排序
//list排序代码实例
public class main{
public static void main(String[] args){
Scanner s= new Scanner(System.in);
List<Integer>list = new ArrayList<>();
list.add(1);
list.add(4);
list.add(2);
list.add(3);
Collections.sort(list,(o1,o2)->o2-o1);
for(int i=0;i<list.size;i++){
System.out.print(list.get(i)+" ");
}
}
}
经典例题
链接:https://www.luogu.com.cn/problem/P1739
答案
String和StringBuilder
特点介绍
- String类都代表的是字符串,也就是java程序中的字符串文字,都被实现为此类.
- String类代码是由final修饰的,它们的值在创建后不能被更改.字符串缓冲区支持可变字符串.
- 因为String对象是不可变的,他们可以被共享.
特点:
- String通过new创建的字符串对象,每一次new都会申请一个内存空间,虽然内容相同,但是地址不同.
- 以双引号方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM都只会建立一个String对象
代码语句
import java.util.*;
public class main{
public static void main (String []args){
Scanner s = new Scanner(System.in);
String a = new String("abc"); //有参构造
String b = new Sting(); //无参构造
}
}
import java.util.*;
public class Main{
public static void main(String [] args){
Scanner scan=new Scanner(System.in);
StringBuilder s=new StringBuilder();
s.append(1);
s.append('x');
s.append("javaweb");
s.reverse();
System.out.println(s);
}
}
经典例题
链接:https://www.luogu.com.cn/problem/B2109
第一题
链接:https://www.luogu.com.cn/problem/B2124
第三题
链接:https://www.luogu.com.cn/problem/B3640
答案
第二题答案
时间复杂度
时间复杂度时间复杂度是用来分析算法执行时间随着问题规模增大而增长的速度。它衡量了算法的执行效率。常数级别(O(1))、对数级别(O(leg n))、线性级别(O(n))、线性对数级别(O(nlog n))、平方级别(O(n^
2))、立方级别(O(n^
3))和指数级别(O(2^
n))等.
计算机1s可以计算10的8次方,所以我们解题的时候,要控制代码的时间复杂度在10~8以内!
代码语句 | 时间复杂度 |
---|---|
for (inti=0;i<n;i++) | 该代码的时间复杂度为o(n) |
for (int i=0;i<n;i++){for(intj=0;j<n;j++)} | 该代码的时间复杂度为o(n*n) |
for(int i=1;i<=n;i*=2) | ``该代码的时间复杂度为o(logn) |