Monday, November 05, 2018

prep coding interview in first round 如何开始准备算法面试?

直接看答案.

因为你没有:
* 特定的算法,数据结构.
* 正确的思维方法 和 思维体系.
* 最优解
* 做题的感觉,代码从哪里开始

面试是考你如何运用算法和数据结构,不是考你创造发明算法。

这两天学到的。特别好。
看答案, 看答案.
第一遍:直接看答案.


有战友问: 看完答案以后呢?
A: 练习`解题`啊.  每道题练习 3~5次, 熟练到这个程度:`hard 题, 15分钟 AC提交`.

Q:第一遍看答案解题,看多少道呢?

A:Leetcode Top 500 道吧。

Saturday, October 13, 2018

2018 first mock coding interview

周五进行了一场模拟面试,S是应聘者,咱做考官。

首先说我自己,我一直就没有进入角色,都不知道怎么开展技术面试,我 2015年 在德银面试委员会待过一段时间,面试了40多个候选人,主要就问软技能的问题。那时候我还不会写程序。

下面是我面试过程中的一些感想和议论。

我觉得有一个手写版比较好,像九章令狐冲老师用的,讲解题目,解释原理和概念,很方便,不知道哪里可以买到 价廉物美的先试用?

战友 S,沟通能力特别强,始终都能把自己的意思清楚的表达出来,就是说话的时间多了,写题的时间就少了。

九章老师关于沟通的时间分配是这样讲的:

• 开始,问清楚题目的需求,确保自己完全理解需求,不要主观臆断,然后说出自己的解决方案的思路,征求考官的认可,也可以说出多个方案跟考官商议,共同确定一个较好的实现方法。要点是把考官当成自己未来的同事,你跟同事沟通的时候也要简洁明了,既要说清楚,又不能过于繁琐。
• 然后就让考官去玩手机,自己闷头做题。
• 做完题以后再跟考官简短说个总结就可以了,如果还有时间,可以解释一下代码中比较难以理解的部分。

S同学 分析能力强,思路清晰。

下面这些建议说给我,供给战友们参考。

各种常用基本算法和数据结构 需要多练习,直到熟练掌握,倒背如流。

多学习各种常用的优质模版代码,简短而易读,不容易出错,易于诊断。
代码长了,逻辑复杂,就容易出错。
多仿照练习优质模版代码,4遍5遍,直到熟练掌握。

S同学 大有可为,我们一线大厂见。

再加一句:  S同学的英语比我好多了,阴阳顿挫,发音清晰。

Wednesday, October 10, 2018

coding interview chat 面试算法座谈

各位老大好,

近期咱不定期的周一周三,进行面试算法解题讲座, 针对一流软件公司的面试题。
欢迎前来当听众和提问。

今天会谈到 基本数据结构:binary heap.
中级数据结构: hash heap, segment tree
和高级数据结构 segment tree with lazy propagation
(各种数据结构都是一层层深入演进,咱尽力解释的简单清晰).

会谈到一个算法: 扫描线算法,

有了这些基础知识以后,会打代码解答一个超高难度问题: 

heap 推荐学习资料:

Thursday, September 20, 2018

Best Time to Buy and Sell Stock series.

股票收益最大化,一系列有五六个题目。

这里仅回顾我前进中的心路, 停下来, 做个小结。
未来两个月后,下一步,我会重新训练解题思路。

正文开始了,

Q: 允许交易两次的股票收益最大化,这道题是不是枚举/模拟类题目?
Q: 这个题我自己没有想出答案。有没有什么指南训练一下,可以提高解题水平?

我用的是两端扫描的办法,从左和从右扫描得到,每端的依次的最大收益值,然后再扫描一次,两边相加求最大值,时间复杂度还是o(n)。
A:左边和右边加起来,找到全局最大化。

去年夏天,第一次面试前端,问了普通数字和罗马数字转换,我就没有想出解题思路。
普通数字和罗马数字转换,应该是标准的模拟/枚举题目。

2. Best Time to Buy and Sell Stock with Transaction Fee

这道题我毫无头绪。卡住两三天。
这一类题目,该怎么学习和训练呢?

大师点拨:
A:
This is a DP and Greedy related problem, I don't think you learn the algorithm yet.
It will be taught in advanced algorithm jiuzhang class. I will suggest you to skip.

At this moment, you are not the scientist who can invent the algorithm.
In fact almost all people are NOT. This is why...

😇 谢谢分析和打气鼓励。

据说最好的学习策略,就是不断的取得小胜利,我在这个问题上两三天取得了一个大失败,觉得很受挫折。
猛一看像是个简单的小问题,就想给他一举拿下。
这是九章算法班,最后一节课前缀和知识点,引出了一个股票交易问题,没想到延伸出了五六个问题,整个做法思路都变样了。
特别是这一道题,facebook考过,我就想着应该做出来。也算一个准备。

我的直观解法,通过了一多半测试,总是不甘心。
谢谢大师点拨,让我从死胡同里解脱出来,摆正心态,继续前进。

附录:

The hardest problem in this series.

393. Best Time to Buy and Sell Stock IV
lc, https://www.lintcode.com/problem/best-time-to-buy-and-sell-stock-iv

constraint: trade k times, get max gain.

idea:

我自己都没有搞清楚是怎么通过测试验收的. 虽然代码是我从头写出来的。

essential code:

    def maxProfit(self, k, prices):
        if not prices or len(prices) == 1:
            return 0
        buy = -prices[0]
        sell = 0
        if k > len(prices):
            for price in prices:
                buy = max(buy, sell - price)  # core code 
                sell = max(sell, buy + price)  # core code 
            return sell
        buys = [-float("inf")] * k
        sells = [0] * k
        for price in prices:
            buys[0] = max(buys[0], -price)
            for i in range(k):
                if i > 0:
                    buys[i] = max(buys[i], sells[i - 1] - price)
                sells[i] = max(sells[i], buys[i] + price)
        return sells[k - 1]

Friday, April 13, 2018

Thursday, April 05, 2018

Thoughts and an example on Expression-Oriented Programming

Here is the code, to read password from .pgpass to connect o a PostgreSQL database.

object DbUtil {
  def dbPassword(hostname:String, port:String, database:String, username:String ):String = {
    // Usage: val thatPassWord = dbPassword(hostname,port,database,username)
    // .pgpass file format, hostname:port:database:username:password
    val passwdFile = new java.io.File(scala.sys.env("HOME"), ".pgpass")
    var passwd = ""
    val fileSrc = scala.io.Source.fromFile(passwdFile)
    fileSrc.getLines.foreach{line =>
      val connCfg = line.split(":")
      if (hostname == connCfg(0)
        && port == connCfg(1)
        && database == connCfg(2)
        && username == connCfg(3)
      ) { 
        passwd = connCfg(4)
      }
    }
    fileSrc.close
    passwd
  }

  def passwordFromConn(connStr:String) = {
    // Usage: passwordFromConn("hostname:port:database:username")
    val connCfg = connStr.split(":")
    dbPassword(connCfg(0),connCfg(1),connCfg(2),connCfg(3))
  }
}

Thoughts.

* foreach v.s.  map().filter()(0) . e.g.: List(1,2,3).filter(_ > 0)(0)
* var passwd, v.s.  val passwd inside of foreach.
* is it good to do chain of method style?

* how to break when find one, in a for loop ?

import util.control.Breaks._
breakable {
for (i <- 1 to 10) {
println(i)
if (i > 4) break // break out of the for loop }
}

* other improvement ?

Wednesday, March 14, 2018

From Python chapter 2 code solution

Here is my answer for book:

从Python开始学编程


Chapter 2, Appendix A, Exam.

https://book.douban.com/subject/26919485/
..

from itertools import repeat

def gen():
int_rate = [0.01, 0.02, 0.03, 0.035, 0.05]
for r in int_rate:
yield r
for r in repeat(0.05):
yield r

def num_year_pay() :
house_price = 500000
year_pay = 30000
year_n = 1
rem = house_price

print(year_pay)

for r in gen():
if rem <=0:
break
print(r)
rem = rem * (1 + r) - year_pay
year_n = year_n + 1
print(rem)

return year_n

if __name__ == "__main__":
print("Number of years to pay loan: ", num_year_pay())

Number of years to pay loan: 31