zoukankan      html  css  js  c++  java
  • 每周学算法/读英文/知识点心得分享 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. 函数调用的抽象层次要一致
  • 相关阅读:
    centos6 vps部署rails
    初始设置ubuntu 16.04 Vps部署rails
    自己买的书籍
    linux mint 18.2 install erlang
    Bunder: What does :require => nil in Gemfile mean?
    javascript箭头函数
    SharpGL学习笔记(一) 平台构建与Opengl的hello World
    动力学仿真引擎ODE的学习笔记,C#演示(一)
    设计模式之 面向对象的养猪厂的故事,C#演示(二)
    设计模式之 面向对象的养猪厂的故事,C#演示(一)
  • 原文地址:https://www.cnblogs.com/andrew-chen/p/10397012.html
Copyright © 2011-2022 走看看