2018经典算法问题浅析

浅谈面试前的算法准备工作

笔者目前就读于国外某校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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值