浅谈面试前的算法准备工作
笔者目前就读于国外某校IT专业,面对逐渐严峻的移民政策自感移民无望,遂转身准备回国发展(在哪里敲代码不是敲?),有些错过了国内的实习生春招,通过关系内推了国内的阿里巴巴和头条,都是java研发岗,个人感觉不管是国内什么等级的过联网公司的技术岗位对个人算法能力的要求都是首要考量标准,所以适当的在面试之前预热自己是必要的,这篇文章主要用来记录面对面试中算法部分的考核,我们应该如何着手准备。
据北美最新面试统计,78%题目来自leetcode原题,下面进行典型题目回顾。难度按照本人规定从简单到苦难分为a,aa,aaa三个等级
leetcode_697.Degree of an Array
题目:输入一个含有非负整数nums的array,并且定义这个array的degree是它的出现次数最多的元素的个数,如何找到一个nums的最短长度的subarray,使得其degree和nums相同
思路:难度简单,主要考察map,dic数据结构使用,如果要找到符合要求的subarray,这个subarray一定是以原始array中出现次数最多的元素第一次出现为首,最后一次出现为尾部的子序列。那么我们记录好nums的两个角标,left,right,同时记录好元素出现次数count,出现次数最多元素的right - left + 1即为所求。
需要注意的细节是对于特殊输入的处理,比如nums元素个数为1,或者同时存在两个或者多个个数相同的元素的情况。
def findShortestSubArray(nums):
left, right, count = {}, {}, {}
result = len(nums)
for i, element in enumerate(nums):
if element in left:
right[element] = i
else:
left[element] = i
count[element] = count.get(element, 0) + 1
frequency = max(count.values())
if len(nums) == 1 or right == {}:
return 1
for i in count:
if count[i] == frequency:
result = min(result, right[i] - left[i] + 1)
return result