力扣天天练--week3-LeetCode75

news2024/10/7 16:19:08

topic75-9-t443:压缩字符串

题目描述:

给你一个字符数组 chars ,请使用下述算法压缩:

从一个空字符串 s 开始。对于 chars 中的每组 连续重复字符 :

如果这一组长度为 1 ,则将字符追加到 s 中。
否则,需要向 s 追加字符,后跟这一组的长度。
压缩后得到的字符串 s 不应该直接返回 ,需要转储到字符数组 chars 中。需要注意的是,如果组长度为 10 或 10 以上,则在 chars 数组中会被拆分为多个字符。

请在 修改完输入数组后 ,返回该数组的新长度。

你必须设计并实现一个只使用常量额外空间的算法来解决此问题。

示例:

 思路:

  1. 定义一个辅助函数 reverse,用于反转字符列表中指定位置之间的字符。
  2. 定义变量 n,表示字符列表的长度。
  3. 定义变量 write 和 left,表示压缩后的字符列表和当前字符的左边界。
  4. 遍历字符列表,用 read 指针指向当前字符。
  5. 如果 read 指针指向字符列表的最后一个元素,或者当前字符与下一个字符不同,执行以下操作:
    • 将当前字符写入压缩后的字符列表。
    • 计算相同字符的数量,即 read - left + 1
    • 如果相同字符的数量大于 1,则将该数字转换为字符串,并写入压缩后的字符列表中。
    • 调用 reverse 函数,将数字字符串反转,使其顺序正确。
    • 将 left 指针移动到下一个字符的位置。
    • 将 write 指针移动到下一个位置,以准备写入下一个字符或数字。
  6. 返回 write,表示压缩后的字符列表的长度。

 

class Solution:
    def compress(self, chars: List[str]) -> int:
        # 定义一个辅助函数 reverse,用于反转字符列表中指定位置之间的字符
        def reverse(left: int, right: int) -> None:
            while left < right:
                chars[left], chars[right] = chars[right], chars[left]
                left += 1
                right -= 1

        n = len(chars)
        write = left = 0 # write 表示压缩后的字符列表中当前位置,left 表示当前字符的左边界
        for read in range(n): # 遍历字符列表,用 read 指针指向当前字符
            if read == n - 1 or chars[read] != chars[read + 1]: # 如果当前字符是最后一个字符或者与下一个字符不同
                chars[write] = chars[read] # 将当前字符写入压缩后的字符列表
                write += 1 # 将 write 指针向右移动一位
                num = read - left + 1 # 计算相同字符的数量
                if num > 1: # 如果相同字符的数量大于 1
                    anchor = write # 将 anchor 指针指向 write 指针当前位置,用于记录数字字符串的起始位置
                    while num > 0: # 将数字转换为字符串,并写入压缩后的字符列表中
                        chars[write] = str(num % 10)
                        write += 1
                        num //= 10
                    reverse(anchor, write - 1) # 将数字字符串反转,使其顺序正确
                left = read + 1 # 将 left 指针移动到下一个字符的位置,用于记录下一段相同的字符的左边界
        return write # 返回 write,表示压缩后的字符列表的长度

topic75-10-t283:移动零

题目描述:

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例:

 思路:

  1. 定义变量 i 和 j,分别表示当前遍历到的元素和当前非零元素的位置。
  2. 遍历列表 nums,使用指针 i 指向当前遍历到的元素。
  3. 如果 i 指向的元素不为 0,将其移到列表的非零元素区域,并将指针 j 向右移动一位,以便下一次将非零元素移到该位置。
  4. 遍历结束后,将列表中剩余的元素全部赋值为 0,以将它们移到列表的末尾。
class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        i = 0 # 定义指针 i,表示当前遍历到的元素
        j = 0 # 定义指针 j,表示当前非零元素的位置
        
        # 遍历列表 nums
        while i < len(nums):
            # 如果当前元素不为 0,将其移到列表的非零元素区域
            if nums[i] != 0:
                nums[j] = nums[i]
                j += 1 # 将指针 j 向右移动一位,以便下一次将非零元素移到该位置
            i += 1 # 将指针 i 向右移动一位,遍历下一个元素
        
        # 将列表中剩余的元素全部赋值为 0,以将它们移到列表的末尾
        while j < len(nums):
            nums[j] = 0
            j += 1
        
        # 算法结束,返回 None

topic75-11-t392:判断子序列

题目描述:

给定字符串 s 和 t ,判断 s 是否为 t 的子序列。

字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。

示例:

 思路:

  1. 定义两个指针 first 和 second,分别指向 t 和 s 的开头。
  2. 计算字符串 t 和 s 的长度 lengtht 和 lengths,如果 s 的长度为 0,则直接返回 True。
  3. 使用 while 循环遍历字符串 t,直到 first 指针到达 t 的末尾。
  4. 如果 s[second] 和 t[first] 相等,则将 first 和 second 指针分别向右移动一位,继续进行比较。
  5. 如果 s[second] 和 t[first] 不相等,则将 first 指针向右移动一位,继续进行比较。
  6. 如果 second 指针到达了 s 的末尾,说明 s 是 t 的子序列,返回 True。
  7. 如果 first 指针到达了 t 的末尾,说明已经遍历完了整个字符串 t,但是没有找到 s,返回 False。

 

class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        first, second = 0, 0 # 初始化双指针
        lengtht, lengths = len(t), len(s)
        if lengths == 0: # 如果 s 的长度为 0,则直接返回 True
            return True
        while first < lengtht: # 使用 while 循环遍历字符串 t
            if s[second] == t[first]: # 如果 s[second] 和 t[first] 相等,则将指针分别向右移动一位,继续进行比较
                first += 1
                second += 1
            elif s[second] != t[first]: # 如果 s[second] 和 t[first] 不相等,则将 first 指针向右移动一位,继续进行比较
                first += 1
            if second == lengths: # 如果 second 指针到达 s 的末尾,说明 s 是 t 的子序列,返回 True
                return True
        return False # 如果 first 指针到达 t 的末尾,说明已经遍历完了整个字符串 t,但是没有找到 s,返回 False

topic75-13-t1679:K和数对的最大数目

题目描述:

给你一个整数数组 nums 和一个整数 k 。

每一步操作中,你需要从数组中选出和为 k 的两个整数,并将它们移出数组。

返回你可以对数组执行的最大操作数。

示例:

 思路1:先对数组排序,然后左右指针逼近,统计其中符合条件的个数,最后返回count。时间复杂度O(nlogn)

class Solution:
    def maxOperations(self, nums: List[int], k: int) -> int:
        # 思路:先排序,再左右指针逼近
        count = 0 # 用来存储结果
        length = len(nums)
        nums.sort() # 对 nums 排序
        left, right = 0, length - 1 # 定义左右指针,分别指向 nums 的开头和结尾
        while left < right: # 使用 while 循环遍历 nums
            if nums[left] + nums[right] == k: # 如果 nums[left] + nums[right] == k,说明找到了一对元素的和等于 k
                count += 1 # 将 count 值加 1
                left += 1 # 将 left 指针向右移动一位
                right -= 1 # 将 right 指针向左移动一位
            elif nums[left] + nums[right] > k: # 如果 nums[left] + nums[right] > k,说明当前两个元素的和太大,将 right 指针向左移动一位
                right -= 1
            else: # 如果 nums[left] + nums[right] < k,说明当前两个元素的和太小,将 left 指针向右移动一位
                left += 1
        return count # 返回 count 的值

思路2:时间复杂度O(n)

  1. 使用 Python 的 Counter 类对列表 nums 进行统计,得到一个字典 tmp,其中键为列表中的元素,值为该元素在列表中出现的次数。
  2. 初始化变量 ans,用于存储结果,将其初始化为 0。
  3. 遍历字典 tmp,对于每个键值对 (num, count),根据其值的大小和键的值与 k 的关系,计算符合条件的数对数量,并将其加入 ans 中。
  4. 算法结束,返回结果。

 

from collections import Counter

class Solution:
    def maxOperations(self, nums: List[int], k: int) -> int:
        tmp = Counter(nums) # 使用 Counter 统计 nums 中每个元素出现的次数
        ans = 0 # 初始化变量 ans,用于存储结果
        for num in tmp: # 遍历 Counter 对象 tmp
            if num * 2 < k: # 如果 num * 2 < k,则说明可以找到与 num 相加等于 k 的数
                ans += min(tmp[num], tmp.get(k-num, 0)) # 将 num 和 k - num 中较小值的出现次数加入 ans 中
            elif num * 2 == k: # 如果 num * 2 == k,则说明 num 和 k - num 相等
                ans += tmp[num] // 2 # 将 num 的出现次数的一半加入 ans 中
            else: # 如果 num * 2 > k,则说明再往后的数都比 k - num 大,不可能找到符合条件的数对
                break
        return ans # 返回结果 ans

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

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

相关文章

Spring Boot中整合MyBatis(基于xml方式基于注解实现方式)

一、前提准备 在Spring Boot中整合MyBatis时&#xff0c;你需要导入JDBC&#xff08;不需要手动添加&#xff09;和Druid的相关依赖。 JDBC依赖&#xff1a;在Spring Boot中整合MyBatis时&#xff0c;并不需要显式地添加JDBC的包依赖。这是因为&#xff0c;当你添加mybatis-sp…

会捷通云视讯 list 目录文件泄露漏洞

劳动永远是医治精神创伤的良药。 漏洞描述 会捷通云视讯某个文件 list参数 存在目录文件泄露漏洞&#xff0c;攻击者通过漏洞可以获取一些敏感信息 漏洞复现 构造payload访问漏洞url&#xff1a; /him/api/rest/V1.0/system/log/list?filePath../漏洞证明&#xff1a; 文…

Mendix 创客访谈录|综合业务展示大屏应用开发

本期创客 刘书智 西门子工业领域专家 我在西门子工厂自动化工程有限公司工作。一直从事SCADA产品的技术支持工作&#xff0c;已经过去17个年头了。赶上数字化发展的浪潮&#xff0c;不断学习各种IT技术&#xff0c;践行 IT与OT融合&#xff0c;希望借助自己的IT知识助力OT的发…

编程实战班--C语言和Python语言实现五子棋游戏的代码

文章目录 下面分别是C语言和Python语言实现五子棋游戏的代码&#xff1a;C语言实现Python语言实现总结 下面分别是C语言和Python语言实现五子棋游戏的代码&#xff1a; C语言实现 在使用C语言实现五子棋游戏时&#xff0c;可以使用SDL2图形库来实现图形界面和图形绘制等功能&…

华为华三思科 交换机基础配置一览

console密码修改 华为 user-interface console 0 authentication-mode password set authentication password cipher XXXXXXXXX华三 line aux 0 authentication-mode password set auth pass simple XXX思科 en configure terminal line console 0 password 123 login忘记…

打开英雄联盟提示d3dcompiler47.dll缺失怎么修复

1.d3dcompiler_47.dll缺失的原因 损坏的文件&#xff1a;d3dcompiler_47.dll文件可能由于某些原因损坏&#xff0c;如病毒感染、意外删除等。 不兼容的操作系统&#xff1a;某些应用程序要求特定版本的d3dcompiler_47.dll文件&#xff0c;如果操作系统不兼容&#xff0c;则可能…

前端实现导出excel表格(单行表头)

需求&#xff1a;实现勾选行导出为表格 一、安装插件 npm install --save file-saver xlsx运行项目报如下警告的话 运行npm install xlsx0.16.0 --save 来降低版本号&#xff08;最初我安装的版本号是0.18.16的版本&#xff09;再次运行项目就不会报如下警告了 二、新建一个ex…

语音分帧简述

目录 1. 分帧 1.1 非整齐分帧 1.2 整齐分帧 2. 示例代码 1. 分帧 问题1&#xff1a;总帧数如何计算&#xff1f; 记符号N为语音总长度&#xff0c;FRAME_LEN为帧长&#xff0c;OVERLAP_LEN为帧与帧之间的重叠部分&#xff0c;STEP_LEN为帧移(步长)。则总帧数N_Frames计算…

kotlin 编写一个简单的天气预报app(二)

增加界面显示openweathermap返回的信息。 在activity_main.xml里增加输入框来输入城市&#xff0c;在输入款旁边增加搜索按钮来进行查询。 然后原来显示helloworld的TextView用来显示结果。 1. 增加输入城市名字的EditText <EditTextandroid:id"id/editTextCity"…

AcrelEMS企业微电网能效管理平台实现用户侧智能配电和智能用电管理-安科瑞黄安南

摘要&#xff1a;随着科技的发展&#xff0c;电力系统正逐步向智能化、数字化、互联网化迈进。智能配电与智能用电是电力产业发展的重要方向&#xff0c;将为传统电力系统带来革命性的变革。本文将对智能配电和智能用电的概念、特点、关键技术及应用进行详细介绍。 1、智能配电…

Rust vs Go:常用语法对比(八)

题目来自 Golang vs. Rust: Which Programming Language To Choose in 2023?[1] 141. Iterate in sequence over two lists Iterate in sequence over the elements of the list items1 then items2. For each iteration print the element. 依次迭代两个列表 依次迭代列表项1…

【linux基础(一)】Linux基本指令(上)

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到开通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; 这里写目录标题 1. 前言1. 创…

[vulnhub]DC2

文章目录 [vulnhub]DC2信息收集flag1flag2cewlwpscan flag3什么是rbash&#xff1f; flag4flag5git提权 总结 [vulnhub]DC2 信息收集 扫ip&#xff0c;有两种方式&#xff1a;arp、nmap nmap -sP 192.168.56.0/24 -T4arp-scan -l192.168.56.137 扫端口&#xff1a; nmap -…

1312. 让字符串成为回文串的最少插入次数;971. 翻转二叉树以匹配先序遍历

1312. 让字符串成为回文串的最少插入次数 核心思想&#xff1a;最后的回文串有两种情况&#xff0c;一种是奇数回文串&#xff0c;一种是偶数回文串&#xff0c;奇数回文串的中心一定是原来就有的&#xff0c;偶数回文串的中心也是原来就有的。假设除去中心的部分为q,p,最后要…

Debian12中为python3配置虚拟环境及在Pycharm中使用虚拟环境

在Debian 12中&#xff0c;python默认为python 3.11。 基于应用&#xff0c;现需设置虚拟环境。 1.安装venv模块 从python3.3开始&#xff0c;配置python虚拟环境&#xff0c;可用venv模块&#xff0c;更加方便了。 执行命令&#xff1a; #apt install python3.11-venv 2.…

原型模式——对象的克隆

1、简介 1.1、概述 可以通过一个原型对象克隆出多个一模一样的对象&#xff0c;该模式被称为原型模式。 在使用原型模式时&#xff0c;需要首先创建一个原型对象&#xff0c;再通过复制这个原型对象来创建更多同类型的对象。 1.2、定义 原型模式&#xff08;Prototype Patt…

ICASSP 2023说话人识别方向论文合集(一)

ICASSP (International Conference on Acoustics, Speech and Signal Processing) 即国际声学、语音与信号处理会议&#xff0c;是IEEE主办的全世界最大、最全面的信号处理及其应用方面的顶级会议&#xff0c;在国际上享有盛誉并具有广泛的学术影响力。 今年入选 ICASSP 2023 …

【LeetCode每日一题】——946.验证栈序列

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 栈 二【题目难度】 中等 三【题目编号】 946.验证栈序列 四【题目描述】 给定 pushed 和 p…

【*1900 图论】CF1328 E

Problem - E - Codeforces 题意&#xff1a; 思路&#xff1a; 注意到题目的性质&#xff1a;满足条件的路径个数是极少的&#xff0c;因为每个点离路径的距离<1 先考虑一条链&#xff0c;那么直接就选最深那个点作为端点即可 为什么&#xff0c;因为我们需要遍历所有点…

ChatGPT伦理挑战:人工智能的权利与责任

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…