【用python解LeetCode 热题100】【哈希】2、字母异位词分组

一、题目描述:

在这里插入图片描述

解法1:

思路:
1、先考虑正常情况(如示例1)
2、创建哈希表hash_table(空字典)
3、从头开始遍历,对遍历到的字符串s使用sorted()函数排序(注意此时输出为列表后续不好做字典key值,需要再用"".join(sorted_list)方法重新变成字符串sorted_str)
4、如果排序后的字符串sorted_str不在字典key中,将sorted_str作为key存放到hash_table中,并赋值[“s”];如果排序后的字符串sorted_str在字典key中,使用append()函数添加到对应key值的value列表里
5、最后以列表形式输出字典里所有的value值

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        hash_table = {}
        for s in strs:
            key = "".join(sorted(s))
            if key not in hash_table:
                hash_table[key] = [s]
            else:
                hash_table[key].append(s)
        return [value for value in hash_table.values()] # 或者list(hash_table.values())

二、补充知识点:

1、sorted和sort函数区别:

  1. 核心区别
    标题
    sorted() 函数是 Python 中用于排序的内置函数,其默认排序规则如下:
    升序排列:默认从小到大排序(数字按数值大小,字符串按字典序)。
    基于元素类型:
    1、数字:按数值大小排序(1 < 2 < 3)。
    2、字符串:按字符的 Unicode 码点(code point)逐个比较。
    3、大写字母(A-Z)的码点小于小写字母(a-z),例如 “Apple” 会排在 “banana” 前。
    4、数字字符(0-9)的码点小于字母,例如 “100” 会排在 “apple” 前。
    5、特殊符号(如 !, @, #)按 Unicode 码点排序。
  2. 参数对比
    两者均支持以下参数:
    key:指定排序规则(如 key=len 按长度排序)
    reverse:是否降序(reverse=True 时降序)
    示例代码
# 对列表原地排序(sort)
nums = [3, 1, 4, 2]
nums.sort()
print(nums)  # 输出 [1, 2, 3, 4]

# 生成新列表(sorted)
words = ("apple", "banana", "cherry")
sorted_words = sorted(words, key=lambda x: x[-1])  # 按最后一个字符排序
print(sorted_words)  # 输出 ['banana', 'apple', 'cherry']
  1. 使用场景
# 场景 1:需要保留原对象
# 用 sorted():
original = [5, 2, 9, 1]
new_list = sorted(original)  # 原列表不变
print(original)  # [5, 2, 9, 1]
print(new_list)  # [1, 2, 5, 9]

# 场景 2:直接修改原列表
# 用 sort():
lst = [5, 2, 9, 1]
lst.sort()  # 直接修改原列表
print(lst)  # [1, 2, 5, 9]

# 场景 3:排序非列表对象
# 用 sorted():
# 对字符串排序
s = "python"
print(sorted(s))  # ['h', 'n', 'o', 'p', 't', 'y']
# 对字典的键排序
d = {"b": 2, "a": 1, "c": 3}
print(sorted(d))  # ['a', 'b', 'c']
  1. 性能对比
    时间复杂度:两者均使用 Timsort 算法,平均和最坏时间复杂度为 O(n log n)。
    空间复杂度:
    sort() 是原地排序,空间复杂度 O(1)。
    sorted() 需要生成新列表,空间复杂度 O(n)。
    适用场景:
    若需节省内存且允许修改原列表 → 用 sort()。
    若需保留原对象或排序非列表 → 用 sorted()。
  2. 常见误区
# 错误 1:对 sort() 的返回值赋值
lst = [3, 1, 2]
result = lst.sort()  # sort() 返回 None
print(result)  # None(正确用法是直接使用原列表)

# 错误 2:尝试对元组使用 sort()
t = (3, 1, 2)
t.sort()  # 报错!元组没有 sort() 方法
  1. 高级用法
# 按自定义规则排序
# 1、按字符串长度排序(从短到长)
words = ["apple", "kiwi", "banana"]
words.sort(key=len)
print(words)  # ['kiwi', 'apple', 'banana']

# 2、按字典的值排序
data = [{"name": "Alice", "age": 25}, {"name": "Bob", "age": 20}]
sorted_data = sorted(data, key=lambda x: x["age"])
print(sorted_data)  # [{'name': 'Bob', 'age': 20}, {'name': 'Alice', 'age': 25}]

总结
在这里插入图片描述

2、values()函数

在 Python 中,values() 是字典(dict)的一个内置方法,它的作用是返回字典中所有值(value)的集合。以下是详细解释:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值