ARTS是什么? Algorithm:每周至少做一个LeetCode的算法题 Review:阅读并点评至少一篇英文技术文章 Tip:学习至少一个技术技巧 Share:分享一篇有观点和思考的技术文章


Algorithm

剑指 Offer 61. 扑克牌中的顺子
从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。

示例 1:
输入: [1,2,3,4,5] 输出: True

示例 2:
输入: [0,0,1,2,5] 输出: True

限制:
数组长度为 5 ,数组的数取值为 [0, 13] .

解题思路
条件一:先排序,除大小王外,其他牌不重复,且连续
条件二:满足一的基础上,max-min < 5

方法一:数组形式实现

  1. //若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的
  2. static boolean isStraight(int[] nums) {
  3. int min = 13, max = 2;
  4. // 给数组排序
  5. Arrays.sort(nums);
  6. System.out.println(Arrays.toString(nums));
  7. for (int i = 0; i < nums.length; i++) {
  8. // 先排除大小王,同时避免下标越界
  9. if (nums[i] != 0) {
  10. //检索是否有重复元素,开始位置从第一个不是0的位置开始
  11. int index = nums[i];
  12. for (int j = i + 1; j < nums.length; j++) {
  13. if (index == nums[j])
  14. return false;
  15. }
  16. // 找到最大最小值
  17. if (nums[i] < min) {
  18. min = nums[i];
  19. } else {
  20. max = nums[i];
  21. }
  22. }
  23. }
  24. return max - min < 5 ? true : false;
  25. }
  1. //若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的
  2. static boolean isStraight(int[] nums) {
  3. int min = 13, max = 2;
  4. // 给数组排序
  5. Arrays.sort(nums);
  6. System.out.println(Arrays.toString(nums));
  7. for (int i = 0; i < nums.length; i++) {
  8. // 先排除大小王,同时避免下标越界
  9. if (nums[i] != 0) {
  10. //检索是否有重复元素,开始位置从第一个不是0的位置开始
  11. int index = nums[i];
  12. for (int j = i + 1; j < nums.length; j++) {
  13. if (index == nums[j])
  14. return false;
  15. }
  16. // 找到最大最小值
  17. if (nums[i] < min) {
  18. min = nums[i];
  19. } else {
  20. max = nums[i];
  21. }
  22. }
  23. }
  24. return max - min < 5 ? true : false;
  25. }

Review

What is a HashMap in Java?
Java中的HashMap是什么?
Java中的映射(Map)就是一种结构,也就是键值对结构,通过键映射到值(键就是检索值得对象)
HashMap得几大特点:

  • HashMap是非线程安全的
  • HashMap允许一个空键和多个空值(hashMap.put(null,null);)
  • HashMap的key唯一,且不重复
  • HashMap是无序列表,即元素存放顺序与读取顺序不一致
  • HashMap的键可以映射到一个值
  • HashMap给基本操作(put操作和get操作)提供了恒定时间和性能

HashMap的内部工作原理:
Hashmap 是键值对和节点数组的集合。 它使用数组和 LinkedList 来存储键值对。 Hashmap 还使用了一种叫做 hash的方法,通过 hashcode编码将对象转换为整数形式;
Hashmap 的工作受两个参数的影响,initialCapacity(初始容量)和 LoadFactor(负载因子)。 初始容量是指Hashmap对象在构建时的容量(1<<4 即1向左位移4位,常数:16),扩容时则每次以当前长度乘以2。LoadFactor参数衡量的是当前数组是否达到存储临界值进行扩容。

而外补充:
在JDK1.8之前,HashMap底层是以数组+链表的形式实现
但在JDK1.8之后,HashMap底层是以数组+链表+红黑树的形式实现
当单元素链表>8时,且数组的长度超过64,将会启动树算法,对当前地址下链表结构进行红黑树的转换,以提高链表的读取效率。


Tip

在IDEA上看源码的时候经常往下深入,就很难返回上一层级
最近发现其实IDEA有快捷键让你快速返回上一代买层级
通过Ctrl+Alt+←(返回上一访问快) + Ctrl+Alt+→(进入下一个访问块)
这样就可以实现在源码中的快速灵活切换,而不再需要重新访问层级


Share