4.4周记

做题

力扣62圆圈剩下的数字

通过反推来推出最后一个数字在一开始的数组的位置,就可以找到最后剩下的数字。这个思想还不是很理解,以后可以多注意注意。

堆排序
  1. 建立小(大)顶堆
    从最后一个非叶节点开始,按倒序对所有非叶节点进行一次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);
        }
    }

  1. 弹出堆顶元素,进行堆排序
    交换堆顶元素和最后一个元素,并删除最后一个元素,再对堆顶进行一次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。

牛客网上应该有,应该研究研究。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值