3个月用python刷完leetcode600题!-hash table简单题(一)

十五天的时间,刷完了所有的简单题,避免遗忘,所以开始简单题的二刷,第一遍刷题的时候过得速度比较快,因为我觉得基础不好的我,不要硬着头皮去想最优的方法,而是应该尽量去学一些算法思想,所以每道题只给自己5-10分钟的时间想,想不出来的就去找相关的答案,所以刷的比较快。二刷的时候按照leetcode官方给出的题目分类展开,同时,将解题思路记录于简书加深印象。
想要一起刷题的小伙伴,我们一起加油吧!
我的github连接:https://github.com/princewen/leetcode_python

1、Two Sum

http://www.jianshu.com/p/b71fc7307e42

136. Single Number

Single Number

"""
这道题虽然放在了hashtable里,但其实用二进制的算法更容易求解
两个相同数的二进制异或为0,所以遍历一边数组,出现两次的异或值变为0,那么剩下的数就是出现一次的数
"""

class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        res = 0
        for i in nums:
            res = res ^ i
        return res

202. Happy Number

Happy Number

"""解法1,用列表保存出现过的数,当出现重复的数字的时候,说明出现了循环,循环有两种情况,一种不是hayyp数,循环的数必不是1,如果是happy数,那么会出现1的不断循环"""

class Solution(object):
    def isHappy(self, n):
        """
        :type n: int
        :rtype: bool
        """
        c = set()
        while not n in c:
            c.add(n)
            n = sum([int(x) ** 2 for x in str(n)])
        return n==1

"""解法2,使用追赶法,快的指针每次前进两步,慢的指针每次只前进一步,当快的指针追上慢的指针即二者数字相同时,同样说明出现了循环,情况同上"""

class Solution(object):
    def isHappy(self, n):
        """
        :type n: int
        :rtype: bool
        """
        slow = n
        quick = sum([int(x) ** 2 for x in str(n)])
        while quick != slow:
            quick = sum([int(x) ** 2 for x in str(quick)])
            quick = sum([int(x) ** 2 for x in str(quick)])
            slow = sum([int(x) ** 2 for x in str(slow)])
        return slow == 1

204. Count Primes

Count Primes

统计比n小的质数有多少,首先设置一个数组,全部质为true,然后遍历2-sqrt(n)的数,把他们的倍数所在的数组位置
置为True这里为了避免重复,从ii的位置开始,而不是从i2的位置开始,因为i2,i3,i*n-1其实已经置为false了.

class Solution(object):
    def countPrimes(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n < 3:
            return 0
        res = [True] * n
        res[0] = res[1] = False
        for i in range(2,int(math.sqrt(n)) + 1):
            res[i*i:n:i] = [False] * len(res[i*i:n:i])
        return sum(res)

205. Isomorphic Strings

Isomorphic Strings

一开始我的解法是这样的,但是这是不对的,如下面的情况s='ab',t='aa' 就会出现错误

class Solution(object):
    def isIsomorphic(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        if len(s) != len(t):
            return False
        dic = dict()
        for i in range(len(s)):
            if s[i] in dic and dic[s[i]] != t[i]:
                return False
            else:
                dic[s[i]] = t[i]
        return True

所以用两个dict分别对应保存两个字符串对应位置的对方字符,只要其中一个不满足条件,则返回错误

class Solution(object):
    def isIsomorphic(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        if len(s) != len(t):
            return False
        dic1 = dict()
        dic2 = dict()
        for i in range(len(s)):
            if (s[i] in dic1 and dic1[s[i]] != t[i]) or (t[i] in dic2 and dic2[t[i]] != s[i]):
                return False
            else:
                dic1[s[i]] = t[i]
                dic2[t[i]] = s[i]
        return True

其实,还有更简单的解法,使用zip将两个数组对应位置元素相连,再利用set不能有重复元素的特性,判断三者的长度是否相同即可

class Solution(object):
    def isIsomorphic(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        return len(set(zip(s,t))) == len(set(s)) == len(set(t))

217、Contains Duplicate

219、Contains Duplicate||

这两题参见http://www.jianshu.com/p/217cb8cc5d08

242. Valid Anagram

Valid Anagram

用两个字典保存字符出现的情况,判断两个字典是否相同即可

class Solution(object):
    def isAnagram(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        dic1 = {}
        dic2 = {}
        for i in s:
            dic1[i] = dic1.get(i,0)+1
        for i in t:
            dic2[i] = dic2.get(i,0)+1
        return dic1 == dic2

290. Word Pattern

Word Pattern

将str 用split分开之后,解法类似于205题

class Solution(object):
    def wordPattern(self, pattern, str):
        """
        :type pattern: str
        :type str: str
        :rtype: bool
        """

        return len(pattern) == len(str.split(' ')) and len(set(zip(pattern, str.split(' ')))) == len(
            set(pattern)) == len(set(str.split(' ')))

349. Intersection of Two Arrays

Intersection of Two Arrays

可以使用hash table保存下数组1的出现的元素,然后判断数组2中的各元素是否在数组1中出现过,但直接使用set更简单

class Solution(object):
    def intersection(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """

        nums1 = set(nums1)
        return [x for x in set(nums2) if x in nums1]

350. Intersection of Two Arrays II

Intersection of Two Arrays II

使用两个字典记录下两个数组中元素出现的次数

class Solution(object):
    def intersect(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        dic1,dic2 = dict(),dict()
        for num in nums1:
            dic1[num] = dic1.get(num,0) + 1
        for num in nums2:
            dic2[num] = dic2.get(num,0) + 1
        return [x for x in dic2 for j in range(min(dic1.get(x,0),dic2.get(x,0)))]

但是python内置了Counter类型数组,可以方便实现计数功能

import collections

class Solution(object):
    def intersect(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        c1,c2 = collections.Counter(nums1),collections.Counter(nums2)
        return [i for i in c1.keys() for j in range(min([c1[i], c2[i]]))]

如果你喜欢我写的文章,可以帮忙给小编点个赞或者加个关注,我一定会互粉的!
如果大家对leetcode感兴趣,欢迎跟小编进行交流,小编微信为sxw2251,加我要写好备注哟!:

我的微信
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容

  • LeetCode 刷题随手记 - 第一部分 前 256 题(非会员),仅算法题,的吐槽 https://leetc...
    蕾娜漢默阅读 17,418评论 2 36
  • leetcode刷题记录本文记录一下leetcode刷题记录,记录一下自己的解法和心得。 LeetCode Two...
    EarthChen阅读 3,425评论 0 6
  • 人物:小艾,小伍,小玲,老师 场景:教室 内容: 小玲趴在桌上睡觉。 小艾丢了本书在旁边,出去。 ...
    蜡笔哥哥_阅读 258评论 0 0
  • lipo SDK.a -thin armv7 -output arm/SDK.a将fat文件拆分得到armv7类型...
    盘石垂钓阅读 762评论 0 0
  • 暗恋 她长的并不漂亮,但在你心里她是神。 她个子并不比你高,但你见到她时 总习惯仰视。 你想和她四目相觑,但真的有...
    项楠阅读 165评论 0 0