先做一个大概介绍,目前完成了蓝桥杯启航班的视频学习,但是那内容并未完全掌握,同时刷题数非常的少,同时对java的很多语法应用较为不熟悉。为了方便复习和背模板,所以创建了这个专栏,也是自己第一次创建,(受到了来自梗佬刷题打卡的启发,莫名觉得这种方式很奈斯)
作为系统的复习,我想首先从质数和素数以及筛子开始,也算给自己一点小小的信心。
写到一半,补充一嘴,也是系统的梳理一下知识点,在时间非常紧张的情况下的应急之举。因为如果单纯自己每天看那个包的话,第一内容太多,效率太低,然后看了也就过了,说个实话,根本没啥用,顶多算认识。
看梗佬发的代码集合中,觉得这种处理字符串的方式很棒,记录一下
a[s.charAt(i)-'A']++; //s.charAt(i)-'A' 是将第i个字符映射到对应的位置
ms[c-'a']++; //将大写字母转化成0——26
将整数型转化成字符串的方式(底子太差,见谅)
if (String.valueOf(v).length()!=4) return false;
有关天数涉及到星期的模板
package test2;
public class 星期几 {
static int[] w = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
static int y = 1949, m = 10, d = 1, t = 6;
public static void main(String[] args) {
int ans = 0;
while (y != 2012 || m != 12 || d != 31) {
if (y % 400 == 0 || (y % 100 != 0 && y % 4 == 0)) w[2] = 29;
else w[2] = 28;
if (check()) {
ans++;
}
d++;
//星期
t++;
t %= 7;
if (d > w[m]) {
d = 1;
m++;
}
if (m > 12) {
y++;
m = 1;
}
}
if (check()) ans++;
System.out.println(ans);
}
static boolean check() {
return m == 10 && d == 1 && t == 0;
}
}
判断语句的新的写法(我也会其实,但是我肯定会写if)
System.out.println((long)max* 2 >ans?"No":"Yes");
Integer用来进制转换
/*
* public static String toBinaryString(int i)将十进制数 i 转换成二进制数
Integer.toBinaryString(10) "1010"
* public static String toOctalString(int i)将十进制数 i 转换成八进制数
Integer.toOctalString(10) "12"
* public static String toHexString(int i)将十进制 i 转换成十六进制数数
Integer.toHexString(10) "a"
* public static String toString(int i , int radix))将十进制数 i 转换成radix进制数
Integer.toString(10,2) "1010"
Integer.toString(10,8) "12"
Integer.toString(10,16) "a"
* public static int parseInt(String s , int radix)radix进制数 s 转换成十进制数
Integer.parseInt("11",16) "17"
Integer.parseInt("a",16) "10"
Integer.parseInt("A",16) "10" 注意,不区分大小写
*/
临时想到的,补充一下Arrays.sort()和list.clear用法
Arrays.sort(a,0,n) // 实际上它会访问下标从0到n-1的数据,需要注意
List<Integer> list=new ArrayList<>();
list.clear();
Scanner 输入字符数组的时候,处理方法(我是真的不会....)
另外,突然发现Arrays.sort()也可以用于字符串!!
Scanner sc = new Scanner(System.in);
char[] s = sc.next().toCharArray();
int n = s.length;
Arrays.sort(s);
StringBuilder 发现新大陆啦,原来字符串可以这么处理
StringBuilder builder = new StringBuilder("abc");
builder.append("just");
builder.insert(0, "you");
builder.deleteCharAt(index);
builder.toString();
builder.reverse();
终于遇见正式(bushi)的了,最小公倍数模板,短小精悍
通过递归不断地求,同时利用到了上面提到的表达式,真的很简洁美观
static int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
重磅来了,质因数模板,为啥说是板子,因为它真的很巧妙
看的似懂非懂,算了,就这么记,这样求出来的就是质因子
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
long res = 0;
for (long i = 2; i <= n / i; i++) { //核心位置
if (n % i == 0) { // 这里i是n的约束
res++;
int cnt = 0;
while (n % i == 0) {
n /= i;
cnt++; //这里好像用到了唯一最小分解定理,不确定,再看看
}
System.out.println(i + " " + cnt); //表示质因数i 和 幂次
}
}
if (n > 1) System.out.println(1); //这里其实就是因为n本身就是质数
//第二段,为了证明确实是模板
for (int i = 2333333; i <= 23333333; i++) {
int x = 0;
int t = i;
for (int j = 2; j <= t / j; j++) { //核心位置
while (t % j == 0) {
x++;
t /= j;
}
}
if (t > 1) x++;
if (x == 12) ans++;
}
将每一个数替换成他的最小质因子(诶筛)模板
static boolean[] st = new boolean[N];
static long[] pre = new long[N];
static void get_primes(int n) {
for (int i = 2; i <= n; i++) {
//说明i不是质数我们直接跳过
if (st[i]) continue;
//pre[j] 表示j的最小质因子
pre[i] = i;
//去掉i的倍数
for (int j = i + i; j <= n; j += i) {
if (!st[j]) {
st[j] = true;
//表示j的最小质因子是 i
pre[j] = i;
}
}
}
}
顺便附赠埃筛模板
static void init() {
//看上去是两层循环 但它的复杂度不是n^2 nlogn
for (int i = 2; i <= n; i++) {
if (st[i]) continue;
list.add(i);
for (int j = i + i; j <= n; j += i) {
st[j] = true;
}
}
}
判断质数的模板
static boolean check(long v) {
for (int i = 2; i <= v / i; i++) {
if (v % i == 0) return false;
}
return true;
}
数据流处理(应该不会考吧....)
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("C:\\Users\\86135\\Desktop\\lanqiaoyunke\\src\\test5\\primes.txt")));
while (true) {
//读取一整行数据
String s = br.readLine();
//说明没有数据了
if (s == null) break;
//一定一定要开long 1e12 把字符串转换成long类型
long v = Long.parseLong(s);
// n就是一个条件
}
附赠快读模板
import java.io.*;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String[] args)throws IOException {
计算n!中质因子的个数(模板)这里默认是5,可以修改
static long query(long x) { //计算n!中质因子x的数量
long ans = 0;
while (x > 0) {
ans += x / 5;
x /= 5;
}
return ans;
}
二分(这里放的代码比较随意,后面再说吧)
private static long slove(long x) {
int l = 1, r = 1500000;
while (l < r) {// 二分法快速求得 x 位于 sum 中的哪一块
int mid = l + r >> 1;
if (f(mid) < x)
l = mid + 1;
else
r = mid;
}
r--;// 求得前面块
x -= f(r);// 当前块的位置
return s[r] + f(x);// 用前面块是和+当前块的位置前缀和
}
二分这边需要刷题,具体题号是第二章节17-22题。包中test6。
还有“最小刷题数”,还是在这里提醒一下各位,看懂不代表下次能做出来。(深切体会)
先留个坑,明天补上。
不同子串切分问题(会写,但是暂时不知道咋解释,先放着吧)
public static void main(String[] args) {
String s = "0100110001010001";
Set<String> set = new HashSet<>();
for (int i = 1; i <= s.length(); i++) {
for (int j = 0; j + i <= s.length(); j++) {
set.add(s.substring(j, j + i));
}
}
System.out.println(set.size());
}
总结一下:今天作为一个开头,