ARTS是什么? Algorithm:每周至少做一个LeetCode的算法题 Review:阅读并点评至少一篇英文技术文章 Tip:学习至少一个技术技巧,总结和归纳日常工作中遇到的知识点 Share:分享一篇有观点和思考的技术文章

Algorithm

完成leetcode算法第260题。
使用哈希表存储每个元素出现的次数,然后找出只出现一次的数据。
进阶解法:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?(待实现)

  1. import java.util.Arrays;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Set;
  5. /**
  6. * 给定一个整数数组nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
  7. * <p>
  8. * 进阶:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?
  9. * <p>
  10. * 示例 1:
  11. * <p>
  12. * 输入:nums = [1,2,1,3,2,5]
  13. * 输出:[3,5]
  14. * 解释:[5, 3] 也是有效的答案。
  15. * 示例 2:
  16. * <p>
  17. * 输入:nums = [-1,0]
  18. * 输出:[-1,0]
  19. * 示例 3:
  20. * <p>
  21. * 输入:nums = [0,1]
  22. * 输出:[1,0]
  23. * 提示:
  24. * <p>
  25. * 2 <= nums.length <= 3 * 104
  26. * -231 <= nums[i] <= 231 - 1
  27. * 除两个只出现一次的整数外,nums 中的其他数字都出现两次
  28. */
  29. public class SingleNumber260 {
  30. public static void main(String[] args) {
  31. SingleNumber260 example = new SingleNumber260();
  32. int[] nums = new int[]{1,2,1,3,2,5};
  33. System.out.println(Arrays.toString(example.singleNumber(nums)));
  34. nums = new int[]{-1,0};
  35. System.out.println(Arrays.toString(example.singleNumber(nums)));
  36. nums = new int[]{0,1};
  37. System.out.println(Arrays.toString(example.singleNumber(nums)));
  38. }
  39. public int[] singleNumber(int[] nums) {
  40. int[] res = new int[]{-1, -1};
  41. Map<Integer, Integer> storage = new HashMap<>();
  42. for (int num : nums) {
  43. if (storage.containsKey(num)) {
  44. storage.put(num, storage.get(num) + 1);
  45. } else {
  46. storage.put(num, 1);
  47. }
  48. }
  49. Set<Integer> keys = storage.keySet();
  50. for (Integer key : keys) {
  51. if (storage.get(key) == 1) {
  52. if (res[0] == -1) {
  53. res[0] = key;
  54. continue;
  55. }
  56. if (res[1] == -1) {
  57. res[1] = key;
  58. break;
  59. }
  60. }
  61. }
  62. return res;
  63. }
  64. }

Review

Java Enums: make your code clean.
使用枚举, 让代码更干净
文章介绍了什么是枚举;怎么使用枚举。并且通过在业务代码中通过和if else的比较说明了为什么枚举可以让代码变得更加干净。
其实枚举还有很多其他的用处,比如单例模式中可以使用枚举的不可变性去实现,这也是effective java中推荐的单例实现方式。其次,枚举可以让代码更加语义化,提高可读性。

Tip

  1. binlog的三种形式
    1. statement:记录原始的执行语句,优点是插入速度快;缺点是同一句sql在前后两次执行有可能会因为选错索引而导致执行结果不同
    2. row:记录sql语句修改的具体行,优点是不会存在数据不一致,可回滚数据;缺点是插入时间有可能会很长;由于现在数据的重要性大大提升,且随着技术的发展,性能和空间的重要性降低,这种格式的占比越来越高
    3. mixed:折中方案
  2. binlog中的xid:XID是用来联系bin log和redo log的。比如redo log里面有一个事务是prepare状态,但是不知道是不是commit状态,那就可以用XID去bin log里面查询该事务到底有没有提交。有提交则是commit状态,若没有提交则回滚该事务
  3. MySQL中双主结构中的循环复制:业务逻辑在节点 A 上更新了一条语句,然后再把生成的 binlog 发给节点 B,节点 B 执行完这条更新语句后也会生成 binlog。那么,如果节点 A 同时是节点 B 的备库,相当于又把节点 B 新生成的 binlog 拿过来执行了一次,然后节点 A 和 B 间,会不断地循环执行这个更新语句。

    Share

    写文章 - windows环境下docker安装MySQL

    Finish

    预计完成时间:2021.10.25 ~ 2021.10.31
    实际完成时间:2021.10.31