八股文
1.java中有哪些集合类请简单介绍一下
集合类分为两大类Collection和Map。前者是对象的集合,后者是键值对。
Collection分为List,Set,Queue三个接口。
List有LinkedList,ArrayList,Vector
Set(不允许重复)有HashSet,TreeSet(元素有序),LinkedHashSet(维护插入顺序)
Queue有LinkedList,PriorityQueue。
Map有HashMap,LinkedHashMap,TreeMap(键值有序),HashTable,ConcurrentHashMap(后两个都不允许键值为null) 实现类。
接口和抽象类有什么区别
接口是like a,抽象类是is a
Java 抽象类和接口的区别,看这一篇就够了,全面解析 | 二哥的Java进阶之路
算法
给你一个整数数组
nums
,你可以对它进行一些操作。每次操作中,选择任意一个
nums[i]
,删除它并获得nums[i]
的点数。之后,你必须删除 所有 等于nums[i] - 1
和nums[i] + 1
的元素。开始你拥有
0
个点数。返回你能通过这些操作获得的最大点数。示例 1:
输入:nums = [3,4,2] 输出:6 解释: 删除 4 获得 4 个点数,因此 3 也被删除。 之后,删除 2 获得 2 个点数。总共获得 6 个点数。
示例 2:
输入:nums = [2,2,3,3,3,4] 输出:9 解释: 删除 3 获得 3 个点数,接着要删除两个 2 和 4 。 之后,再次删除 3 获得 3 个点数,再次删除 3 获得 3 个点数。 总共获得 9 个点数。
提示:
1 <= nums.length <= 2 * 104
1 <= nums[i] <= 104
思路:这题看似有两个约束,但是如果把数组排序之后那就只用考虑前一个了,因为与打家劫舍的原理一致,如果前一个选中了那么后一个会给删掉,以此类推可以发现所有的都是按照规则去排,转化为顺序dp。
cnt记录每个元素出现几次,f[][1]表示选择该元素的最大值,f[][0]表示不选该元素的最大值
java
class Solution {
public int deleteAndEarn(int[] nums) {
int cnt[]=new int[10001];
int max=-1;
for(int i:nums){
cnt[i]++;
max=Math.max(max,i);
}
int f[][]=new int[max+1][2];
for(int i=1;i<=max;i++){
f[i][1]=f[i-1][0]+cnt[i]*i;
f[i][0]=Math.max(f[i-1][1],f[i-1][0]);
}
return Math.max(f[max][0],f[max][1]);
}
}
开心的事:跑完人生第一个五公里
不开心:暂时没有
思考:不能太晚睡觉,保持规律的作息,多去看望外婆。每天滚动复习前一天的知识点,明天开始做项目。新一年,新的开始,保持Day1的热情继续努力。
八股文来自:面试鸭