永远都不为自己选择的道路而后悔,人生如同坐火车,风景再美也会后退,流逝的时间和邂逅的人终会渐行渐远,前行的始终是自己
泛型常用特点
泛型是JavaSE1.5之后的特性,《Java核心技术》中对泛型的定义是:
“泛型”意味着编写的代码可以被不同类型的对象所重用
“泛型”,顾名思义,“泛指的类型”。我们提供了泛指的概念,但具体执行的时候却可以有具体的规则来约束,比如我们用的非常多的ArrayList就是个泛型类,ArrayList作为集合可以存放各种元素,如Integer,String,自定义的各种类型等,但在我们使用的时候通过具体的规则类约束,如我们可以约束集合中只存放Integer类型的元素,如
List<Integer> iniData = new ArrayList<>()
使用泛型的好处:
以集合来举例,使用泛型的好处是我们不必因为添加元素类型的不同而定义不同类型的集合,如整型集合类,浮点型集合类,字符串集合类,我们可以定义一个集合来存放整型、浮点型,字符串型数据,而这并不是最重要的,因为我们只要把底层存储设置了Object即可,添加的数据全部都可向上转型为Object。 更重要的是我们可以通过规则按照自己的想法控制存储的数据类型。
深拷贝和浅拷贝的区别
-
浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象.
意思就是虽然拷贝了,但是都指向一个引用
-
深拷贝:被复制对象的所有变量都含有与原来的对象相同的值.而那些引用其他对象的变量将指向 被复制过的新对象.而不再是原有的那些被引用的对象.换言之.深拷贝把要复制的对象所引用的 对象都复制了一遍.
意思就是全部都拷贝了,指向不同的引用
两个不相同的对象有可能有相同的hashcode值
在产生hash冲突时,两个不相等的对象就会有相同的 hashcode 值.
当hash冲突产生时,一般有以下几种方式来处理:
-
拉链法
每个哈希表节点都有一个next指针,多个哈希表节点可以用next指针构成一个单向链 表,被分配到同一个索引上的多个节点可以用这个单向链表进行存储.
-
开放定址法
一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总 能找到,并将记录存入
-
再哈希(双哈希法)
有多个不同的Hash函数.当发生冲突时,使用第二个,第三个…等哈希函数 计算地址,直到无冲突.
二分查找
题目:乘法表中第k小的数
难度:🌟🌟🌟🌟🌟
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/kth-smallest-number-in-multiplication-table
几乎每一个人都用 乘法表。但是你能在乘法表中快速找到第 k 小的数字吗?
乘法表是大小为 m x n 的一个整数矩阵,其中 mat[i][j] == i * j(下标从 1 开始)。
给你三个整数 m、n 和 k,请你在大小为 m x n 的乘法表中,找出并返回第 k 小的数字。
请先思考!!!!
|||||||||||
|||||||||||
|||||||||||
|||||||||||
|||||||||||
|||||||||||
|||||||||||
答答答答答答答答答答答
案案案案案案案案案案案
往往往往往往往往往往往
下下下下下下下下下下下
翻翻翻翻翻翻翻翻翻翻翻
|||||||||||
|||||||||||
|||||||||||
|||||||||||
|||||||||||
|||||||||||
|||||||||||
class Solution {
public int findKthNumber(int m, int n, int k) {
int l = 1;
int r = n*m;
while(l < r){
int mid = (l+r) >> 1;
if(check(m, n, mid, k)){
l = mid + 1;
}else {
r = mid;
}
}
return r;
}
public boolean check(int m, int n, int mid, int k){
int i = m;
int j = 1;
int count = 0;
while(i > 0 && j <= n && j > 0){
if((i * j) <= mid){
count += i;
j++;
}else {
i--;
}
}
return count < k;
}
}
题解:
这个问题类似于求一个二维数组的第k小问题,只不过由mat[i][j] < mid
变成了i*j < mid
详情看二分查找—有序矩阵中第 K 小的元素
class Solution {
public int findKthNumber(int m, int n, int k) {
int l = 1, r = m * n;
while (l < r) {
int mid = l + r >> 1, cnt = getCnt(mid);
if (cnt >= k) r = mid;
else l = mid + 1;
}
return r;
}
int getCnt(int mid) {
int ans = 0;
for (int i = 1; i <= n; i++) ans += (i * m) <= mid ? m : mid / i;
return ans;
}
}
精简答案!!!