哈希表

1、剑指 Offer 50. 第一个只出现一次的字符

考点:

class Solution:
    def firstUniqChar(self, s: str) -> str:
        ch_dict = {}
        for i in range(len(s)):
            cur = s[i]
            if cur in s[:i]:
                continue
            if not cur in s[i+1:]:
                return cur
        return " "

2、剑指 Offer 03. 数组中重复的数字

考点:

class Solution:
    def findRepeatNumber(self, nums: List[int]) -> int:
        n = len(nums)
        nums.sort()
        for i in range(1, n):
            if nums[i] == nums[i-1]:
                return nums[i]

3、面试题 10.02. 变位词组

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        result_dict = collections.defaultdict(list)
        for istr in strs:
            istr_list = list(istr)
            istr_list.sort()
            # print("".join(istr_list))
            result_dict["".join(istr_list)].append(istr)
        result = []
        for _, values in result_dict.items():
            result.append(values)
        return result

4、面试题 16.02. 单词频率

class WordsFrequency:

    def __init__(self, book: List[str]):
        
        self.word_fre = {}
        for word in book:
            if word in self.word_fre:
                self.word_fre[word] = self.word_fre[word] + 1
            else:
                self.word_fre[word] = 1

    def get(self, word: str) -> int:
        return self.word_fre.get(word, 0)

5、剑指 Offer 48. 最长不含重复字符的子字符串
考点:

1、注意双指针的序列长度要>=2,等于0和1 需要使用特殊值处理

2、for 循环right指针,range范围是(1, len(s)+1)

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        if len(s) == 0:
            return 0
        
        if len(s) == 1:
            return 1
        

        result = 0
        left = 0 
        for right in range(1, len(s)+1):
            # print(s[left:right])
            # 不重复
            if len(set(s[left:right])) == right - left:
                if right - left > result:
                    result = right - left
                continue
            
            # 重复
            while True:
                left = left + 1
                if left == right:
                    break
                if len(set(s[left:right])) == right - left:
                    if right - left > result:
                        result = right - left
                    break
        return result

6、726. 原子的数量

 

posted @ 2020-12-02 12:03  哈哈哈喽喽喽  阅读(82)  评论(0编辑  收藏  举报