算法笔记--哈希表

创建和使用Python字典(哈希表)

在Python中,哈希表通常是通过字典(dict)来实现的。

字典是一种可变容器模型,可以存储任意类型的对象,如字符串、数字、元组等其他容器模型。

字典的每个键值对(key-value pair)用冒号(:)分隔,每个对之间用逗号(,)分隔,整个字典包括在花括号({})中。

字典是Python中实现哈希表的主要方式

# 创建一个空字典  
my_dict = {}  
  
# 创建一个带有一些键值对的字典  
my_dict = {  
    'name': 'John',  
    'age': 30,  
    'city': 'New York'  
}  
  
# 访问字典中的元素  
print(my_dict['name'])  # 输出: John  
  
# 添加一个新的键值对  
my_dict['gender'] = 'Male'  
  
# 更新一个已存在的键值对  
my_dict['age'] = 31  
  
# 删除一个键值对  
del my_dict['city']  
  
# 遍历字典的键值对  
for key, value in my_dict.items():  
    print(f"{key}: {value}")  
  
# 遍历字典的键  
for key in my_dict.keys():  
    print(key)  
  
# 遍历字典的值  
for value in my_dict.values():  
    print(value)

enumerate函数

enumerate 是 Python 中的一个内置函数,它用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,通常用在 for 循环当中。

使用 enumerate 可以同时获得每个元素的索引和值,这在处理需要索引的场景下非常有用。

enumerate(iterable, start=0)
  • iterable:一个序列、迭代器或其他支持迭代的对象。
  • start:下标起始位置,默认为 0。

返回值:

enumerate 返回一个枚举对象,该对象包含每个元素的索引和值。

示例:

seasons = ['Spring', 'Summer', 'Fall', 'Winter']  
  
# 使用 enumerate 获取索引和值  
for index, season in enumerate(seasons):  
    print(f"Index: {index}, Season: {season}")  
  
# 输出  
# Index: 0, Season: Spring  
# Index: 1, Season: Summer  
# Index: 2, Season: Fall  
# Index: 3, Season: Winter

使用场景

  • 在循环中使用元素的索引时。
  • 同时访问数据及其索引时。
  • 在循环中跟踪迭代次数时。

同时使用 enumerate 和哈希表

在遍历列表的来记录每个元素的出现次数:

# 定义一个列表  
nums = [1, 2, 3, 2, 4, 3, 5]  
  
# 初始化一个哈希表来记录每个元素的出现次数  
count_dict = {}  
  
# 使用 enumerate 遍历列表  
for index, num in enumerate(nums):  
    # 如果元素已经在哈希表中,则增加其计数  
    if num in count_dict:  
        count_dict[num] += 1  
    # 否则,将元素添加到哈希表中,并设置计数为 1  
    else:  
        count_dict[num] = 1  
  
# 打印结果  
print(count_dict)

# {1: 1, 2: 2, 3: 2, 4: 1, 5: 1}

力扣题目-两数之和

1. 两数之和 - 力扣(LeetCode)

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        # 初始化了一个空的哈希表(字典),用于存储遍历过的数字及其索引
        hashtable = dict()
        # 使用enumerate函数遍历nums列表,同时获取每个元素的索引i和值num
        for i, num in enumerate(nums):
            if target - num in hashtable:
                # 如果找到了满足条件的两个数,就返回它们的索引。hashtable[target - num]是之前遍历到的与当前数num相加等于target的数的索引,i是当前数的索引。
                return [hashtable[target - num], i]
            # 如果当前遍历的数num与之前的任何数的和都不等于target,就将这个数及其索引添加到哈希表中,以便后续的检查
            hashtable[nums[i]] = i
        # 如果遍历完整个数组都没有找到满足条件的两个数,就返回一个空列表。
        return []

力扣题目-好数对的数目

1512. 好数对的数目 - 力扣(LeetCode)

给你一个整数数组 nums 。

如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。

返回好数对的数目。

class Solution:
    def numIdenticalPairs(self, nums: List[int]) -> int:
       
        m = collections.Counter(nums)
        sum = 0
        for k, v in m.items():
            sum = sum + v*(v-1)//2
        return sum

1. collections.Counter(nums) 是 Python 中的一个非常有用的功能,它位于 collections 模块下。Counter 类用于计数可哈希对象。当你将一个可迭代对象(比如列表、元组、字符串等)传递给 Counter 时,它会返回一个字典的子类,该字典的键是原始可迭代对象中的元素,值是该元素在原始对象中出现的次数。

这个特性在处理数据分析和统计时特别有用,因为它可以快速地告诉我们每个元素出现的频率。
2. 用哈希表统计每个数在序列中出现的次数,假设数字 k 在序列中出现的次数为 v,那么满足题目中所说的 nums[i]=nums[j]=k(i<j) 的 (i,j) 的数量就是 v*(v-1)/2

获取当前时间

import time  # 导入time模块  
  
# 使用time.strftime和time.localtime来获取并格式化当前时间
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) ,' xxxx')

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值