文章目录
1.python普通字符串查找:
找出单词 “welcome” 在 字符串”Hello, welcome to my world.” 中出现的位置,找不到返回-1 从下标0开始索引
# -*- coding: utf-8 -*-
str1= 'Hello, welcome to my world.'
print(str1.find('welcome'))#返回下标 7
print(str1.find('welcome',16))#从下标16开始找,找不到返回-1
print(str1.index('welcome'))#从下标16开始找,找不到报错 7
print(str1.count('o'))#统计出现次数 4
方法:find() 用于在字符串中查找是否存在某个字符串
用法:str1.find (sub_str,start,end)
参数1:sub_str :要在字符串中查找的内容,类型str
参数2:start :开始位置,从哪里开始查找,默认是0
参数3:end :结束的位置,查找到哪里结束,默认是len( )
返回值: 即方法执行的结果是什么,如果找到 sub_str,返回的sub_str在 str1中的位置的正数下标,如果没有找到,返回-1
2. 二分查找:
2.1 letcode704题目:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1
tips:之所以能用二分查找就是因为
1:数组为有序数组;2:数组无重复元素;3:数据量可能相对较大
根据二分法的边界处理方式不同有以下两钟解法:
参考链接:代码随想录_704二分查找
2.2 letcode704 题解1 【left,right】
# -*- coding: utf-8 -*-
# (题解1)左闭右闭区间
class Solution():
#类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self
def search(self,nums:list[int],target:int)->int:#定义二分法方法,传入参数;分号为python3新特性,为形参注释
left,right=0,len(nums)-1 #减一因为下标0开始
#定义 target 是在一个在左闭右闭的区间里
#while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
while left<=right:
middle=(left+right)//2
if nums[middle]<target:
left=middle+1
elif nums[middle]>target:
#if (nums[middle] > target) right 要赋值为 middle - 1,
#因为当前这个nums[middle]一定不是target,那么左区间结束下标位置就是 middle - 1
right=middle-1
else:
return middle
return -1
2.3 letcode704 题解2 【left,right )
# -*- coding: utf-8 -*-
# (题解2)左闭右开区间
class Solution():
def search(self,nums:list[int],target:int)->int:
left,right=0,len(nums)#由于右边不囊括,所以多个0无所谓不用-1
while left<right:
middle=(left+right)//2
if nums[middle]<target:
left=middle+1
elif nums[middle]>target:
right=middle#不用减一,反正不包括由于0而多出来的下标
else:
return middle
return -1
3 数组理论基础:
-
数组是存放在连续内存空间上的相同类型数据的集合。
-
数组可以方便的通过下标索引的方式获取到下标下对应的数据。
正是因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。
例如删除下标为3的元素,需要对下标为3的元素后面的所有元素都要做移动操作,如图所示:
4 移除元素:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。
示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。
你不需要考虑数组中超出新长度后面的元素。
参考链接:代码随想录_27. 移除元素
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
#快慢指针
fast=0 #快指针
slow=0 #慢指针
size=len(nums)#制作一个数组的轮廓大小
while fast<size:#与fast+=1配合构成对于整个数组的遍历
if nums[fast]!=val:#当下标fast指向的数组元素不等于val元素时
nums[slow]=nums[fast]#用快指针覆盖慢指针
slow+=1
fast+=1
#由于fast+1在slow+1外面,所以如果条件不成立,只会执行外面的也就是如果遇到要移除的元素,快指针就会跳过
#待到下一次循环时,由于慢指针的下标索引被快指针覆盖,则慢指针不会遍历快指针里要去除元素的下标,并不会打断自己的顺序
return slow