ARTS是什么? Algorithm:每周至少做一个LeetCode的算法题 Review:阅读并点评至少一篇英文技术文章 Tip:学习至少一个技术技巧,总结和归纳日常工作中遇到的知识点 Share:分享一篇有观点和思考的技术文章
Algorithm
完成leetcode算法第229题。
使用哈希表存储每个元素出现的次数,然后和数组长度做比对,返回所有符合条件的数据
进阶解法:摩尔投票法(待实现)
import java.util.*;
/**
* 给定一个大小为n的整数数组,找出其中所有出现超过[ n/3 ]次的元素。
*
* 示例1:
*
* 输入:[3,2,3]
* 输出:[3]
* 示例 2:
*
* 输入:nums = [1]
* 输出:[1]
* 示例 3:
*
* 输入:[1,1,1,3,3,2,2,2]
* 输出:[1,2]
*
*
* 提示:
* 1 <= nums.length <= 5 * 10^4
* -109 <= nums[i] <= 109
*
* 进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1)的算法解决此问题
*/
public class MajorityElement229 {
public static void main(String[] args) {
MajorityElement229 example = new MajorityElement229();
int[] nums = new int[]{3,2,3};
System.out.println(example.majorityElement(nums).toString());
nums = new int[]{1};
System.out.println(example.majorityElement(nums).toString());
nums = new int[]{1,1,1,3,3,2,2,2};
System.out.println(example.majorityElement(nums).toString());
}
public List<Integer> majorityElement(int[] nums) {
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);
}
}
List<Integer> res = new ArrayList<>();
Set<Integer> keys = storage.keySet();
for (Integer key : keys) {
if (storage.get(key) * 3 > nums.length) {
res.add(key);
}
}
return res;
}
}
Review
5 Common mistakes in JAVA
Java中5个常见的错误
- “==”表示对象的引用相同,”equals()”表示对象的值相同
- 使用equals()时要注意调用方是否为空,如果为空会造成空指针异常,所以一般都会用不为空的对象当调用方
- for-each只会在列表中有元素时才进行迭代,所以在for-each中不需要做null的判断
- 使用switch时要记得在每个case的末尾加上break,不然程序会一直运行下去,除非你希望它这样
不要在for-each中remove元素,会触发快速失败;可以使用iterator替代
Tip
MySQL的delete操作只是标记数据【已删除】,这种标记数据在存储中看着像【黑洞】;insert操作如果伴随着页分裂,也有可能造成这种【黑洞】
- alter table 通过将表数据复制到新表,从根本上消除这种【黑洞】,来达到回收表空间的目的,但是这个时候,该表的所有更新操作都会被阻塞
- MySQL5.6版本开始,在复制数据的同时,所有的更新操作会记录到row log,等待复制完成然后重放row log,使得alter table的同时也能进行业务操作,这就是online dll。但是这个操作还是会耗费大量IO和CPU,需要选择合适的时间,谨慎操作
Share
写文章 - Java的历史与现状Finish
预计完成时间:2021.10.18 ~ 2021.10.24
实际完成时间:2021.10.24