【代码随想录|数组704. 二分查找,27. 移除元素】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


python

一、python配置

pycharm安装
pycharm安装2(更新至2024年版本)
pip install+库的名字

二、数组理论基础

数组:连续,从0开始,通过下标索引获取到下标对应的数据 (内存地址、数组、下标)
连续——不能删除,只能覆盖,否则要移动后面所有元素

三、704.二分查找

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、直接用下表标比较,而不是比较元素

1、直接用下表比较,而不是比较元素

2、注意停止条件

四、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)  

2、问题

代码没有问题,主要是快慢指针的思想

总结

输入输出 快慢指针 左闭右开 map迭代器

  • 30
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值