瓜子笔试
填空题
笔试题
LeetCode41 缺失的第一个正数
思路:解题思路很巧妙。本题的思路是从前往后将数放到它正确的位置上去。
举个例子,假设有序列[4,2,6,1,-3],首先看第一个数4,它正确的位置应该是在序列的第4个位置(位置数从1开始,正确的位置是第一个位置放1,第二个位置放2,第三个位置放3……最后我们只要看哪个位置放的不是理想的数,那么它就是第一个缺失的正数)。我们将4与第4个位置上的“1”进行交换,序列变成[1,2,6,4,-3];接着我们还是看第一个数,现在变成了“1”,它的确在它正确的位置,好了,我们再看第二个数2,也在正确的位置。第三个数6,本来应该放在第6个位置,可是该序列总共就5个位置,所以不移动;第四个数4在它的正确位置,不动;第五个数是负数,不动。最后,从前往后看,发现在第三个位置本该出现的3没有出现,所有该序列缺失的第一个正数是3。
所以归纳来说,将每个数放在它正确的位置,前提是该数是正数,并且该数小于序列长度,并且它正确位置上的那个数不是它,也就是说,把4要放在第4个位置,要保证第4个位置上的数不是4,如果是4的话,交换前后没什么变换,把两个4移来移去,还会造成死循环。
class Solution:
def firstMissingPositive(self, nums: List[int]) -> int:
for i in range(len(nums)):
while nums[i] > 0 and nums[i]<len(nums) and nums[nums[i]-1] != nums[i]:
nums[nums[i]-1], nums[i] = nums[i] ,nums[nums[i]-1]
for i in range(len(nums)):
if nums[i] != i+1:
return i+1
return len(nums)+1
LeetCode 75 颜色分类(荷兰国旗问题)
我们将数组分为四组:红色,白色,非分类和蓝色。最初,我们将所有元素分组为非分类。只要白色指针小于蓝色指针,我们就从头开始迭代。
如果白色指针为红色(nums [white] == 0),我们用红色指针交换并向前移动白色和红色指针。如果指针是白色的(nums [white] == 1),则元素已经在正确的位置,因此我们不必交换,只需向前移动白色指针。如果白色指针为蓝色,我们将交换最新的未分类元素。
class Solution(object):
def sortColors(self, nums):
red, white, blue = 0, 0, len(nums) - 1
while white <= blue:
if nums[white] == 0:
nums[red], nums[white] = nums[white], nums[red]
white += 1
red += 1
elif nums[white] == 1:
white += 1
else:
nums[white], nums[blue] = nums[blue], nums[white]
blue -= 1