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个零)