努力经营当下,直至未来明朗!
普通小孩也要热爱生活!
一、选择
- 下面代码运行结果是( )
public class Test{
public int add(int a,int b){
try {
return a+b;
}catch (Exception e) {
System.out.println("catch语句块");
}finally{
System.out.println("finally语句块");
}
return 0;
}
public static void main(String argv[]){
Test test =new Test();
System.out.println("和是:"+test.add(9, 34));
}
}
A: catch语句块 和是:43
B: 编译异常
C: finally语句块
和是:43
D: 和是:43
finally语句块
- 以下说法哪个是正确的【多选】( )
A: IOException在编译时会被发现
B: NullPointerEception在编译时不被发现
C: SQLException在编译时会被发现
D: FileNotFoundException在编译时会被发现
二、编程
1. 数组中的第K个最大元素
LeetCode215.数组中第K个最大元素
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
① 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
② 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。
2. 组合总数III
LeetCode216.组合III
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
答案
1. 选择
- ① 在main函数中调用了add方法,先执行try,再执行catch,最后执行finally;但是此时try没有捕捉到任何异常,所以直接先执行try,然后执行finally。
② 执行完add方法后才去执行main方法中接下来的代码,所以先输出finally内容,再输出main中的内容。
故:选C
- ① 必检异常(编译时异常):一定要进行异常声明
② 免检异常(运行时异常):RunTimeException以及其子类对应的异常,都称为运行时异常。比如:NullPointerException、ArrayIndexOutOfBoundsException、ArithmeticException等。
③ IOException,FileNotFoundException,ClassNotFoundException,SQLException都属于编译时异常;
NullPointerEception属于运行时异常
故:选ABCD
- ① 可以使用throw关键字在指定的方法中抛出指定的异常,例如
throw new Exception("异常产生的原因")
② throw抛出异常,throws声明异常!
2. 编程
- 数组中第K个最大元素
1)思路:
① 求数组排序后,第 k 大的元素,思路有很多:
A.可以先把数组降序排序,再取第 k-1 个元素(从0开始)
B.也可以把数组升序排序,再取第数组长度-k
个元素
② 但是:注意本题是第K个最大元素,起类似于topK问题,使用堆排序。
③ 我们可以创建一个小顶堆,从数组中取元素存放在堆中,这个过程可以维护堆的长度为k,那么,遍历完数组以后,堆顶元素即为求的第 k 个元素。
④ 注意:针对的是所有元素,而不是不同的元素!(即:相同的n个元素也要排n个位!)
2)使用优先级队列PriorityQueue建立小根堆。
3)代码:
class Solution {
public int findKthLargest(int[] nums, int k) {
// 首先建立小根堆(大小只有k个元素)
PriorityQueue<Integer> queue = new PriorityQueue<>();
// 遍历元素,放入小根堆【注意大小限制】
for (int x : nums) {
// 将元素添加到堆中
queue.add(x);
// 维护堆的k个元素,超出则删除堆顶的最小元素
// 我需要的是第k大,也就是尽量保留大的,从大的数的第k个就是需要的
if(queue.size() > k) {
queue.poll(); // 直接删除堆顶元素
}
}
// 最后堆顶元素就是所求的元素
return queue.peek();
}
}
- 组合总数III
【深度搜索 + 回溯算法】
1)思路:
2)代码: