1.移除元素(27)
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
思路:
双指针,此题跟26题删除排序数组的重复项类似。设定一个慢指针和一个快指针。当不相等的时候,赋值给慢指针且慢指针加1.
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
# cur = 0
# while cur < len(nums):
# if nums[cur] == val:
# nums.pop(cur)
# else:
# cur += 1
# return len(nums)
l = 0 #l作为慢指针,k作为快指针
for k in range(len(nums)):
if nums[k] != val:
nums[l] = nums[k]
l += 1
return l
巩固知识点:双指针可实现就地删除数组的元素。
2.实现strstr() (28)
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。
思路1:内置函数 haystack.find(needle)
思路2:
1.利用for循环遍历0到len(hatstack)-len(needle)+1,这是考虑必须包含全部的needle
2.利用切片操作判断是否含有needle
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
for i in range(0, len(haystack)-len(needle) + 1):
if haystack[i:i+len(needle)] == needle:
return i
return -1
# return haystack.find(needle)
知识点:find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返回-1。str.find(str, beg=0, end=len(string))
3.搜索插入位置(35)
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
思路1:利用数组是排序且不重复的,所以我们可以在for循环中判定大于或等于target的值的索引即为所求的索引。
如果并没有在数组里面,则属于最后一个。
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
for i in range(0, len(nums)):
if nums[i] == target or nums[i] > target:
return i
return i+1
思路2:计算小于或则等于的数组的长度。
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
return len([arg for arg in nums if arg <target])
参考链接:
https://leetcode-cn.com/problems/implement-strstr/solution/ji-bai-999de-pythonfang-fa-by-blaoke/
https://leetcode-cn.com/problems/remove-element/solution/yi-chu-yuan-su-by-leetcode/