算法之路,任重道远。
作为一枚刷了一学期算法的大二生,寒假总结一下用Java刷题的技巧😎
1️⃣输入
一、读取输入并赋值
1.顺序访问,且只使用一次
数字
巧用for循环,直接比,注意第一组数据处理
str
nextInt()只读取了数字n却没有读取换行符,下一个nextLine()会读取换行符并解析为空串
nextLine 一行 & next只读字
str转int
String 字符串转整型 int 有以下两种方式:
- Integer.parseInt(str)
- Integer.valueOf(str).intValue()
整型 int 转 String 字符串类型有以下 3 种方法:
- String s = String.valueOf(i);
- String s = Integer.toString(i);
- String s = “” + i;
2.需按索引重复访问(创建数组)
数字
可以不用二维
// BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] line = br.readLine().split(" ");
int n = Integer.parseInt(line[0]), m = Integer.parseInt(line[1]);
int[][] nums = new int[n][m];
for ( int i = 0; i < n; i++ ) {
line = br.readLine().split(" ");
for ( int j = 0; j < m; j++ ) {
nums[i][j] = Integer.parseInt(line[j]);
}
}
//自定义输入
二、 Java集合
- 同C++STL容器,java集合必掌握
- 数组,list,set转换
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
String[] staffs = new String[]{"Tom", "Bob", "Jane"};
//数组转List
List staffsList = new ArrayList<String>();
for(String temp: staffs){
staffsList.add(temp);
}
staffsList.add("Mary"); // ok
staffsList.remove(0); // ok
for (Object str:staffsList){
System.out.print(str+" ");
}
=====================================================
//List转数组
Object[] result = staffsList.toArray();
//List转set
Set result = new HashSet(staffsList);
}
}
//数组转set
Set<String> staffsSet = new HashSet<>(Arrays.asList(staffs));
staffsSet.add("Mary"); // ok
staffsSet.remove("Tom"); // ok
//set转数组
Object[] result = staffsSet.toArray();
//set转List
List<String> result = new ArrayList<>(staffsSet);
- 常见int型转换
- List转int[]数组,使用java8的stream()。
int[] arr = list.stream().mapToInt(Integer::valueOf).toArray();
- int[]数组转List,如下:
int[] arr = {4, 5, 3, 6, 2, 5, 1};
List<Integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList());
//去重
Arrays.stream(arr).distinct().boxed().collect(Collectors.toList());
2️⃣操作
一、常见算法
二分搜索,差分,前缀和
二、常见数据结构
一般会用到List构造
栈 Stack myque = new LinkedList<>();
入栈:push方法,是push到最前面=addFirst
出栈:pop方法,是pop最前面的=removeFirst
LinkedList<Integer> array=new LinkedList<>();
array.push(3);//321
array.pop();//21
队列: Queue myque = new LinkedList<>();
入队:add(add=addLast)
出队:poll removeFirst
array.add(3);//123
array.removeFirst();//23
双端队列 Dequeue myque = new LinkedList<>();
三、排序
- Arrays.sort(a); 升序
- 自定义排序
降序:
public static void sort(T[] a,int fromIndex, int toIndex, Comparator<? super T> c)
或重写该类的compareTo()方法,使其按照从小到大顺序排序 - 使用PriorityQueue优先队列
.push() 插入一个元素
.pop() 删除队头优先
.peek() 查看队头
// 最小优先队列,直接 return o1.compareTo(o2);
PriorityQueue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2){
return o1 < o2 ? -1 : 1;
/* return o1.compare(o2); */
}
});
// 最大优先队列,则反过来 return o2.compareTo(o1);
四、字符串常见方法
ccf第三题一般会用到
3️⃣输出
print将它的参数显示在命令窗口,并将输出光标定位在所显示的最后一个字符之后。
println 将它的参数显示在命令窗口,并在结尾加上换行符,将输出光标定位在下一行的开始。
printf是格式化输出的形式。
小技巧:
- 输出结果放到res数组
- 多个参数,规格化的输出