文章目录
- 一:前言
- 1:为何刷题从C++转java
- 2:如何上手呢?
- 二:输入
- 1:常规的输入
- 2:关于其他输入符在nextLine()之前用吃掉回车符的问题解决
- 3:常见输入之我们输入一串数到容器中
- 三:常用的数据结构
- 1:数组
- 2.List
- 3:Map
- 4:Set
- 5.栈
- 6:队列
一:前言
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>() {@Overridepublic 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>() {@Overridepublic 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 100int sgrade = in.nextInt();list.add(new Student(sname,sgrade));}list.sort(new Comparator<Student>() {@Overridepublic 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;}@Overridepublic 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")
- Entry
由于Map中存放的元素均为键值对,故每一个键值对必然存在一个映射关系。
Map中采用Entry内部类来表示一个映射项,映射项包含Key和Value (我们总说键值对键值对, 每一个键值对也就是一个Entry)
Map.Entry里面包含getKey()和getValue()方法
Iterator<Map.Entry<Integer, Integer>> it=map.entrySet().iterator();while(it.hasNext()) {Map.Entry<Integer,Integer> entry=it.next();int key=entry.getKey();int value=entry.getValue();System.out.println(key+" "+value);}
- entrySet
entrySet是 java中 键-值 对的集合,Set里面的类型是Map.Entry,一般可以通过map.entrySet()得到。
entrySet实现了Set接口,里面存放的是键值对。一个K对应一个V。
用来遍历map的一种方法。
Set<Map.Entry<String, String>> entryseSet=map.entrySet();for (Map.Entry<String, String> entry:entryseSet) {System.out.println(entry.getKey()+","+entry.getValue());}
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();
5.栈
//这是一个双端队列
ArrayDeque<Character> deque = new ArrayDeque<>();//在栈中push就是往容器尾部插入一个值
deque.push('a');
deque.push('b');
deque.push('c');
deque.push('d');//访问栈顶元素
System.out.println(deque.peek());//删除一个元素
deque.pop();
System.out.println(deque.peek());
6:队列
//这是一个双端队列
ArrayDeque<Integer> deque = new ArrayDeque<>();//用add的话表示就是取元素顺序时候就是先进先出
deque.add(1);
deque.add(2);
deque.add(3);//我们用 peek()进行访问 访问的是队列首部元素
System.out.println(deque.peek());//我们用 pool()表示的就是移除队列首部元素
deque.poll();
System.out.println(deque.peek());//访问队尾元素
System.out.println(deque.getLast());//移除队尾元素
deque.removeLast();
System.out.println(deque.getLast());
后序用到啥了再补充,这些都是平常用C++常用的API我就是在java当中找到对应的而已,一直不太想用java写算法题就是因为原来的C++的API调用熟悉了,但是打败恐惧的最好办法就是直面恐惧,我把以前不熟悉的总结出来,再用java写算法就不怵了 后续继续补充 有错请指出。。。。