python 02 List

news2024/11/18 10:29:12

Python 1-14 列表

第一课

1437. 是否所有 1 都至少相隔 k 个元素

class Solution:
    def kLengthApart(self, nums: List[int], k: int) -> bool:
        cnt = k # 处理第一个 1
        for i, x in enumerate(nums):
            if x == 1:
                if cnt < k: return False
                cnt = 0 # 遇到 1 从新记数
            else: cnt += 1
        return True
        
        # left = -(k + 1) # 处理第一个 1
        # for i, x in enumerate(nums):
        #     if x == 1:
        #         if i - left <= k: return False
        #         left = i # 记录 1 的位置
        # return True

997. 找到小镇的法官

有向图中节点的入度和出度的概念。在有向图中,一个节点的入度是指向该节点的边的数量;而一个节点的出度是从该节点出发的边的数量。

class Solution:
    def findJudge(self, n: int, trust: List[List[int]]) -> int:        
        if n == 1: return 1
        d = [0] * (n + 1) # 列表的元素全是 0,共 n + 1 元素。
        for a, b in trust:
            d[b] += 1 # 如果被信任加一
            d[a] -= 1 # 信任别人减一
        for i, x in enumerate(d):
            if x == n - 1: return i
        # if n - 1 in arr: return arr.index(n - 1)
        return -1

26. 删除有序数组中的重复项

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        left = 1
        n = len(nums)
        for i in range(1, n):
            if nums[i] != nums[i - 1]:
                nums[left] = nums[i]
                left += 1
        return left

第二课

★1436. 旅行终点站

知识点: 列表 list,append。

class Solution:
    def destCity(self, paths: List[List[str]]) -> str:
        start, end = [], []
        for s, e in paths:
            start.append(s)
            end.append(e)

        for x in end:
            if x not in start:
                return x

1299. 将每个元素替换为右侧最大元素

知识点: 逆序遍历

class Solution:
    def replaceElements(self, arr: List[int]) -> List[int]:
        n, m = len(arr), -1 # m 记录最大值
        for i in range(n - 1, -1, -1): # 逆序遍历
            m, arr[i] = max(arr[i], m), m # 原地修改,可定义列表。
        return arr

1394. 找出数组中的幸运数

class Solution:
    def findLucky(self, arr: List[int]) -> int:
        q = [0] * 501 # 统计个数
        # q[0] = -1 # 去掉 0
        for x in arr:  # 统计每个数的个数
            q[x] += 1
        # res = -1 # 先假设没有
        # for i, x in enumerate(q[1:], 1):            
        #     if i == x: res = i
        # return res 

        for x in range(len(q) - 1, 0, -1): # 逆序遍历
            if x == q[x]: return x
        return -1

python 内置函数 enumerate()

将一个 可遍历 iterable 数据对象(如 list、tuple 或 str)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
函数返回一个 enumerate 对象,是一个 可迭代对象。具体元素值可通过遍历取出。

语法:

enumerate(sequence, [start=0])

参数:
sequence – 一个序列、迭代器或其他支持迭代对象。是一个可迭代对象。
start – 下标起始位置。是一个可选参数,表示索引从几开始计数。

返回 enumerate(枚举) 对象。

a = [1,2,3,4]
# 从第二个元素开始,下标从 1 开始
for i, x in enumerate(a[1:], 1):
    print(i, x)
# 1 2
# 2 3
# 3 4

**知识点:**推导式,生成器,next。
教程:Python 推导式

class Solution:
    def destCity(self, paths: List[List[str]]) -> str:
        citiesA = {path[0] for path in paths}
        return next(path[1] for path in paths if path[1] not in citiesA)

第三课

1700. 无法吃午餐的学生数量

class Solution:
    def countStudents(self, students: List[int], sandwiches: List[int]) -> int:
        # n = 0
        # while n < len(students):
        #     if students[0] == sandwiches[0]:
        #         students.pop(0)
        #         sandwiches.pop(0)
        #         n = 0
        #     else:
        #         students = students[1:] + [students[0]]
        #         n += 1
        # return n

        cnt = [0, 0]  # 统计喜欢圆形和方形三明治学生数量
        for i in students: cnt[i] += 1
        for i in sandwiches:    # 依次取出栈顶三明治,直到没有学生喜欢 i。
            if cnt[i] == 0: break
            cnt[i] -= 1
        return sum(cnt)

▲1089. 复写零

class Solution:
    def duplicateZeros(self, arr: List[int]) -> None:
        """
        Do not return anything, modify arr in-place instead.
        """
        ## 方法一:insert pop
        # i = 0
        
        # while i < len(arr):
        #     if not arr[i]:
        #         arr.pop()
        #         arr.insert(i, 0)
        #         i += 1

        #     i += 1

        ## 方法二:添加标记       
        n = len(arr)
        i = j = 0
        while j < n:
            if arr[i] == 0: j += 1
            i += 1
            j += 1
        
        i -= 1    # i 回到最后一次合法的位置
        j -= 1    # j 同理,但 j 仍可能等于 n(例如输入 [0])
        while i >= 0:
            if j < n: arr[j] = arr[i]
            if arr[i] == 0:
                j -= 1
                arr[j] = arr[i]
            i -= 1
            j -= 1

904. 水果成篮

算法:双指针

class Solution:
    def totalFruit(self, fruits: List[int]) -> int:
        arr = [0] * len(fruits) # 0 <= 种类 < len(fruits) <= 100000
        left = 0 # 左边界
        k = 0 # 记录区间包含的种类
        for i, x in enumerate(fruits):
            if arr[x] == 0: k += 1 # 遇到一种
            arr[x] += 1 # 计数
            if k > 2:  # 种类 > 2 左边同步收缩 否则右边单边扩张
                y = fruits[left] 
                arr[y] -= 1 
                if arr[y] == 0: k -= 1 
                left += 1
  
        return len(fruits) - left # n - 1 - left + 1

第四课

390. 消除游戏

class Solution:
    def lastRemaining(self, n: int) -> int:
        # 方法一:模拟 转成 list 会超时
        arr = range(1, n + 1) # 可迭代对象,用一个生成一个
        while len(arr) > 1:
            arr = arr[1::2][::-1]
        return arr[0]
        # 方法二
        flag, a, step = True, 1, 1
        while n > 1:           
            if flag or n & 1: a += step           
            flag = not flag
            n >>= 1
            step <<= 1        
        return a
        # 方法三:递归
        return 1 if n == 1 else 2 * (n // 2 + 1 - self.lastRemaining(n // 2))

1652. 拆炸弹

class Solution:
    def decrypt(self, code: List[int], k: int) -> List[int]:
        n = len(code)
        ans = [0] * n
        if k == 0: return ans
        res = []
        code += code
        if k > 0:
            l, r = 1, k
        else:
            l, r = n + k, n - 1
        w = sum(code[l:r+1])
        for i in range(n):
            res.append(w)
            w -= code[l]
            w += code[r + 1]
            l, r = l + 1, r + 1
        return res

2516. 每种字符至少取 K 个

第五课

88. 合并两个有序数组

1768. 交替合并字符串

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        i, j = m - 1, n - 1
        for k in range(m+n-1,-1,-1):
            if j == -1: break # 如果 nums2 移完了结束
            if i == -1 or nums1[i] < nums2[j]:  # 如果 nums1 移完了,接着移 num2
                nums1[k] = nums2[j]
                j -= 1
            else:
                nums1[k] = nums1[i]
                i -= 1

2022. 将一维数组转变成二维数组

class Solution:
    def construct2DArray(self, original: List[int], m: int, n: int) -> List[List[int]]:
        return [original[i:i + n] for i in range(0,  len(original), n)] if len(original) == m * n else []

915. 分割数组

class Solution:
    def partitionDisjoint(self, nums: List[int]) -> int:
        n = len(nums)
        # 三次遍历
        # left, right = [0] * n, [0] * n
        # left[0], right[-1] = nums[0], nums[-1]
        # for i in range(n - 2, -1, -1):
        #     right[i] = min(right[i + 1], nums[i])
        # for i in range(1, n):
        #     left[i] = max(left[i - 1], nums[i])
        # for i in range(n):
        #     if left[i] <= right[i+1]:
        #         return i + 1
        # 二次遍历
        # right = [0] * n
        # max_, right[-1] = 0, nums[-1]
        # for i in range(n - 2, -1, -1):
        #     right[i] = min(right[i + 1], nums[i])
        # for i in range(n - 1):
        #     max_ = max(max_, nums[i])
        #     if max_ <= right[i + 1]:
        #         return i + 1
        # 一次遍历
        pos, max_, left = 1, nums[0], nums[0]
        for i, x in enumerate(nums):
            max_ = max(max_, x)
            if x < left:
                left = max_
                pos = i + 1
        return pos 

练习

807. 保持城市天际线

class Solution:
    def maxIncreaseKeepingSkyline(self, grid: List[List[int]]) -> int:
        row = list(map(max, grid))
        col = list(map(max, zip(*grid)))
        return sum(min(row[i], col[j]) - h for i, r in enumerate(grid) for j, h in enumerate(r))

1716. 计算力扣银行的钱

等差数列的通项公式为:an = a1 + (n - 1) d
前n项和公式为:Sn = na1 + n (n - 1) d / 2 或 Sn = n (a1 + an) / 2

class Solution:
    def totalMoney(self, n: int) -> int:
        # w, d = divmod(n, 7)         
        # res = w * 28 + w * (w - 1) * 7 // 2 # 整周计算
        # res += d * (w + 1) + d * (d - 1) * 1 // 2 

        week, day, res = 0, 1, 0        
        for i in range(n):
            res += week + day
            day += 1
            if day == 8:
                day = 1
                week += 1

        return res

1995. 统计特殊四元组

class Solution:
    def countQuadruplets(self, nums: List[int]) -> int:        
        res = 0
        n = len(nums)
        for i in range(n-3):
            for j in range(i+1,n-2):
                for k in range(j+1,n-1):
                    for l in range(k+1,n):
                        if nums[i]+nums[j]+nums[k] == nums[l]:
                            res += 1
        return res

372. 超级次方

模运算对于乘法与加法满足交换律与结合律

(a ∗ b) % c = (a % c) ∗ (b % c) % c

pow(x, y[, z])
如果z在存在,则再对结果进行取模,其结果等效于 pow(x, y) % z
pow(a, 123) = pow(a, 3) * pow(pow(a, 12), 10) # 123 = 12 * 10 + 3

class Solution:
    def superPow(self, a: int, b: List[int]) -> int:
        return pow(a, b.pop()) * pow(self.superPow(a, b), 10) % 1337  if b else 1

279. 完全平方数

方法一:数学

四平方定理: 任何一个正整数都可以表示成不超过四个整数的平方之和。
推论: if and only if n is not of the form n = 4a ( 8 b + 7 ) for integers a and b.
当且仅当 n ≠ 4 k × ( 8 m + 7 ) n \neq 4^k \times (8m+7) n=4k×(8m+7) 时,n 可以被表示为至多三个正整数的平方和。

class Solution:
    def numSquares(self, n: int) -> int:        
        sqr = int(sqrt(n))
        if n == sqr * sqr: return 1
        # 4 * x**2 = (2*x) ** 2        
        while n % 4 == 0:
            n >>= 2
        if n & 7 == 7: return 4 # n & 7 等价于 n % 8

        i = 0
        while i*i < n:
            j = int(sqrt(n - i*i))
            if i*i + j*j == n:  return 2
            i += 1
            
        return 3

方法二:动态规划

f[i] 表示最少需要多少个数的平方来表示整数 i。
这些数必然落在区间 [ 1 , n ] [1,\sqrt{n}] [1,n ]。枚举这些数,假设当前枚举到 j,那么还需要取若干数的平方,构成 i − j 2 i-j^2 ij2 。此时子问题和原问题一样,规模更小,符合了动态规划的要求。
状态转移方程:

f [ i ] = 1 + min ⁡ j = 1 ⌊ i ⌋ f [ i − j 2 ] f[i]=1+\min_{j=1}^{\lfloor\sqrt{i}\rfloor}{f[i-j^2]} f[i]=1+minj=1i f[ij2]

边界条件 f [ 0 ] = 0 f[0]=0 f[0]=0

因为计算 f [ i ] f[i] f[i] 时所需要用到的状态仅有 f [ i − j 2 ] f[i-j^2] f[ij2],必然小于 i,因此只需要从小到大地枚举 i 来计算 f [ i ] f[i] f[i] 即可。

class Solution:
    def numSquares(self, n):
        if n == int(sqrt(n)) ** 2: return 1
        dp = [inf for i in range(n + 1)] # 4
        dp[0] = 0
        for i in range(n + 1):
            j = 1
            while i + j*j <= n:
                dp[i + j*j] = min(dp[i + j*j], dp[i] + 1)
                j += 1
                
        return dp[n]

2239. 找到最接近 0 的数字

class Solution:
    def findClosestNumber(self, nums: List[int]) -> int:
        ans = inf
        for x in nums:
            if abs(x) == abs(ans): ans = max(x, ans)
            elif abs(x) < abs(ans):  ans = x                
        return ans

2432… 处理用时最长的那个任务的员工

class Solution:
    def hardestWorker(self, n: int, logs: List[List[int]]) -> int:
        ans = pre = most = 0
        for i, t in logs: 
            dif = t - pre
            pre = t
            if most < dif or most == dif and ans > i:
                ans = i
                most = dif

        return ans

1610. 可见点的最大数目

在视角 angle 范围内内最多的点数。
location 为极点,刚好位于 location 的点单独进行统计,计算其它所有点的极角,然后排序。
在极坐标系中,平面上任何一点到极点的连线和极轴的夹角叫做极角。
极坐标和直角坐标的互化:在这里插入图片描述
函数「atan2」的返回值范围为 [−π,π],它的覆盖范围为 2π。将 angle 转换成弧度。
由于存在 d p i + angle > π d_{p_i} + \textit{angle} > π dpi+angle>π 的情况,可以在原数组中将每个元素 d p i + 2 π d_{p_i} + 2π dpi+2π 添加到原数组的后面,这样即可防止反转的问题。

class Solution:
    def visiblePoints(self, points: List[List[int]], angle: int, location: List[int]) -> int:
        same, polar = 0, []
        for p in points:
            if p == location: same += 1
            else:
                polar.append(atan2(location[1] - p[1], location[0] - p[0]))
        
        polar.sort()
        polar += [p + 2 * pi for p in polar]
        arc = angle * pi / 180

        # 二分查找
        # return max((bisect_right(polar, p + arc) - i for i, p in enumerate(polar)), default=0) + same

        # 滑动窗口
        n, maxCount, right = len(polar), 0, 0
        for i in range(n//2):
            while right < n and polar[right] <= polar[i] + arc:
                right += 1
            maxCount = max(maxCount, right - i)

        return maxCount + same

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2176116.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决银河麒麟V10中/data目录执行权限问题

解决银河麒麟V10中/data目录执行权限问题 1、问题描述2、解决方案步骤一&#xff1a;编辑fstab文件步骤二&#xff1a;重启系统步骤三&#xff1a;验证更改 3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在使用银河麒麟桌面操作系…

【零散技术】Odoo PDF 打印问题问题合集

序言:时间是我们最宝贵的财富,珍惜手上的每个时分 Odoo PDF打印 是一个必备功能&#xff0c;但是总会遇到一些奇奇怪怪的问题&#xff0c;此帖仅做记录&#xff0c;方便查阅。 目录 1、样式丢失 2、部分结构丢失 3、没有中文字体 1、样式丢失 这种情况一般是由于 …

YOLOv8 Windows c++推理

#添加一个**yolov8\_。onx **和/或**yolov5\_。Onnx **模型(s)到ultralytics文件夹。 #编辑**main.cpp**来改变**projectBasePath**来匹配你的用户。#请注意&#xff0c;默认情况下&#xff0c;CMake文件将尝试导入CUDA库以与opencv dnn (cuDNN) GPU推理一起使用。 #如果你的Op…

【Power Query】三大容器及元素提取

三大容器 Table; List; Record 表 &#xff08;Table&#xff09;&#xff1a; Table一般是从外部导入的 如果非要手动生成&#xff0c;可以这样&#xff1a; #table({"学号","姓名","平时分"},{{1,"Alice",99},{2,"Beige&quo…

Nacos 是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台,旨在帮助开发者更轻松地构建、部署和管理微服务应用。

Nacos 是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台&#xff0c;旨在帮助开发者更轻松地构建、部署和管理微服务应用。Nacos 提供了一系列的功能来支持服务注册与发现、配置管理、服务元数据管理、流量管理、服务健康检查等&#xff0c;是构建云原生应用和服务网…

【C++】— 类和对象(2)

文章目录 &#x1f49e;1.类的默认成员函数&#x1f49e;2.构造函数&#x1f49e;3.析构函数&#x1f49e;4.拷贝构造函数&#x1f49e;5.赋值运算符重载&#x1f49e;5.1 运算符重载&#x1f49e;5.2 赋值运算符重载 &#x1f49e;6.取地址运算符重载&#x1f49e;6.1const成员…

中国算力大会启幕,联想发布异构智算产业创新成果

9月27日&#xff0c;2024中国算力大会在河南郑州拉开帷幕。作为全球领先的算力基础设施和服务提供商&#xff0c;联想集团参会参展并携手异构智算产业联盟承办2024异构智算产业生态联盟技术论坛。 据「TMT星球」了解&#xff0c;论坛发布了新一代AI服务器、AI应用部署解决方案…

如何用AI完成毕业论文

一、利用 AI 辅助资料收集 AI 可以帮助你快速搜索大量与毕业论文相关的资料&#xff0c;节省时间和精力。 writehelp智能写作辅导&#xff1a;http://www.writehelp.vip/?sid17&#xff0c;限时免费提供开题报告、任务书和答辩PPT。 二、借助 AI 生成提纲 它能根据你的研究主…

【C++】继承,菱形继承,虚拟继承,组合详解

目录 1. 继承概念与定义 1.1 概念 1.2 定义 2. 父类与子类的赋值规则 3. 继承的作用域 4. 子类的默认成员函数 5. 继承与友元 6. 继承与静态成员 7. 菱形继承 7.1 继承关系 7.2 菱形继承的问题 7.3 虚拟继承 8. 继承与组合 1. 继承概念与定义 1.1 概念 1. 继承&a…

基于SpringCloud的微服务架构下安全开发运维准则

为什么要进行安全设计 微服务架构进行安全设计的原因主要包括以下几点&#xff1a; 提高数据保护&#xff1a;微服务架构中&#xff0c;服务间通信频繁&#xff0c;涉及到大量敏感数据的交换。安全设计可以确保数据在传输和存储过程中的安全性&#xff0c;防止数据泄露和篡改。…

物联网迎来下半场,国产 IoTOS 打造企业级智能硬件云服务平台

如有需求&#xff0c;文末联系小编 氦氪云 IoTOS 是一套先进的企业级物联网解决方案平台&#xff0c;为万物互联提供可靠安全稳定的终端接入、协议适配、消息路由、数据存储和分析、应用使能等核心功能。面向物联网领域中的终端设备商、系统集成商、应用服务商、能力提供商等&a…

定积分中静水压力问题

静水压力与定积分 静水压力问题是定积分在物理学中的一个重要应用。它利用积分的思想&#xff0c;将一个复杂的、连续变化的压力分布问题转化为一系列微小压力单元的累加&#xff0c;最终求出总压力。 基本原理&#xff1a; 静水压力是指静止液体对浸在其中的物体表面所施加…

BUG——IMX6ULL编译正点原子Linux内核报错

最初编译的是正点原子改过的Linux内核&#xff0c;可能是版本问题&#xff0c;一直报错&#xff0c;无法成功编译。然后换成NXP官方Linux内核6.6版本&#xff0c;初始编译虽然也报各种错&#xff0c;但都是缺少库或相关工具&#xff0c;全部安装后就可以成功编译出镜像了&#…

【RocketMQ】MQ与RocketMQ介绍

&#x1f3af; 导读&#xff1a;本文介绍了消息队列&#xff08;MQ&#xff09;的基本概念及其在分布式系统中的作用&#xff0c;包括实现异步通信、削峰限流和应用解耦等方面的优势&#xff0c;并对ActiveMQ、RabbitMQ、RocketMQ及Kafka四种MQ产品进行了对比分析&#xff0c;涵…

【Canvas与诗词】秋夕.杜牧(银烛秋光冷画屏......)

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>金六边形外圈绿色底录杜牧秋夕诗</title><style type"…

Unity实战案例全解析:RTS游戏的框选和阵型功能(1) 基础要素

本案例来源于unity唐老狮&#xff0c;有兴趣的小伙伴可以去泰克在线观看该课程 【唐老狮】Unity实现 即时战略游戏 阵型功能 - 泰课在线 -- 志存高远&#xff0c;稳如泰山 - 国内专业的在线学习平台|Unity3d培训|Unity教程|Unity教程 Unreal 虚幻 AR|移动开发|美术CG - Powered…

【CTF Web】Pikachu 反射型xss(get) Writeup(反射型XSS+GET请求)

XSS&#xff08;跨站脚本&#xff09;概述 Cross-Site Scripting 简称为“CSS”&#xff0c;为避免与前端叠成样式表的缩写"CSS"冲突&#xff0c;故又称XSS。一般XSS可以分为如下几种常见类型&#xff1a; 1.反射性XSS; 2.存储型XSS; 3.DOM型XSS; XSS漏洞一直被评估…

Java基于easyExcel的自定义表格格式

这里用的到easyExcel版本为3.3.4 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.4</version></dependency> 效果 代码部分 package com.tianyu.test;import com.alibaba.exc…

全网最适合入门的面向对象编程教程:54 Python字符串与序列化-字符串格式化与format方法

全网最适合入门的面向对象编程教程&#xff1a;54 Python 字符串与序列化-字符串格式化与 format 方法 摘要&#xff1a; 在 Python 中&#xff0c;字符串格式化是将变量插入到字符串中的一种方式&#xff0c;Python 提供了多种字符串格式化的方法&#xff0c;包括旧式的 % 格…