今日找人突击面试经验和编程思路,虽然这些不能速成,但也是颇受启发,得到了几点告诫:
1.面试过程要循序渐进,先从最简单的解决思路开始,逐渐优化到次优和最优
2.准备面试,各种类型的题目都接触一点,txt写代码和想思路的时间各占一半
3.当我们拿到题目的时候,首先要想怎么用逻辑思维解决这个题目,然后思考编程怎么实现,不要直接用编程思维去想题目,这样非常容易卡死。
下面描述几个算法题:
1.微软的2个题目其1:
https://hihocoder.com/problemset/problem/1499
难度L2
对于任意一个机器人而言,有三种状态:造机器人、做任务+造机器人、一直做任务。最优的情况一定是先造足够多的机器人,然后开始做任务,因为如果你交叉进行,那么做相同任务花费的时间可能更多,因为一个机器人做任务和造机器人穿插进行所做的任务<机器人造相同数目的机器人然后一直做任务。贪心策略
2.微软的2个题目-其2
https://hihocoder.com/problemset/problem/1500
难度L3
这个题目本身不是特别难,但是很复杂,是一个与树相关的问题。每一个节点都可以求一个最小代价,逐层向上。【背包问题:能够获取足够信息的最小代价(每个点仅与自己的孩子有关)】
3.Different ways to addParentheses
https://leetcode.com/problems/different-ways-to-add-parentheses/#/description
递归+记忆化
从数学的思维来理解,而不是加括号的方式来理解,因为括号只是一种运算优先级的表示,括号要加起来,可能能加很多个。从数学思维来理解,考虑最后一个运算的符号,可能是所有符号中的任何一个,左边一坨的结果集和右边一坨的结果集操作【递归】,某两个数字之间得到的结果集是固定的,那么可以用dict记录下来【记忆化】。
可以用python的set来实现
import collections
s = collections.Counter()
s.update("aaabbbbcc")
print(s)
4.BestTime to Buy and Sell Stock with Cooldown
https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/#/description
动态规划
如果没有销售冷冻的这种情况,任何时候我当前的操作均由下一天决定,如果第二天股票涨了那我就买,如果第二天股票跌了那我就卖出去,在不断地买卖过程中累积利润。
F(I,j):第i天开始状态为j;如果j为手上持股状态,该值表示股票数目;如果j表示手上不持股状态,该值表示总利润。
F(I,手上持股)=max { F(I-1,手上不持股)/Price(I-1),F(I-1,手上持股)}
F(I,手上不持股/前一天刚卖,今天冷冻)=F(I-1,手上持股)*Price(I-1)
F(I,手上不持股/今天不冷冻)=max {F(I-1,手上不持股/不冷冻),F(I-1),手上不持股/冷冻}
Function表示的是状态,+-*/表示状态之间的操作【动态规划】
5.贪心策略
Minimum Number of Arrows to Burst Balloons
https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/#/description
从数学的思路去思考,每次找最小的右端点,能够保证射中的最多,然后找到端点后,将射中的区间移除。
6.中位数
https://leetcode.com/problems/wiggle-sort-ii/#/description
找到中位数,将中位数右边的数字插入左边的序列。O(n)的时间找中位数,随机选取一个数,将比他大的放左边,比他小的放右边,取中位数下标的那一边。
7.位运算
https://leetcode.com/problems/integer-replacement/#/description
使用动态规划的思路,先将这个数转换成二进制,偶数就是移位操作【右移】。基数有两种操作,取更小的那个。
F(n):n为偶数直接右移一位;n为基数取min【+1或者-1】
8.拓扑排序
https://leetcode.com/problems/course-schedule/#/description
拓扑排序,每一个课程算是一个树的节点,有依赖关系的课程建立一条边。如果这些点和边可以构成有向无环图,有解;如果有环,则无解。
思路1:建立一个队列,找入度为0的点加入队列,遍历队列中的点,将每个点的后继加入图,同时把该后继的入度减1,标记已经加入图的点。如果在这个过程中遇到了入度为0的点就把他加入图。如果最后图中没有包含所有的点,则无解。
思路2:将所有的边反向,你要输出一个点,必须输出这个点的前驱【反向边就是后继】,这样保证先修,知道你输出了所有的点,如果不能那就无解。
9.并查集:维护连通性