文章目录
前言
题主只是个想混省三的小菜鸡,而且时间不足,所以所写内容可能略有不完善之处,待题主后天考完,有时间时,或许再完善
年份日期问题
闰年判定
闰年:年份能够被4整除但不能被100整除或者能被400整除的为闰年
月份天数
口诀:一三五七八十腊,三十一天永不差。闰年2月29天,平年2月28天
用一个月份数组存,数组的第一个数为0
前缀和,差分
一维前缀和
什么时候用?求一维数组的区间和
二维前缀和
什么时候用?求矩阵的子矩阵和
一维差分
什么时候用?给一维数组一段区间同时加上一个数
二维差分
什么时候用?给矩阵的子矩阵同时加上一个数
二分
什么时候用?有顺序的序列,并且可以按照某一个性质分为两段
并查集
什么时候用
- 将两个集合合并
- 询问两个集合是否在一个元素中
模版
package class_extra;
import java.util.*;
public class 并查集 {
public static int n,m;
public static int N = (int)(1e5 + 10);
public static int p[] = new int[N];//表示父节点
//返回祖宗节点,树根父节点就是他自己即p[x] == x
public static int find(int x){
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
m = scan.nextInt();
for(int i = 1; i <= n; i ++)
p[i] = i;
while(m -- > 0){
String s = scan.next();
int a = scan.nextInt();
int b = scan.nextInt();
//合并两个集合
if(s.equals("M")) p[find(a)] = find(b);
if(s.equals("Q")) {
if(find(a) == find(b))
System.out.println("Yes");
else
System.out.println("No");
}
}
}
}
质数判定
试除法判断质数
public static boolean is_prim(int n){
if(n < 2) return false;
for(int i = 2; i <= n / i; i ++){
if(n % i == 0) return false;
}
return true;
}
筛质数
每次循环时,把i的倍数给筛掉,如果i没有被筛掉,那他就是质数
import java.util.*;
public class Main{
public static int N = (int)(1e6 + 10);
public static boolean st[] = new boolean[N];
public static int prime[] = new int[N];
public static int n,cnt;
public static void getPrims(int n){
for(int i = 2; i <= n ; i ++){
//如果i没有被筛掉,就是质数
if(!st[i]){
cnt ++;
}
//筛去i的倍数
for(int j = i * 2; j <= n; j += i)
st[j] = true;
}
}
public static void main(String args[]){
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
getPrims(n);
System.out.println(cnt);
}
}
进制转换
(秦九韶算法)
题目:https://www.acwing.com/activity/content/problem/content/8270/
最大公约数
a与b的最大公约数就是a与a%b的最大公约数
https://www.acwing.com/solution/content/43234/
// a 与 b 的最大公约数等于b 与 a % b 的最大公约数
。 //返回最大公约数
public static int gcd(int a,int b){
return b != 0 ? gcd(b,a % b) : a;
}
最小公倍数
a与b的最大公约数 * 最小公倍数 = a * b
最小公倍数 = a * b / gcd(a,b)
快速幂
题目:https://www.acwing.com/problem/content/877/
public static int n,b,p;
public static long a;
public static long res;
//返回 a ^ b % p
public static long pmi(long a,int b,int p){
res = 1;
while(b != 0){ //对b进行二进制化,从低位到高位
if((b & 1) == 1) res = res * a % p; //最后一位为1则乘上a
b = b >> 1; //右移
//a用long
a = a * a % p; //更新a,a依次为a^{2^0},a^{2^1},a^{2^2},....,a^{2^logb}
}
return res;
}
。
dfs
暴搜,必考,
bfs
暂时不看了,太麻烦了,好好看看dfs吧
eclipse debug
左边打断点,小虫子启动,F6单步执行程序,F5跟踪到方法,F8到下一个断点
奇淫技巧
计算器的使用
- 可以计算20^22次方(快速幂解决的问题)(科学模式)
- 可以进行进制转换(程序员模式)
- 可以计算两个日期之间的差值(日期计算模式)
excel的使用
- 可以看某一天日期是星期几