记录冲击省赛的第一天的学习内容

先做一个大概介绍,目前完成了蓝桥杯启航班的视频学习,但是那内容并未完全掌握,同时刷题数非常的少,同时对java的很多语法应用较为不熟悉。为了方便复习和背模板,所以创建了这个专栏,也是自己第一次创建,(受到了来自梗佬刷题打卡的启发,莫名觉得这种方式很奈斯)


作为系统的复习,我想首先从质数和素数以及筛子开始,也算给自己一点小小的信心。

写到一半,补充一嘴,也是系统的梳理一下知识点,在时间非常紧张的情况下的应急之举。因为如果单纯自己每天看那个包的话,第一内容太多,效率太低,然后看了也就过了,说个实话,根本没啥用,顶多算认识。


  1. 看梗佬发的代码集合中,觉得这种处理字符串的方式很棒,记录一下

 a[s.charAt(i)-'A']++;  //s.charAt(i)-'A' 是将第i个字符映射到对应的位置
ms[c-'a']++;  //将大写字母转化成0——26
  1. 将整数型转化成字符串的方式(底子太差,见谅)

if (String.valueOf(v).length()!=4) return false;
  1. 有关天数涉及到星期的模板

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;
    }
}
  1. 判断语句的新的写法(我也会其实,但是我肯定会写if)

 System.out.println((long)max* 2 >ans?"No":"Yes");
  1. 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"    注意,不区分大小写
 */
  1. 临时想到的,补充一下Arrays.sort()和list.clear用法

Arrays.sort(a,0,n) // 实际上它会访问下标从0到n-1的数据,需要注意

List<Integer> list=new ArrayList<>();
list.clear();
  1. Scanner 输入字符数组的时候,处理方法(我是真的不会....)

另外,突然发现Arrays.sort()也可以用于字符串!!

        Scanner sc = new Scanner(System.in);
        char[] s = sc.next().toCharArray();
        int n = s.length;

 Arrays.sort(s);
  1. StringBuilder 发现新大陆啦,原来字符串可以这么处理

StringBuilder builder = new StringBuilder("abc");
builder.append("just");
builder.insert(0, "you");
builder.deleteCharAt(index);
builder.toString();
builder.reverse();
  1. 终于遇见正式(bushi)的了,最小公倍数模板,短小精悍

通过递归不断地求,同时利用到了上面提到的表达式,真的很简洁美观

 static int gcd(int a, int b) {
        return b == 0 ? a : gcd(b, a % b);
    }
  1. 重磅来了,质因数模板,为啥说是板子,因为它真的很巧妙

看的似懂非懂,算了,就这么记,这样求出来的就是质因子

        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++;
        }
  1. 将每一个数替换成他的最小质因子(诶筛)模板

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;
    }
  1. 数据流处理(应该不会考吧....)

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  {
  1. 计算n!中质因子的个数(模板)这里默认是5,可以修改

static long query(long x) { //计算n!中质因子x的数量
        long ans = 0;
        while (x > 0) {
            ans += x / 5;
            x /= 5;
        }
        return ans;
    }
  1. 二分(这里放的代码比较随意,后面再说吧)

 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。

还有“最小刷题数”,还是在这里提醒一下各位,看懂不代表下次能做出来。(深切体会)

先留个坑,明天补上。

  1. 不同子串切分问题(会写,但是暂时不知道咋解释,先放着吧)

  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());
    }

总结一下:今天作为一个开头,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值