做题
力扣62圆圈剩下的数字
通过反推来推出最后一个数字在一开始的数组的位置,就可以找到最后剩下的数字。这个思想还不是很理解,以后可以多注意注意。
堆排序
- 建立小(大)顶堆
从最后一个非叶节点开始,按倒序对所有非叶节点进行一次heapify操作
heapify操作指找到当前所指节点和两个孩子中的最小(大)值,并将其换到根节点。对换下来的节点再递归的进行heapify
public void heapify(int[] nums,int n, int l) {
if(n>=nums.length) return;
//找到两个孩子节点
int c1 = n*2 + 1;
int c2 = n*2 + 2;
//找到最小的元素并且换到堆顶
int min = n;
//注意孩子节点的下标不要越界
if((c1 < l) && (nums[c1] < nums[min])) {
min = c1;
//System.out.println(nums[0]);
}
if((c2 < l) && (nums[c2] < nums[min])) {
min = c2;
//System.out.println(nums[0]);
}
//换好元素之后,再对被换下来的位置进行heapify,
//一直递归往下,直到遇到一个符合小顶堆的子树为止
if(min != n) {
swap(nums,min,n);
heapify(nums, min, l);
}
}
- 弹出堆顶元素,进行堆排序
交换堆顶元素和最后一个元素,并删除最后一个元素,再对堆顶进行一次heapify
力扣189旋转数组
讲一个比较好用的方法
把整个数组翻转,然后分别翻转前k个和后n-k个。这里需要注意一下对于k>n的情况进行处理。
字符串转整型越界处理
if (ans > (Integer.MAX_VALUE - digit) / 10) {
// 本来应该是 ans * 10 + digit > Integer.MAX_VALUE
// 但是 *10 和 + digit 都有可能越界,所有都移动到右边去就可以了。
return negative? Integer.MIN_VALUE : Integer.MAX_VALUE;
}
还有一个
try{
return Integer.valueOf(res);
}
catch(Exception e){
if(rescharAt(0) == '-') return Integer.MIN_VALUE;
return Integer.MAX_VALUE;
JAVA学习
- 继承
私有成员变量和成员方法不能继承
默认成员变量和成员方法只能被用一个包中的其他类继承
protected成员变量和方法可以被不同包的子类继承
构造函数不能被继承
运行子类的构造函数前,先运行父类的构造函数
Java只支持单继承,不支持多继承 - 重写(也叫隐藏)(override)(在子类中根据需要对从父类继承来的方法进行修改)
重写方法时,不能使用比父类中被重写的方法权限更小的访问权限(public>protected>default>private)
被重写的方法与父类方法名相同,参数表也相同,返回值一致 - 多态的实现方法
重写(override):运行时才能确定调用哪个类的函数
重载(overload):编译时就能确定调用哪个函数 - final关键字
final修饰的常量不能在子类中被修改
final方法不能被重写
final类不能被继承 - instanceof
判断对象的类型
抽象类与接口
- 抽象类(用abastract修饰的类)
不能直接new创建对象
抽象类的实体中可以有abstract方法,只允许声明,不允许实现(不能打{})
抽象类中不一定包含abstract方法,但一个类中包含了abstract方法,则这个类必须被声明为abstract类 - 接口(是抽象类的一种,只包含常量和方法的定义,而没有变量和方法的实现,且其方法都是抽象方法)
只能定义public abstract方法,因此public abstract可以省略
只能定义常量,而且是公有的、静态的,所以public static final可以省略
子类实现接口的方法必须是public,因为重写不能降低权限
如果一个类只实现接口的部分方法,那么该类必须定义成抽象类
一个类可以同时实现多个接口,也可以在继承一个类的同时实现其他接口
若多个接口含有同名函数,则只实现一次
一个接口的引用变量仅知道被它的接口声明的方法
美团笔试题
FirstBlood
给出一个序列包含n个正整数的序列A,你可以从中删除若干个数,使得剩下的数字中的最大值和最小值之差不超过x,请问最少删除多少个数字。
DoubleKill
小仓酷爱射击运动。今天的小仓想挑战自我。小仓有N颗子弹,接下来小仓每次会自由选择K颗子弹进行连续射击,全中靶心的概率为p[k]。如果成功小仓将获得a[k]的得分,并且可以使用余下子弹继续射击,否则今天的挑战结束。小仓想知道在最佳策略下,自己能得到的最高期望分数是多少。
第一行一个数N,代表子弹数量。
第二行N个数p[],第 i 个数代表p[i]。
第三行N个数a[],第 i 个数代表a[i]。
1<=N<=5000 0<=p[i]<=1 0<=a[i]<=1000
TribleKill
给你一个长度为n的序列a,请你求出对每一个1<=l<r<=n的区间中最大值和最小值的异或和的异或和。例如序列为{1,3,5},不同的a(1,2)=13,a(1,3)=15,a(2,3)=(35),a(1,2)a(1,3)^a(2,3)=0,所以最后的答案是0。
牛客网上应该有,应该研究研究。