编程:1.lfu cache、lru cache
2.给一个正整数集合,求一个和最大且能被3整除的子集。Follow up: 如果集合里有正有负,怎么做(http://www.1point3acres.com/bbs/thread-331981-1-1.html)
3.leetcode136变体,如果出现两次的数总是相邻的,有没有比异或一遍更高效的做法
4.leetcode200-number of islands;followup:leetcode694-Number of Distinct Islands,leetcode253-
5.leetcode69 sqrt double (binary search)
6. calculate possibilities (dfs -> recursion -> dp)
给你n个硬币,每个硬币正面向上概率为一个array [p1, p2, ..., pn]
问题:每个硬币扔一次,计算k个正面向上的概率
follow up:空间怎么优化到On
7.很简单的二叉树题,判断树的所有节点value是不是都相同
9.给定N,请通过从小到大输出,分母不超过N的真分数序列。比如给定5,就输出1/5,1/4, 1/3,5/2,....等
先开始想了一个用PriorityQueue的算法,因为不超过N的序列中,以分母归类,以n=5为例,
1/5 2/5 3/5 4/5
1/4 2/4 3/4.本文原创自1point3acres论坛
1/3 2/3
1/2
首先把每一行的第一个元素加入PriorityQueue,再poll出来,poll到的数用一个指针往后移动,这样时间是O(nlogn)。. visit 1point3acres for more.
后来面试官给提示说,这其实是一个从左到右,从上到下都递增的序列,每次只需要比较右边的和下边的谁大就可以了。
10.一个4*4的棋盘,O代表空位,X或者Y代表棋子。每次可以移动一步,求问最少多少次可以移动至胜利。胜利的条件是,存在排成一列的或者一行或者一条斜线的X(或者Y)。
OXXY
XOOY. 留学申请论坛-一亩三分地
XXXY
YYOO
我先说了DFS,后来觉得应该是BFS,通过Hash值来保存棋盘的状态。
11.两堆石子(m,n),两个人A和B,每次只能取(0,k)或者(k,0)或者(k,k),其中k<=min(m,n)。求问如果A先取,A有没有必胜策略。
首先想的是迭代,边界条件是如果m=n,那么A必定赢了。
初步的想法是,f(m,n) = f(m-k,n-k) || f(m-k,n) || f(m,n-k) 等等 0<k<min(m,n)
时间复杂度是3的min(m,n)次方。
后来又说能不能提升复杂度,想到了记忆化搜索。但是最后面试官说可以达到O(m)的复杂度
最后一题忘记说赢的条件了,就是谁先把两堆石子都取完了,谁就赢了-google 1point3acres
12.口头design 一个类似于找一对朋友的东西,要求朋友间距离小于K,并且朋友属于同一组,不难,用一个sliding window size K, running time O(N)。
13.给N个点,连起来,长度K等分,找到等分点(在折线上),也不难,就是码有点难写,cornner case,dummy node 比较繁琐。 medium 难度,做法就是presum 然后binary search (或者map到index也可以,我用了upperbound)到位置找点,我没仔细写,写了几行core code,也是O(N)。
14.给一个size 为n的堆,O(k logk) 时间求这个堆中前k小的树
15.一个数轴上,有n个点(x1,x2,...,xn)和m个区间(a1_b1),(a2_b2),...,(am,bm)。每一个点只能匹配一个区间,每一个区间也只能匹配一个点。匹配的必要条件是点包含在区间之内
也就是对于(ai,bi),当ai<=x<=bi时,可以进行匹配,当然也可以选择不匹配,把这个区间让给其他的点。求最多可以有多少个区间被匹配到
17.面试官说由于你是面dl组的,所以coding不考难的。问了一些c++基本知识和c++11新特性,然后算法题 实现了一个循环队列,和一道跟树相关的easy题和followup
18.物体从x = 0处开始运动,初速度v0 = 1m/s, 给出两个array
l1 = [[2,4],[4,7]...]
l2 = [[1,3],[5,8]...].
l1表示物体运动到l1[i][0]时刻时,速度变为l1[i][1],
l2表示物体运动到l2[i][0]坐标时,速度变为l2[i][1]..
给定一个时间点t,求物体在t时刻的position.
19. Edit Distance
20.1. pow(x,n) ,log(n) 2. longest common subsequence +follow up dp +返回一个结果 +返回所有结果
21.第一题用DFS是肯定可以做的,但我当时想的是先排个序,然后greedy地取集合里的所有数,看看除3余几
1) 如果余0直接return
2) 如果余1,考虑是丢掉一个最小的除3余1的数,还是丢掉两个最小的除3余2的数.留学论坛-一亩-三分地
3) 如果余2也是类似的
后来跟面试官讨论发现其实不用排序。。打个擂台就能找了(但其实我是想着排序了代码好写一点orz)
优化后时间复杂度是O(n),本来还担心这个方法会不会有点野鸡,但是讲道理效率确实比DFS好得多。。。
follow up: 加入负数的话也是类似的,一开始greedy地取所有正数,然后再考虑是丢掉最小的正数还是加入最大的负数,复杂度一样
22.
介绍一下简历约5~10分钟
然后coding:
给array of integers. 1point 3acres 论坛
裡面有一个数字是单独出现 其他都会出现两次(而且一起出现)
ex: [1,2,2,3,3]
要判断哪个数字是单独出现的. 牛人云集,一亩三分地
以这个例子的话就是 1
面试官说有没有不用额外空间的方式
我说 那就用XOR 去算吧 剩下来的那个就是单独出现的了 複杂度是O(N)
面试官说可以,但是希望再想其他方式可以优化的 比如说O(logN)複杂度
看到logN就想到binary serach了
不过一时没有想到怎麽个search法
面试官给了提示才推出来的
结论就是用index是基数或偶数 来判断 search砍半时应该往前找或往后找 (多找两个例子就可以看出来了)
考binary tree
给你一棵树 问是不是uniform tree (也就是 整棵树的值都一样)
follow-up: 问这棵树有几个subtree是uniform tree.
两题都是divide & conquer recursive写的
面试官就说不然再考一题吧:.1point3acres网
给一个数组 裡面只有 0和1
问最少次数把0换成1 或把1换成0 可以让 0都在左边 1都在右边 (或者0都在右边 1都在左边)
[0,1,0,1]的话就是把第一个1换成0 可以达到分边
24.一面:
问了一些基础的data structure, algorithm, 聊了大概10分钟简历,然后一道很类似与merge sort的基础题目,但是corner case比较复杂,所以写完基本也就没什么时间follow up了。然后让问问题。
三面:
看到已经面了50分钟,还以为就结束了。没想到还有以到coding题目,我没见过,但后来面完发现之前地里有出现过... 不过其实挺简单,就是n个点在2D平面上,return k等分点的位置并返回。基本就是presum,然后考虑各种corner case
25.第一轮: leetcode76
第二轮: 简历
字典树
字符串匹配1 : 正常版 =>KMP/RK
字符串匹配2 : 模版串可以shuffle (abc 可以匹配bca)
字符串匹配3 : 模版串可以shuffle + mapping (abc 可以匹配321 abc =》 cba =》 321). 1point 3acres 论坛
字符串匹配4 : AC自动机
给n个点和m个区间,一个点最多匹配几个区间 问最多匹配几个区间和点 : 堆+扫描线 需要证明正确性 貌似用二分图?-google 1point3acres
给n的点形成一条折线,求k等分点 : 二分
有n个object 两两之间可以有三种关系(相同种类1,不同种类2,不知道2) 给m个三元组(object1, object2,relation 1/2/3)假设不存在矛盾 求问给定一些二元组(object1,object2) 输出他们的关系 . more info on 1point3acres
A B 1
A C 1.本文原创自1point3acres论坛
A D 2
C F 1
D E 2
则输出 B D =》 2 A E =》 3 A F =》1 并查集建点(same relation) + 图遍历建边(different relation)
26.leetcode215,但是不能用priority queue,必须用quick sort来写
leetcode53,这是个easy题很快就写好了,但是followup是找出两个subarray,使他们sum最大,这里我用的是两个数组保存每个位置左边的maximum subarray和右边的maximum subarray。然后找两个数组对应位置sum最大的就行了
1.问了ssh,远程连接如果断了,远程端程序还会继续运行吗?ssh跑远程程序,怎么保证断开链接,代码可以继续运行?
不会运行。为什么?
screen -s abc创建一个会话,在这个窗口执行程序,然后Ctrl+a+d 退出,让会话Detached,这样就能保证你的任务在后台一直运行,也不会随着终端的关闭任务就停止运行。
https://zhuanlan.zhihu.com/p/40133139
有时候我们需要任务在后台运行,且关机不影响任务的执行,推荐用screen.
首先linux下载screen 命令:进入root后 apt install screen 或者直接sudo apt install screen
(1)screen -S abc 创建一个abc的会话,即打开了一个新的窗口。在里面执行你想要执行的程序。再用Ctrl+a+d 退出,让会话Detached,这样就能保证你的任务在后台一直运行,也不会随着终端的关闭任务就停止运行。
(2)screen -ls 查看当前的会话。
(3)screen -r abc 重新连接abc这个会话,让会话Attached
(4)进入会话,Ctrl+d 为退出并删除会话。或者screen -X -S 会话名称 quit 直接强制杀死一个Detached 会话。
(5)screen -wipe 清除一系列Dead的会话。
2.情景题:for循环读十万张图片,如何优化,如何加速
大规模图片几百万张,如何加速处理,高效读取图片