每周一个 Algorithm,Review 一篇英文文章,总结一个工作中的技术 Tip,以及 Share 一个传递价值观的东西!
Algorithm: 学习算法
解题过程:方法一是穷举法,双重循环保留最大值。另一个方法是双指针法,个人认为这种方法特别适用于数组,并且可以用移动任一指针来寻找最优解时使用。
针对这道题,用两个指针分别指向数组头尾。当遍历完数组,最优解一定在其中。而最优解是由两根线中较短的决定的,因此每次应当移动长度较短的那端。
优化:每次移动指针时,跳过所有比当前的线更短的数组下标。
解法:https://leetcode.com/submissions/detail/209254058/
class Solution { public int maxArea(int[] height) { int l=0; int r=height.length - 1; int max = 0; while (l<r) { int lh = height[l]; int rh = height[r]; int temp = Math.min(height[l], height[r]) * (r - l); max = temp > max ? temp : max; if(height[l] < height[r]) { while(height[++l] < lh && l<r) {} } else { while(height[--r] < rh && l<r) {} } } return max; } }
Review: 学习英文
题目:Always override hashCode when you override equals
内容概述:Effective Java中关于重写toString() 同时要重写 hashCode() 的说明。
in conjunction with 与...结合
Tips: 知识点
Java里重写toString() 同时要重写 hashCode().
这周遇到需要重写toString的需求,被提醒说要记得重写hashCode()。我重新读了effective java里关于这点的说明,写出来。
理解这个问题先要明白,如果重写toString() 同时不重写 hashCode()会发生什么?看下面的例子。
public final class PhoneNumber { private final short areaCode; private final short prefix; private final short lineNumber; public PhoneNumber(int areaCode, int prefix, int lineNumber) { rangeCheck(areaCode, 999, "area code"); rangeCheck(prefix, 999, "prefix"); rangeCheck(lineNumber, 9999, "line number"); this.areaCode = (short) areaCode; this.prefix = (short) prefix; this.lineNumber = (short) lineNumber; } private static void rangeCheck(int arg, int max, String name) { if (arg < 0 || arg > max) { throw new IllegalArgumentException(name + ": " + arg); } } @Override public boolean equals(Object o) { if (o == this) { return true; } if (!(o instanceof PhoneNumber)) { return false; } PhoneNumber pn = (PhoneNumber) o; return pn.lineNumber == lineNumber && pn.prefix == prefix && pn.areaCode == areaCode; } // Broken - no hashCode method! //... // Remainder omitted }
当你 放入一个PhoneNumber,然后get相同对象,你本来期望得到用户名,却得到null
Map<PhoneNumber, String> m= new HashMap<PhoneNumber, String>(); m.put(new PhoneNumber(707, 867, 5309), "Jenny");
m.get(new PhoneNumber(707 , 867 , 5309) //expect Jenny, but Null
我们知道相等的对象(equalsTo)应有相等的HashCode,那么写一个这样的hashCode()会发生什么?
// The worst possible legal hash function - never use! @Override public int hashCode() { return 42; }
这是一个合法但很糟的写法,把hashtable退化成了一个线性的链表。
好的写法应该怎么样?
已经有很多文章对此说明了,这里推荐用使用IDE智能生成,Intellij/Eclipse中都有,百度即可。
Share: 价值观
练好Clean Code基本功:
- 函数嵌套不超过两层
- 函数参数最好是没有
- 函数尽可能用简洁的方式写出
- 一个函数只做好一件事
- 函数名意义一致
- 函数调用的抽象层次要一致