文章目录
一:前言
1:为何刷题从C++转java
- 平时除了写项目的话,才用java,刷题的话就用C++,但是这样的话,对java的一些基本知识掌握不牢固,昨天jd的笔试当中
就有考察一些基础知识 - 虽然算法思路是最重要的,具体用什么语言实现主要 看自己对那门语言的数据结构用的溜即可 但是的话,实现是相同的
以后毕竟还是要吃java这份饭的,对一些数据结构熟悉一些,对于写一个工具类,或者是阅读源码会更方便一些 - 面试手撕算法题是可以用C++的,但是 从长远来看 用java刷题还是好处多多
2:如何上手呢?
- 先了解常用的数据结构 无非就是数组 栈 队列 set list hashmap
- 然后就是元素的插入,元素的遍历,一些常用API的调用,以及每个数据结构的特点
二:输入
1:常规的输入
Scanner in = new Scanner(System.in);
System.out.println("请输入你的年龄:");
int age = in.nextInt();//整数类型的输入方式
System.out.println("请输入你的身高:");
double height = in.nextDouble();//小数类型的输入方式
2:关于其他输入符在nextLine()之前用吃掉回车符的问题解决
当比如我们在输入的是时候前面用了 nextInt();后面的话用了nextLine()的话,其会吃掉回车符,导致我们无法正常输入
那么我们的解决办法有两种
- 将nextLine()改为next(),但是呢那么你就无法输入带空格的字符了
- 将nextLine()的前面再加上nextLine(),这样就可以帮助我们吃掉回车符,那么我们正常的输入就不会有问题了。
- 请看示例:
Scanner in = new Scanner(System.in);
System.out.println("请输入你的年龄:");
int age = in.nextInt();//整数类型的输入方式
System.out.println("请输入苹果的英文:");
in.nextLine();//nextLine()会吃掉回车符,这样的话 我们下面就可以正常输入了
String s1 = in.nextLine();//nextLine是可以输入带空格的数据的。
System.out.println("请输入你的身高:");
double height = in.nextDouble();//小数类型的输入方式
3:常见输入之我们输入一串数到容器中
这个是我们常用的之一,当题目给出一串数的话,我们往往是要将其存放在容器当中的,那么的话我们就可以方便操作了
Scanner in = new Scanner(System.in);
int[] arr = new int[10];
for (int i = 0; i < 10; i++) {
arr[i] = in.nextInt();
}
for (int i : arr) {
System.out.print(i+ " ");
}
三:常用的数据结构
1:数组
- 定义
int len = 5;
int[] arr = new int[len];
- 赋值
for (int i = 0; i < arr.length; i++) {
Scanner scanner = new Scanner(System.in);
arr[i] = scanner.nextInt();
}
- 遍历输出
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
- 常用API之排序
Arrays.sort(arr);
2.List
- 定义
List<Integer> list = new ArrayList<>();
- 赋值
for (int i = 0; i < 5; i++) {
int nums = in.nextInt();
list.add(nums);
}
- 遍历
遍历输出 它的大小是 size() 区别数组的 length 区别字符串的 length()
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i)+" ");
}
- API调用之sort升序
注意o1.conpareTo(o2)
list.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);//这里还可以用 o1 - o2 这个是等价的
}
});
conpareTo的源码:
其实就是3目运算符
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
- API调用之sort降序
** 注意o2.compareTo(o1)**
list.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);//这里还可以用 o2 - o1 这个是等价的
}
});
- API调用之按照对象的某个字段排序
关于这个我们给出一个情景好记忆。
比如我们要给一个班级数学成绩排序,数学成绩相同的话,那么我们就按照名字的字典序进行排序。
输入:5
wyj 100
aaa 90
abc 100
bbb 70
ccc 30
输出: abc 100
wyj 100
aaa 90
bbb 70
ccc 30
public class textList {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
ArrayList<Student> list = new ArrayList<>();
System.out.print("请输入学上的个数:");
int studentNums = in.nextInt();
for (int i = 0; i < studentNums; i++) {
String sname = in.next();//nextLine()输入的是一行数据会包含空格 eg wyj 100
int sgrade = in.nextInt();
list.add(new Student(sname,sgrade));
}
list.sort(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
if (o1.getGrate() == o2.getGrate()) {
return o1.getName().compareTo(o2.getName());
}
return o2.getGrate()-(o1.getGrate());
}
});
for (int i = 0; i < studentNums; i++) {
System.out.println(list.get(i).toString());
}
}
}
class Student {
private String name;
private int grate;
public Student(String name, int grate) {
this.name = name;
this.grate = grate;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getGrate() {
return grate;
}
public void setGrate(int grate) {
this.grate = grate;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", grate=" + grate +
'}';
}
}
3:Map
- 定义
Map<String,Integer> map = new HashMap<>();
- 赋值
for (int i = 0; i < 3; i++) {
String name = in.next();
int grade = in.nextInt();
map.put(name,grade);
}
- 遍历
map提供的get方法是根据key值来获取 value 值
for (String s : map.keySet()) {
System.out.println(s + " " + map.get(s));
}
- 常用API之判断某个值是否存在
map.containsKey("wyj")
- 常用API之移除某个key
map.remove("wyj")
4:Set
- 定义
HashSet<Integer> set = new HashSet<>();
- 赋值
for (int i = 0; i < 3; i++) {
int nums = in.nextInt();
set.add(nums);
}
- 遍历
这里的遍历的话 是可以去重的和升序的
for (int nums:set) {
System.out.println(nums);
}
- 常用API之判断某个元素是否存在
set.contains(元素)
- 常用API之移除某个key
set.remove(1)
- 常用API之清空容器
set.clear();
后序用到啥了再补充,这些都是平常用C++常用的API我就是在java当中找到对应的而已,一直不太想用java写算法题就是因为原来的C++的API调用熟悉了,但是打败恐惧的最好办法就是直面恐惧,我把以前不熟悉的总结出来,再用java写算法就不怵了 后续继续补充 有错请指出。。。。