前言:剑指offer刷题系列
问题1:
找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
思路:
一个非常简单的思路就是,新声明一个数组,逐个判断数组中的元素,如果不在新数组内,就将元素添加到新数组中,如果在数组中,就说明数组重复了。因为这个题只需要找出数组中任意一个重复的数字,也没有规定空间复杂度,就可以这样解决。
基于上述思考,代码如下:
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
res = []
for i in nums:
if i not in res:
res.append(i)
else:
return i
执行结果如下图:
问题2:
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
示例:
示例1:
输入:s = "abaccdeff"
输出:'b'
示例2:
输入:s = ""
输出:' '
思路:
python有字典类型,字典类型中有collection模块的Counter类,可以直接获得一个可迭代对象中每个元素出现的次数。通过调用collections.Counter(s),可以得到一个字典dic,其中存储了字符串s中每个字符出现的次数。然后,通过遍历字符串s中的每个字符i,判断dic[i]是否等于1,如果等于1,说明这个字符是第一个只出现一次的字符,就返回它。如果遍历完字符串s后,没有找到任何一个字符满足dic[i]等于1,说明没有只出现一次的字符,就返回一个单空格。
时间复杂度:O(1)
空间复杂度:O(n)
基于上述思考,代码如下:
class Solution:
def firstUniqChar(self, s: str) -> str:
dic = collections.Counter(s)
for i in s:
if dic[i] == 1:
return i
return ' '
执行结果如下图:
学到的知识:
python中collections模块中的Counter类,它是一个字典的子类,可以统计一个可迭代对象中每个元素出现的次数,并返回一个字典,其中键是元素,值是次数。dic = collections.Counter(s)