提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
寒假决定学习一下python 为了更有效率的学习 决定不纯靠刷网课学习 而是在学习一些基础知识后找一些题来进行训练 在熟练语法的同时也做一些算法训练 下面是一些习题的做题过程和心路历程
一、题干和代码
给你一个字符串 jewels
代表石头中宝石的类型,另有一个字符串 stones
代表你拥有的石头。 stones
中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
字母区分大小写,因此 "a"
和 "A"
是不同类型的石头。
示例 1:
输入:jewels = "aA", stones = "aAAbbbb" 输出:3
示例 2:
输入:jewels = "z", stones = "ZZ" 输出:0
代码部分:
class Solution(object):
def numJewelsInStones(self, jewels, stones):
"""
:type jewels: str
:type stones: str
:rtype: int
"""
count = 0
char1 = 'a'
dict1 = {}
for char1 in jewels:
dict1[char1] = dict1.get(char1,0)+1
for char2 in stones:
count = count + dict1.get(char2,0)
return count
主要思路:
建立一个字典dict1 以jewels中的单个字符为key 并初始化其对应值为1
在建立完成后 遍历在stones中的每个字符,如果该字符在dict1中 count加1 如果不在count不便秘
在昨天学习了字典这种数据容器后 在面对这道题感觉基本没什么难度 从开始写到提交也就改了大概两次 个人感觉字典这种存储方式在面对一些元素集合中关于个体个数计算的问题是非常好用的,在初始化过后可以做各种处理 基本上几行代码就可以解决像本题一样的一些简单问题
二、语法总结
1.关于缩进
python由于很少使用大括号来规定范围,缩进的意义便不只是美观 而是关系着代码能否成功运行 在本次代码的编写过程中 我的修改内容主要就是代码的缩进不当 使得程序无法正常运行
我的最初版本:
class Solution(object):
def numJewelsInStones(self, jewels, stones):
"""
:type jewels: str
:type stones: str
:rtype: int
"""
count = 0
char1 = 'a'
dict1 = {}
for char1 in jewels:
dict1[char1] = dict1.get(char1,0)+1
for char2 in stones:
count = count + dict1.get(char1,0)
return count
可以看到我虽然自己编写的内容都是正确的缩进 但是从第一行开始就不在 numJewelsInStones这个函数的定义范围之内 导致代码执行出错
另外一个问题是
for char2 in stones:
count = count + dict1.get(char1,0)
循环中dict1.get(char1,0)char1该为char2 不过这个属于是手误 便不再赘述
三 、其他方法
在浏览了网上给出的各种解法后 我发现基本上都是基于哈希/字典的解题思路 不过我的代码由于我没有深入的学习这个类 只能用一些基本的函数参与计算 导致效率不高 以下便是在学习的过程中发现的一些新的函数 可供以后的编程使用
首先给出我修改后的代码:
class Solution(object):
def numJewelsInStones(self, jewels, stones):
"""
:type jewels: str
:type stones: str
:rtype: int
"""
jewels = set(jewels)
return sum(v for k,v in collections.Counter(stones).items() if k in jewels )
在这段代码中 使用了下面几个新的函数
1.set()
set()函数的功能是接受一个字符串jewels,并将其转换为一个集合。这个集合中的元素是中的所有唯一字符。例如,如果jewels是“aabbcc”,set(jewels)将会是{“a”,“b”,“c”}
在这道题中可以使用set函数是因为jewels字符串中不会有重复的字符 将字符串转换成字符的集合 方便后面的比对
2.counter()
counter()是python标准模块collection中的一个子类 基于哈希表进行对象计数 在这段代码中的功能就是将stones字符串中每个出现的字符计数 并建立字符和出现次数的映射关系
counter().item是类中的一个方法 在调用之后会返回一个包含每个元素及其计数的键值对的视图。
3.sum()与生成器表达式
sum()函数的功能是计算一个生成器表达式的返回值的总和
生成器表达式是Python中一种类似于列表推导(List Comprehension)的语法结构,但它不是立即执行的,而是返回一个生成器对象。这个生成器对象在迭代时产生项的序列,每次迭代计算出下一个值,而不是一次性计算出并存储整个序列。
其基本语法是:
(expression for item in iterable if condition)
expression
是你希望生成器返回的项。iterable
是一个可迭代的对象。condition
是一个可选的条件语句。
在这段代码中 expression定义为v用于最后的计算k,v是建立的一个映射关系
iterable是collections.Counter(stones).items() 这是stones中出现字符与其出现次数的对应关系
condition是if k in jewels 用于判断stones中字符是否为jewel中元素 如果是则将其对应的v作为其生成式表达式返回值的一个项
以上都是在阅读代码时产生的个人理解 由于是第一次接触相关内容 如果有错误的地方欢迎指出
总结
以上便是对771这道leetcode习题的感悟 以后也会时不时更新我的学习记录 随缘更新