LeetCode刷题(11)

本文介绍了一种使用正则表达式的巧妙方法来解决计数与说数问题,并提供了一个高效的O(n)时间复杂度算法用于查找数列中第一个缺失的正整数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Count and Say
参考了讨论部分的一个解法,使用正则表达式,很有灵性!

s = '1'
for _ in range(n - 1):
    s = ''.join(str(len(group)) + digit
        for group, digit in re.findall(r'((.)\2*)', s))
return s

首先是正则表达式((.)\2*),外括号里的模式是匹配连续的重复字符串,内括号里的是任意字符,并通过\2引用内括号,通过*贪婪匹配多个连续相同的字符。之后使用re.findall,使用效果如下:
s=’12111212121’
t=re.findall(r’((.)\2*)’, s)
print(t)
[(‘1’, ‘1’), (‘2’, ‘2’), (‘111’, ‘1’), (‘2’, ‘2’), (‘1’, ‘1’), (‘2’, ‘2’), (‘1’, ‘1’), (‘2’, ‘2’), (‘1’, ‘1’)]

First Missing Positive
第一个消失的正整数,有一个数列,从1开始找起,找到第一个不在这个数列中的正整数,要求用O(n)时间,且不能有其他空间开销

    def firstMissingPositive(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums) == 0:
            return 1
        i = 0
        while i < len(nums):
            if nums[i] > 0 and nums[i] != i + 1 and nums[i] <= len(nums) and nums[nums[i] - 1] != nums[i]:
                #nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
                tmp = nums[nums[i] - 1]
                nums[nums[i]-1] = nums[i]
                nums[i] = tmp
            else:
                i += 1
        for i in xrange(len(nums)):
            if nums[i] != i + 1:
                return i + 1
        return len(nums) + 1

#nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]该行被注释掉,加入tmp完成运算,否则会死循环,隐隐感觉这部分跟python内部机制有关,等之后再详细分析。
另外还做了一些测试:
>>> nums=[1,2]
>>> nums
[1, 2]
>>> nums[0],nums[1] = nums[1], nums[0]
>>> nums
[2, 1]
说明跟索引有关,且实际运行中该注释掉的语句完成了运行,并没有在该句死循环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值