最小的k个数
描述:
输入整数数组 arr
,找出其中最小的 k
个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
思路:
topK问题,最小k个数:维护一个容量为k的大堆
(1)特殊值处理
(2)创建一个堆(优先级队列PriorityQueue),默认是小堆,所以要重写比较器,lambda表达式((v1,v2) -> v2-v1)
(3)循环遍历数组,判断若堆未满就直接入队,或者当前值小于堆顶元素,堆顶出队,然后该值入队,循环完毕后堆里就是k个最小数,堆顶是第k小的数
(4)把堆里的元素放到数组中,创建一个返回数组res长度为堆的大小,循环从堆中取元素放到数组里,返回数组即可
代码:
class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
if(arr.length == 0 || k == 0) return new int[0];
Queue<Integer> pqueue = new PriorityQueue<>((v1,v2) -> v2 - v1);
for(int num : arr){
if(pqueue.size() < k){
pqueue.offer(num);
}else if(num < pqueue.peek()){
pqueue.poll();
pqueue.offer(num);
}
}
int[] res = new int[pqueue.size()];
for(int i = 0; i < res.length; i++){
res[i] = pqueue.poll();
}
return res;
}
}
回文数
描述:
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是
思路:
思路:直接反转数字,为了防止溢出问题,反转一半数字即可,何时到一半?原数小于反转后的数
(1)特殊值判断,若是负数,或(非0)以0结尾的数,返回false
(2)创建res接收反转的数字
(3)循环判断若x>res,说明不到一半,接收原数末位数字,把原数/10
(4)循环结束后两种情况,若原数为偶数,反转后和原数位数相同
若原数为奇数,反转后比原数多一位,末位就是中位数不影响,所以res/10舍弃末位,位数就相同了
(5)返回x==res || x == res/10
代码:
class Solution {
public boolean isPalindrome(int x) {
if(x == 0) return true;
if(x < 0 || (x % 10 == 0 && x != 0) ) return false;
int res = 0;
while(x > res){
res = (res * 10) + (x % 10);
x /= 10;
}
return x == res || x == res / 10;
}
}