python做题日记(12)
第二十七题
LeetCode第27题要求原地移除数组中所有等于给定值val
的元素,并返回移除后数组的新长度。不能使用额外的数组空间,必须在原数组上修改,且元素的顺序可以改变。对于这道题的解法在之前的题目中也使用过,可以使用双指针法(快慢指针),快指针遍历数组,慢指针标记新数组的下一个位置。当快指针指向的元素不等于val
时,将该元素复制到慢指针的位置,并移动慢指针。
class Solution:def removeElement(self, nums: list[int], val: int) -> int:slow = 0for fast in range(len(nums)):if nums[fast] != val:nums[slow] = nums[fast]slow += 1return slow
第二十八题
LeetCode第28题要求实现一个函数,在haystack字符串中找出needle字符串第一次出现的位置。如果needle为空字符串,返回0;如果不存在,返回-1。这与字符串内置的find()
方法功能类似。首先处理特殊情况即当needle为空字符串时,题目要求返回0。这与Python的字符串处理逻辑一致,例如"abc".find("")
也会返回0。通过遍历haystack的每个可能位置,截取与needle长度相同的子串进行比较。窗口滑动范围是0
到len(haystack)-len(needle)
,确保不会越界。这题如果直接采用字符串的find处理方法也是可以查找到字串在字符串中首次出现的位置。
class Solution:def strStr(self, haystack: str, needle: str) -> int:# 特殊情况:needle为空字符串,返回0if not needle:return 0# 遍历 haystack,查找 needlefor i in range(len(haystack) - len(needle) + 1):if haystack[i:i+len(needle)] == needle:return ireturn -1