ARTS是什么? Algorithm:每周至少做一个LeetCode的算法题 Review:阅读并点评至少一篇英文技术文章 Tip:学习至少一个技术技巧,总结和归纳日常工作中遇到的知识点 Share:分享一篇有观点和思考的技术文章
Algorithm
完成leetcode算法第260题。
使用哈希表存储每个元素出现的次数,然后找出只出现一次的数据。
进阶解法:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?(待实现)
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* 给定一个整数数组nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
* <p>
* 进阶:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?
* <p>
* 示例 1:
* <p>
* 输入:nums = [1,2,1,3,2,5]
* 输出:[3,5]
* 解释:[5, 3] 也是有效的答案。
* 示例 2:
* <p>
* 输入:nums = [-1,0]
* 输出:[-1,0]
* 示例 3:
* <p>
* 输入:nums = [0,1]
* 输出:[1,0]
* 提示:
* <p>
* 2 <= nums.length <= 3 * 104
* -231 <= nums[i] <= 231 - 1
* 除两个只出现一次的整数外,nums 中的其他数字都出现两次
*/
public class SingleNumber260 {
public static void main(String[] args) {
SingleNumber260 example = new SingleNumber260();
int[] nums = new int[]{1,2,1,3,2,5};
System.out.println(Arrays.toString(example.singleNumber(nums)));
nums = new int[]{-1,0};
System.out.println(Arrays.toString(example.singleNumber(nums)));
nums = new int[]{0,1};
System.out.println(Arrays.toString(example.singleNumber(nums)));
}
public int[] singleNumber(int[] nums) {
int[] res = new int[]{-1, -1};
Map<Integer, Integer> storage = new HashMap<>();
for (int num : nums) {
if (storage.containsKey(num)) {
storage.put(num, storage.get(num) + 1);
} else {
storage.put(num, 1);
}
}
Set<Integer> keys = storage.keySet();
for (Integer key : keys) {
if (storage.get(key) == 1) {
if (res[0] == -1) {
res[0] = key;
continue;
}
if (res[1] == -1) {
res[1] = key;
break;
}
}
}
return res;
}
}
Review
Java Enums: make your code clean.
使用枚举, 让代码更干净
文章介绍了什么是枚举;怎么使用枚举。并且通过在业务代码中通过和if else的比较说明了为什么枚举可以让代码变得更加干净。
其实枚举还有很多其他的用处,比如单例模式中可以使用枚举的不可变性去实现,这也是effective java中推荐的单例实现方式。其次,枚举可以让代码更加语义化,提高可读性。
Tip
- binlog的三种形式
- statement:记录原始的执行语句,优点是插入速度快;缺点是同一句sql在前后两次执行有可能会因为选错索引而导致执行结果不同
- row:记录sql语句修改的具体行,优点是不会存在数据不一致,可回滚数据;缺点是插入时间有可能会很长;由于现在数据的重要性大大提升,且随着技术的发展,性能和空间的重要性降低,这种格式的占比越来越高
- mixed:折中方案
- binlog中的xid:XID是用来联系bin log和redo log的。比如redo log里面有一个事务是prepare状态,但是不知道是不是commit状态,那就可以用XID去bin log里面查询该事务到底有没有提交。有提交则是commit状态,若没有提交则回滚该事务
- MySQL中双主结构中的循环复制:业务逻辑在节点 A 上更新了一条语句,然后再把生成的 binlog 发给节点 B,节点 B 执行完这条更新语句后也会生成 binlog。那么,如果节点 A 同时是节点 B 的备库,相当于又把节点 B 新生成的 binlog 拿过来执行了一次,然后节点 A 和 B 间,会不断地循环执行这个更新语句。
Share
写文章 - windows环境下docker安装MySQLFinish
预计完成时间:2021.10.25 ~ 2021.10.31
实际完成时间:2021.10.31