目录

zrlong 的个人博客

希望大家都能保护好自己身上的特质,无论是五年还是十年,永远善良,不服输,热爱你所热爱。在漫长岁月的变迁里,是这些让你永远迷人,富有生命力。

大二下学期第十二周

总结

大二下学期第十周 有更新!

一周总结

约瑟夫环 有更新!

约瑟夫问题 约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。 解决方法 模拟法 刚学数据结构的时候,我们可能用链表的方法去模拟这个过程,N个人看作是N个链表节点,节点1指向节点2,节点2指向节点3,……,节点N-1指向节点N,节点N指向节点1,这样就形成了一个环。然后从节点1开始1、2、3……往下报数,每报到M,就把那个节点从环上删除。下一个节点接着从1开始报数。最终链表仅剩一个节点。它就是最终的胜利者。 缺点 可以想象如果数据量特别大时,算法的时间复杂度非常高,高达O(nm)。 公式法 既然没办法暴力解决,那我们就来找找其中的规律。 // 我们规定数到三的人出圈 // 当有1个人时,最终留下来的下标为0 f(1,3) = 0; // 当有2个人时,最终留下来的下标为1 f(2,3) = 1; // 当有3个人时,最终留下来的下标为1 f(3,3) = 1; // 当有4个人时,最终留下来的下标为0 f(4,3) = 0; // 当有5个人时,最终留下来的下标为3 f(5,3....

大二下学期第九周 有更新!

总结,吐槽。

Java爬取腾讯视频弹幕 有更新!

上周接了一个项目,是对视频弹幕的分析。在接之前还以为是什么管理系统,很简单就能写的,结果很有难度,弹幕爬取已经完成了,分析弹幕是个难点。

MySQL事务隔离级别和出现的问题 有更新!

昨天学长面试的时候有一道题,sql的哪个隔离级别可以防止幻读,我sql的知识已经快忘完了。之前学习的知识也要及时复习啊!

又被妙到了之位运算 有更新!

起因 今天写了一道分组位运算,让我再次感受到了位运算的奇妙。我整理的时候在想,会不会出现数组中有三个相同数的情况,整理完,我打开下一道题,真的是三个数的!这可把我难住了。我只想到了遍历,把所有出现的数的二进制各个数位相加,最后除以三取余。看到了别人的解析,我真是佩服的五体投地。 题目 剑指 Offer 56 - II. 数组中数字出现的次数 II - 力扣(LeetCode) (leetcode-cn.com) 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。 解析 有限状态自动机 二进制的各位进制规则相同,因此考虑一位就可以了。对于所有数字中的某二进制位 1 的个数,存在 3 种状态,即对 3 余数为 0, 1, 2。 输入二进制位1,则状态按如下顺序转换 输入二进制位0,则状态不变 0→1→2→0→⋯ 一位二进制只能表示两种状态,因此我们需要二位二进制来表示三种状态。设高位为two ,低位为one。则状态转换为: 对于单个二进制位的位运算的一些特点: 异或运算:x ^ 0 = x , x ^ 1 = ~x 与运算....

妙妙妙的分组位运算

写在前面的位运算知识点 与运算 按位与运算符(&) 参加运算的两个数,按二进制位进行“与”运算。 运算规则:只有两个数的二进制同时为1,结果才为1,否则为0。(负数按补码形式参加按位与运算) 即 0 & 0= 0 ,0 & 1= 0,1 & 0= 0, 1 & 1= 1。 例:3 &5 即 00000011 & 00000101 = 00000001 ,所以 3 & 5的值为1。 或运算 按位或运算符(|) 参加运算的两个数,按二进制位进行“或”运算。 运算规则:参加运算的两个数只要两个数中的一个为1,结果就为1。 即 0 | 0= 0 , 1 | 0= 1 , 0 | 1= 1 , 1 | 1= 1 。 例:2 | 4 即 00000010 | 00000100 = 00000110 ,所以2 | 4的值为 6 。 异或运算 异或运算符(^) 参加运算的两个数,按二进制位进行“异或”运算。 运算规则:参加运算的两个数,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。 即 0 ^ 0=0 , 0 ^ ....

JVM之对象探秘 有更新!

对象的创建 Java是一门面向对象的语言,在程序运行过程中每时每刻都有对象被创建出来。当我们需要对象时,我们就可以直接new一个,看似十分简单,但是其中的原理是什么呢? 检查 当Java虚拟机遇到一条字节码new指令时,首先会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,同时也会检查这个符号引用代表的类是否已经被加载、解析和初始化。如果没有则先进行类的加载过程(后续再进行总结)。 分配内存 对象所需内存的大小在类加载完成后就可以完全确定了。接下来就是给对象分配内存了。 指针碰撞(Bump The Pointer) 假设Java对内存空间是完全规整的,被使用过的对象都放在一边,空闲的空间在另一边,中间有一个指针作为分界的指示器,分配的内存就是把指针向空闲的地方移动一段与对象大小相等的内存。 空闲列表(Free List) 如果Java堆内存的空间是不规整的,已使用和未使用的内存交错在一起,此时就无法使用“指针碰撞”的方法了。因此,虚拟机需要记录下来那些空间内存是能够使用的,在分配对象是选择足够大的空间。 选择那种方式是取决于堆内存是否规整的,Java堆....

大二下学期第七周 有更新!

学习上 这周开始进入并发编程的学习,没了考核的压力,我开始学习了一些其他的技术,每天看看并发看看别的。多看看学长的博客总能学到一些新东西,前几天我看了看大佬的博客,发现了一个新技术Elasticsearch,一个分布式搜索引擎。我找到了它的官网,了解了一下。准备找个视频开始学习,结果发现需要学习一下NoSQL,我就去学习了NoSQL,学习了Cassandra,发现语法跟MySQL大差不差,基本是一样的,不过里面的数据库database换成了Keyspace,还有一些其他东西了。现在在看MongoDB,给感觉也是差不多的语法。它们的主要区别就是储存的数据结构不同,相比于MySQL,NoSQL的延展性更好,适合海量数据的存储。把MongoDB学完就去学习Elasticsearch。 明天继续总结JVM,每周总结一个模块,在复习中学习,温故而知新。 生活上 天气突然就热起来了,温度直接升到了30度,炎热的夏天又来了,幸好小组有空调,我已经开始穿短袖短裤了,不过我坐在中间的屋子到时候还是会很热。我发现最近我的身体越来越差了,肩膀酸疼,眼睛有时候花,这几天还心脏疼,我去找了医生,医生让我下周一去....

区间dp 有更新!

什么是区间dp? 顾名思义:区间dp就是在区间上进行动态规划,求解一段区间上的最优解。主要是通过合并小区间的 最优解进而得出整个大区间上最优解的dp算法。 思路 既然让我们求一个区间上的最优解,那我们就可以把一个长区间分为许多个小区间,求出每个小区间的最优解,然后再合并。 伪代码 for(int len = 1;len <= n;len++){//枚举长度 for(int j = 1;j + len - 1 <= n;j++){//枚举起点,ends<=n int ends = j + len - 1; for(int i = j;i < ends;i++){//枚举分割点,更新小区间最优解 dp[j][ends] = min(dp[j][ends],dp[j][i] + dp[i+1][ends] + something); } } } 经典例题 [石子合并](石子合并 - 蓝桥云课 (lanqiao.cn)) 根据区间dp的思想我们可以得出状态转移方程 dp[i][j] = Math.min(dp[i][j],dp[i][k] + dp[k + ....

大二下学期第六周 有更新!

每周总结

N皇后

题目描述 n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。 每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。 class Solution { public List<List<String>> solveNQueens(int n) { List<List<String>> ans = new ArrayList<>(); //记录每行皇后摆放位置 int[] arr = new int[n]; queen(n,0,arr,ans); return ans; } //判断是否冲突 public static boolean judge(int m,int[] arr){ for(int i=0;i<m;i++){ //判断是否在同一列或者在斜线上 if(arr[i] == arr[m] || M....

最大最小公倍数 有更新!

题目描述 已知一个正整数 N,问从 1~N中任选出三个数,他们的最小公倍数最大可以为多少。 输入描述 输入一个正整数 N。 1≤N≤10^6。 输出描述 输出一个整数表示答案。 输入输出样例 示例 1 输入 9 输出 504 这个题分四种情况: 1.小于2的直接输出n 2.n为偶数,且不为3的倍数,输出ans = n * (n - 1) * (n - 3),因为如果n可以被2整除,那么n - 2也会被2整除,n和n- 2就不是互质了; 3.n为偶数,且为3的倍数,输出ans = (n - 1) * (n - 2) * (n - 3),因为如果n可以被3整除,那么n - 3也会被3整除,n和n- 3就不是互质了; 4.n为奇数,输出ans = n * (n - 1) * (n - 2),因为这三个数之间两两互质; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //在此....

JAVA快速输入

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenizer; public class Main { public static void main(String[] args) throws IOException { StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); //每次输入前必须先执行这条语句 in.nextToken(); int n = (int) in.nval; out.print....

JVM之运行时数据区 有更新!

近期学了JVM,现在对JVM知识进行总结。这节是关于JVM运行时数据区的主要内容的介绍。