提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
代码随想录|数组704. 二分查找,27. 移除元素
python
一、python配置
pycharm安装
pycharm安装2(更新至2024年版本)
pip install+库的名字
二、数组理论基础
数组:连续,从0开始,通过下标索引获取到下标对应的数据 (内存地址、数组、下标)
连续——不能删除,只能覆盖,否则要移动后面所有元素
三、704.二分查找
1.想法
代码如下(示例):
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) # 定义target在左闭右开的区间里,即:[left, right)
while left < right: # 因为left == right的时候,在[left, right)是无效的空间,所以使用 <
middle = left + (right - left) // 2 #//是一个运算符,表示整除,忽略小数部分
if nums[middle] > target:
right = middle # target 在左区间,在[left, middle)中
elif nums[middle] < target:
left = middle + 1 # target 在右区间,在[middle + 1, right)中
else:
return middle # 数组中找到目标值,直接返回下标
return -1 # 未找到目标值
python与cpp的区别:
1、cpp函数要定义类型,但是python直接写def就可以,后面可以加上-> int作为注解,但不是强制输出类型。
2、left, right = 0, len(nums) - 1 元组解包,允许一个等号同时赋值两个
3、python不需要以“ ; ”结尾,不需要()中写条件,不需要 {} 框执行语句,但是需要:后写执行语句
2.输入输出
由于力扣没有输入输出,但是机试时会要求写输入输出,所以要自己在ide上练习
def search(nums, target):
left, right = 0, len(nums) - 1
while left <= right:
middle = left + (right - left) // 2
if nums[middle] > target:
right = middle - 1
elif nums[middle] < target:
left = middle + 1
else:
return middle
return -1
if __name__ == "__main__":
# 它是一种用于检查这个脚本是直接运行,还是被作为模块导入到其他脚本中的方式。
# 我们通常将需要直接执行的代码放到这个条件下,作为程序的入
nums = list(map(int, input().strip().split(','))) # 修改此行代码,接收逗号分隔的数字
target = int(input().strip())
result = search(nums, target)
print(result) # 输出结果
并且注意题目给的输入方式,本题中,数组用“,”隔开,所以split要加“,”。
下面具体说明:
nums = list(map(int, input().strip().split(',')))
假设用户的输入是 “1,2,3,4,5”。那么每一步的具体操作如下:
input().strip().split(',')
这部分首先调用 input() 函数,该函数返回用户输入的字符串,即 “1,2,3,4,5”。
然后调用 strip() 函数,该函数删除字符串首尾的空白字符。在这里,由于字符串首尾没有空白字符,所以 strip() 并不会改变字符串。
最后,调用 split(‘,’) 函数,该函数用逗号将字符串切分成多个部分,返回一个列表,即 [‘1’, ‘2’, ‘3’, ‘4’, ‘5’]。(split将字符串划分为列表)
map(int, ['1', '2', '3', '4', '5'])
这部分首先将 int 函数应用到列表中的每个元素。int 函数将字符串转化为整数。所以,map(int, [‘1’,‘2’,‘3’,‘4’,‘5’]) 返回一个新的迭代器,其中的元素是列表中每个元素执行 int() 函数的结果,即它返回一个包含整数 1, 2, 3, 4 和 5 的迭代器。
list(map(int, ['1', '2', '3', '4', '5']))
最后,list() 函数将迭代器转化为列表。所以,list(map(int, [‘1’,‘2’,‘3’,‘4’,‘5’])) 返回一个整数列表,即 [1, 2, 3, 4, 5]。
最终,nums 变量将存储这个列表,即 nums = [1, 2, 3, 4, 5]。以上就是这行代码的全部工作过程。
*迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,即只能迭代(访问)一次。map的返回值就是一个迭代器。
*字符串的单双引号没有区别
3.存在问题
1、直接用下表标比较,而不是比较元素
2、注意停止条件
4、二刷
二刷思路有,但是很混乱。还是写不出完整的。关键点在于
不知道怎么选取中点。因为直接除以2可能会有小数——寻求取整。//是向下取整
middle = left + (right - left) // 2用这个形式是为了防止直接相加除以2的值太大了
还有怎么终止的,因为取得是夹逼——肯定是左边大于右边就结束啊!
如果输入数据有括号
nums=list(map(int,input().strip().replace("[","").replace("]","").split(",")))
四、27.移除元素
输入输出同上
1、核心代码
思路:用快慢指针解决。
动机:因为数组不能删除,原地的话只能把后面的值移过来。我本来想的是检查到val就把它移到最后,但是这样的话循环索引就不好写了。所以这里用的是从头开始覆盖,因为新的数组长度肯定小于原来的,所以不会覆盖掉原来的数组元素,所以成立。
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
# 快慢指针
fast = 0 # 快指针
slow = 0 # 慢指针
size = len(nums)
while fast < size: # 不加等于是因为,a = size 时,nums[a] 会越界
# slow 用来收集不等于 val 的值,如果 fast 对应值不等于 val,则把它与 slow 替换
if nums[fast] != val:
nums[slow] = nums[fast]
slow += 1
fast += 1
return slow
加上输入输出后
def removeElement(nums, val):
fast=0
slow=0
while fast<len(nums):
if(nums[fast]!=val):
nums[slow]=nums[fast]
slow+=1
fast+=1
return slow
if __name__ == "__main__":
nums = list(map(int,input().strip().split(',')))
val = int(input())
result = removeElement(nums, val)
print(result)
print(nums)
代码没有问题,主要是快慢指针的思想
2024/7/30 二刷,这题很简单,毫无问题
总结
输入输出
快慢指针
左闭右开
map迭代器