踩坑记录(java)

1、leetcode:剑指 Offer 59 - II. 队列的最大值
我的方法(部分代码):

class MaxQueue {
     Queue<Integer> rear;
     Deque<Integer> temp;

    public MaxQueue() {
        rear = new LinkedList<Integer>();
        temp = new LinkedList<Integer>();
    }
    
    public int max_value() {
       if(temp.isEmpty()){
           return -1;
       }
       return temp.peekFirst();
    }
    
    public void push_back(int value) {
        rear.add(value);
        while(!temp.isEmpty()&&value>temp.peekLast()){
           temp.removeLast();
        }
        temp.add(value);
    }
    //     public int pop_front() {
    //     if (rear.isEmpty()) {
    //         return -1;
    //     }
    //     int ans = rear.poll();
    //     if (ans == temp.peekFirst()) {
    //         temp.pollFirst();
    //     }
    //     return ans;
    // }
    public int pop_front() {
         if(rear.isEmpty()){
           return -1;
       }
       if(rear.peek()==temp.peekFirst()){
           temp.pollFirst();
       }
       return rear.poll();
    }
}

注释掉的部分为答案方法;
错误之处在于:

public int pop_front() {
         if(rear.isEmpty()){
           return -1;
       }
       if(rear.peek()==temp.peekFirst()){
           temp.pollFirst();
       }
       return rear.poll();
    }

rear.peek()==temp.peekFirst()这里出去两个两个队列值进行比较,代码实际去除内容是两个Integer对象,对象使用 两个=进行比较,为错误做法,这里需要对数值进行比较。
Integer对象对比的是堆中的引用,题目需要对数值进行对比,可以进行类型转化后对比:(int)rear.peek()==(int)temp.peekFirst()
总结:自动拆箱和装箱机制的利用需要谨慎,Integer和int比对会自动转化为int,两个Integer比对比对的是堆中的引用。在进行数值比对是需要注意类似!Integer!or int!
同时注意Integer对象在-128-127之间会有对象的缓存,比较使用equals

2、归并排序:int mid =(left+right)/2 在left和right很大时会溢出, 应该使用 mid = left+(right - left)/2

3、int类型范围是-2147483648~2147483647,在做题中会输入边界值,对于边界值得操作需要谨慎,尤其是可能越界的操作!
4、Math.abs(Integer.MIN_VALUE)=Integer.MIN_VALUE
原码 补码 反码 补码为原码除符号位取反 反码为补码加1(可进位,符号位也进)
Integer.MIN_VALUE 补码就是:100000…(31个零)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值