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
方法一:数组形式实现
//若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的
static boolean isStraight(int[] nums) {
int min = 13, max = 2;
// 给数组排序
Arrays.sort(nums);
System.out.println(Arrays.toString(nums));
for (int i = 0; i < nums.length; i++) {
// 先排除大小王,同时避免下标越界
if (nums[i] != 0) {
//检索是否有重复元素,开始位置从第一个不是0的位置开始
int index = nums[i];
for (int j = i + 1; j < nums.length; j++) {
if (index == nums[j])
return false;
}
// 找到最大最小值
if (nums[i] < min) {
min = nums[i];
} else {
max = nums[i];
}
}
}
return max - min < 5 ? true : false;
}
//若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的
static boolean isStraight(int[] nums) {
int min = 13, max = 2;
// 给数组排序
Arrays.sort(nums);
System.out.println(Arrays.toString(nums));
for (int i = 0; i < nums.length; i++) {
// 先排除大小王,同时避免下标越界
if (nums[i] != 0) {
//检索是否有重复元素,开始位置从第一个不是0的位置开始
int index = nums[i];
for (int j = i + 1; j < nums.length; j++) {
if (index == nums[j])
return false;
}
// 找到最大最小值
if (nums[i] < min) {
min = nums[i];
} else {
max = nums[i];
}
}
}
return max - min < 5 ? true : false;
}
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+→(进入下一个访问块)
这样就可以实现在源码中的快速灵活切换,而不再需要重新访问层级