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]
说明跟索引有关,且实际运行中该注释掉的语句完成了运行,并没有在该句死循环。