2018經典算法問題淺析

淺談面試前的算法準備工做

筆者目前就讀於國外某校IT專業,面對逐漸嚴峻的移民政策自感移民無望,遂轉身準備回國發展(在哪裏敲代碼不是敲😐),有些錯過了國內的實習生春招,經過關係內推了國內的阿里巴巴和頭條,都是java研發崗,我的感受無論是國內什麼等級的過聯網公司的技術崗位對我的算法能力的要求都是首要考量標準,因此適當的在面試以前預熱本身是必要的,這篇文章主要用來記錄面對面試中算法部分的考覈,咱們應該如何着手準備。
據北美最新面試統計,78%題目來自leetcode原題,下面進行典型題目回顧。難度按照本人規定從簡單到苦難分爲a,aa,aaa三個等級java

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
相關文章
相關標籤/搜索