leetcode 242.有效的字母异位词

题目

242.有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

解题思路

1、判断元素是否出现过 --使用哈希法
2、哈希法选择哪种数据结构
哈希值小时选数组list,哈希值大时选集合set,哈希值涉及key、value时选字典dict
本题字符串s和t仅包含小写字母,哈希值最多26个小写字母,哈希法数据结构选数组list
4、怎么用数组list解题
(1) 定义一个长度为26的数组arr存放26个小写字母,a-z对应的数组下标为0-25,每个字符对应的值为0
(2) 遍历字符串s,s中的字符i在arr中出现1次,arr中字符i的值就加1
(3) 遍历字符串t,t中的字符和s中的字符如果一样,每出现1次,arr中字符i的值就-1
(4) 最后遍历arr中每个字符,如果所有字符的值都为0,则s和t互为字母异位词

实现代码

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        arr = [0] * 26  # 定义长度为26的数组,存放26个小写英文字母(a-z,对应的数组下标为0-25)
        for i in s: # 遍历字符串s中的字符
            arr[ord(i) - ord('a')] += 1 # 字符串s中的字符i,在数组arr中每出现1次就+1
        for i in t: # 遍历字符串t中的字符
            arr[ord(i) - ord('a')] -= 1 # 字符串t中的字符i,在数组arr中每出现1次就-1
        for i in range(26):
            '''
            如果字符i在s中出现的次数和在t中出现的次数一样,arr[i] = 0,字符串s和互为异位词
            如果字符i在s中出现的次数>在t中出现的次数,arr[i] > 0,字符串s和t不是异位词
            如果字符i在s中出现的次数<在t中出现的次数,arr[i] < 0,字符串s和t不是异位词           
            '''               
            if arr[i] != 0:
                return False
        return True

test =  Solution()
s = 'aabc'
t = 'car'
print(test.isAnagram(s, t))

leetcode 349.两个数组的交集

题目

349.两个数组的交集
给定两个数组 nums1 和 nums2 ,返回 它们的交集。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

解题思路

set集合中的元素无序不重复,可以进行交集、并集、差集操作
把两个数组转换成set集合,对两个set集合求交集,set交集结果再转换为数组

实现代码

from typing import List
class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        return list(set(nums1) & set(nums2))

nums1 = [1,2,2,1]
nums2 = [2,2]
test = Solution()
print(test.intersection(nums1, nums2))

leetcode 202.快乐数

题目

202.快乐数
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

解题思路

判断一个数是否为快乐数,1是快乐数,非1的都是非快乐数(非快乐数是一个集合)
如果数字n在非快乐数的集合中,返回False --要快速判断一个元素是否出现集合里的时候,就要考虑用哈希法。

1、遍历数字n的每一位:先把数字转换为字符串,再用for循环遍历
2、判断是否为快乐数:对数字n的每一位进行平方再求和,判断和是否为1,和为1则是快乐数,返回True
3、如果不是快乐数:数字n的每一位平方后和不是1,要对和再进行1、2操作

实现代码

class Solution:
    def isHappy(self, n: int) -> bool:
        record = set()
        while n not in record:
            record.add(n)
            s = 0
            for i in str(n):    # 遍历出数字n的每一位
                s += int(i) ** 2    # 对数字n的每一位进行平方后求和
            print(s)
            if s == 1:  # 如果s值为1则为快乐数,返回True
                return True
            else:   # 如果s值不是1,继续进行下一次操作,遍历数字s的每一位,对数字s的每一位进行平方再求和,判断是否为快乐数
                n = s
        return False 
    
n = 19
test = Solution()
print(test.isHappy(n))

leetcode 1.两数之和

题目

1.两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。

解题思路1

暴力法:两层for循环查找数组的值,外循环从下标0开始遍历值,内循环从下标1开始遍历值,两个值和为target,返回下标

实现代码

from typing import List
# 暴力法
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        # 暴力法
        for i in range(0, len(nums)):
            # for j in range(1, len(nums)):   # Case是nums = [2,5,5,11], target = 10,结果返回的是[1, 1],结果错误
            for j in range(i + 1, len(nums)): # i是慢指针,j是快指针,j的值是nums数组中i之外的值
                if nums[j] == target - nums[i]:
                    return [i, j]
test = Solution()
print(test.twoSum(nums, target))

解题思路2

哈希法:
(1)判断target-nums[i]是否在nums中出现 --查找一个元素是否出现过,使用哈希法
(2)哈希法用那种数据结构 --set集合
(3)set集合的作用:存放遍历过的元素

实现代码

from typing import List
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        # 哈希法
        s = set()   # 存放已经遍历过的数组元素
        for key, value in enumerate(nums):  # enumerate函数遍历数组元素的下标和值
            element = target - value
            if element in s:    # 判断element是否在遍历过的数组元素中,如果在则返回下标
                return [nums.index(element), key]
            s.add(value)
test = Solution()
print(test.twoSum(nums, target))
posted on 2024-04-11 08:32  小鹿BAMBI  阅读(2)  评论(0编辑  收藏  举报