每周学算法/读英文/知识点心得分享 2.11

 每周一个 Algorithm,Review 一篇英文文章,总结一个工作中的技术 Tip,以及 Share 一个传递价值观的东西!

Algorithm: 学习算法

题目:Container With Most Water

解题过程:方法一是穷举法,双重循环保留最大值。另一个方法是双指针法,个人认为这种方法特别适用于数组,并且可以用移动任一指针来寻找最优解时使用。

针对这道题,用两个指针分别指向数组头尾。当遍历完数组,最优解一定在其中。而最优解是由两根线中较短的决定的,因此每次应当移动长度较短的那端。

优化:每次移动指针时,跳过所有比当前的线更短的数组下标。

解法: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基本功:

  1. 函数嵌套不超过两层
  2. 函数参数最好是没有
  3. 函数尽可能用简洁的方式写出
  4. 一个函数只做好一件事
  5. 函数名意义一致
  6. 函数调用的抽象层次要一致
原文地址:https://www.cnblogs.com/andrew-chen/p/10397012.html