找出数组中重复的数字 && 找出字符串中只出现一次的字符

159 阅读2分钟

前言:剑指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

执行结果如下图:

image-20230831145440711.png

问题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 ' '

执行结果如下图:

image-20230831151842654.png

学到的知识:

python中collections模块中的Counter类,它是一个字典的子类,可以统计一个可迭代对象中每个元素出现的次数,并返回一个字典,其中键是元素,值是次数。dic = collections.Counter(s)