刷题营第六天

242.有效的字母异位词

巧妙点:定义一个26个元素的数组,0-25对应a-z在字符串1中出现的次数,而后字符串2中出现的字母做减法操作,最终数组每个元素都为0,则返回True。

class Solution:

    def isAnagram(self, s: str, t: str) -> bool:

        record=[0]*26

        for i in s:

            record[ord(i)-ord('a')]+=1(两者的ASCII码相减)数组也是一种哈希

 #并不需要记住字符a的ASCII,只要求出一个相对数值就可以了

        for i in t:

            record[ord(i)-ord('a')]-=1

        for i in range(26):

            if record[i]!=0:

                return False

        return True

349. 两个数组的交集

初始想法:利用集合来存储两个数组,然后找两个集合的交集(集合本身就是去重的)

巧妙点:将数组1放到哈希表集合里,便利数组2,看元素是否在集合里,有就存储到result(unorder set)里面(学会用集合)

2:由于数据小于1000,用数组也行,利用数组下标来做哈希运算

定义空字典 dict={},定义空集合 set()

字典的常用方法需要熟悉

第202题. 快乐数

题解:

题目中说了会 无限循环,那么也就是说求和的过程中,sum会重复出现,这对解题很重要!

正如:关于哈希表,你该了解这些! (opens new window)中所说,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了

一个正整数如何变成各个数值?

1、如19变成1和9,用str(n),在int

          n_str = str(n)
           for i in n_str:
               new_num+=int(i)**2

2、用divmod函数 

n,r=divmod(n,10)

new_sum+=r**2

循环的过程可以定义get_sum函数

1. 两数之和

初步想法:暴力循环,哈希表用于检查元素是否在某个集合中,不知该如何运用?

题解:利用map结构,key用来存元素值,value 放下标,key的查询速度快些

学会用enumerate 函数

排序后可以用双指针方法做

class Solution:

    def twoSum(self, nums: List[int], target: int) -> List[int]:

        nums_sorted=sorted(nums)

        left=0

        right=len(nums_sorted)-1

        while left<right:

            sum=nums_sorted[left]+nums_sorted[right]

            if sum==target:

                return[left,right](错误,返回的是num_sorted数组的下标

            elif sum>target:

                right-=1

            else :

                left+=1

        return[]

class Solution:

    def twoSum(self, nums: List[int], target: int) -> List[int]:

        nums_sorted=sorted(nums)

        left=0

        right=len(nums_sorted)-1

        while left<right:

            sum=nums_sorted[left]+nums_sorted[right]

            if sum==target:

                left_index=nums.index(nums_sorted[left])(学会数组index的用法)

                right_index=nums.index(nums_sorted[right])

                if left_index==right_index:

                    right_index = nums[left_index+1:].index(nums_sorted[right]) + left_index + 1(不加这句话,测试【3,3】6时出错,正确的返回【0,0】错误的返回【0,1】)

解答:从left_index+1向后进行数组切片,然后对切片后的数组寻找nums_sorted[right]的索引,最后加上left_index + 1,因为是从left_index + 1开始切片的

                return[left_index,right_index]

            elif sum>target:

                right-=1

            else :

                left+=1

        return[]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值