2数组-双指针-移除元素/删除有序数组中的重复项/有序数组的平方/比较含退格的字符串

本文主要是介绍2数组-双指针-移除元素/删除有序数组中的重复项/有序数组的平方/比较含退格的字符串,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

27. 移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
int len = removeElement(nums, val);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}

示例 1:

输入:nums = [3,2,2,3], val = 3 输出:2, nums = [2,2] 解释:函数应该返回新的长度 2, 并且nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。
例如,函数返回的新长度为 2 ,而 nums =[2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
示例 2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0,
4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-element
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution:def removeElement(self, nums: List[int], val: int) -> int:# 前部分是有效数组值不为val# idx是新数组的下标 如果nums[i] 不与val 相同,则将nums[i]移到nums[idx]处 idx++ 往前移动变成有效部分# 返回的idx 就是最后的新数组长度# nusm[idx]像一个新数组idx=0for x in nums:if(x!=val):nums[idx] = xidx +=1return idx
func removeElement(nums []int, val int) int {idx := 0for i := 0;i <len(nums);i++{// 不为val 就是有效元素 放入”新“数组if nums[i] != val{nums[idx] = nums[i]idx += 1}}return idx}

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

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。

由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。

将最终结果插入 nums 的前 k 个位置后返回 k 。

不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

判题标准:

系统会用下面的代码来测试你的题解:

int[] nums = […]; // 输入数组
int[] expectedNums = […]; // 长度正确的期望答案

int k = removeDuplicates(nums); // 调用

assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
assert nums[i] == expectedNums[i];
}
如果所有断言都通过,那么您的题解将被 通过。

示例 1:

输入:nums = [1,1,2] 输出:2, nums = [1,2,_] 解释:函数应该返回新的长度 2 ,并且原数组 nums
的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
示例 2:

输入:nums = [0,0,1,1,1,2,2,3,3,4] 输出:5, nums = [0,1,2,3,4] 解释:函数应该返回新的长度5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

class Solution:def removeDuplicates(self, nums: List[int]) -> int:idx=0# nums[idx]相当于新数组 如果x==nums[idx]跳过# idx最后指向nums的最后一个数 所以长度要idx+1for x in nums:if x==nums[idx]:continue# 默认idx=0的值先保存 # 直到x与nums[i]不同时 放入nums[idx]else:idx+=1nums[idx]=xreturn idx+1
class Solution:def removeDuplicates(self, nums: List[int]) -> int:idx = 0for x in nums:# 相当于是把不重复的值放到一个”新“数组 遍历旧数组 如果和新数组的值重复就跳过# 默认"新"数组放了第0个数if nums[idx]!=x:idx += 1nums[idx] = xelse:continue# 如果nums没有重复数据,最后idx指向nums的最后一个元素 所以长度=idx+1return idx + 1
func removeDuplicates(nums []int) int {idx := 0 for i:=0;i<len(nums);i++{if nums[i] != nums[idx]{idx += 1nums[idx] = nums[i]}else{continue}}return idx + 1
}

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

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}

示例 1:

输入:nums = [1,1,1,2,2,3] 输出:5, nums = [1,1,2,2,3] 解释:函数应返回新长度 length =
5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。 不需要考虑数组中超出新长度后面的元素。
示例 2:

输入:nums = [0,0,1,1,1,1,2,3,3] 输出:7, nums = [0,0,1,1,2,3,3] 解释:函数应返回新长度
length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。 不需要考虑数组中超出新长度后面的元素。

思路:
对于后面的任意数字(x),能够保留的前提是:与当前写入的位置前面的第 k 个元素(idx - k)进行比较,不相同则保留,相同不保留(比如是1,1,1, K=2, idx=2时,nums[idx-k]=nums[0]=第一个1, x为第三个1,此时x和nums[idx-k]的值一样,所以不保留,下标差为k的两个元素不相同)

在这里插入图片描述

class Solution:def removeDuplicates(self, nums: List[int]) -> int:def removek(nums,k):idx=0for x in nums:# 前k个数直接放在数组中 # 看看此时idx处的前k和x 是不是一样 一样的话说明已经满了 不一样才放入x# 下标差为k的两个元素不相同,idx是要放入新的元素的位置,所以idx和idx-k位置的值不能一样if(idx<k or nums[idx-k]!=x):nums[idx]=xidx+=1return idxreturn removek(nums,2)

283. 移动零

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

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

示例 1:

输入: nums = [0,1,0,3,12] 输出: [1,3,12,0,0]
示例 2:

输入: nums = [0] 输出: [0]

class Solution:def moveZeroes(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""# 把非0元素往前移动,相当于是有效数组,剩下的部分再用0填充idx =0for x in nums:if(x!=0):nums[idx]=xidx +=1while idx<len(nums):nums[idx]=0idx+=1
func moveZeroes(nums []int)  {idx := 0for i:=0;i<len(nums);i++{if nums[i] != 0{nums[idx] = nums[i]idx += 1}}for ; idx < len(nums);idx++{nums[idx] = 0}}

977. 有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

示例 1:

输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
示例 2:

输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]

class Solution:def sortedSquares(self, nums: List[int]) -> List[int]:result=[]left=0right=len(nums)-1# 因为平方值最大一定就产生在最左边或最右边 所以每次将最大值添加子啊result的头部 类似快排while(left<=right):if(nums[left]*nums[left]>nums[right]*nums[right]):result.append(nums[left]*nums[left])left+=1else:result.append(nums[right]*nums[right])right-=1result.reverse()return result
func sortedSquares(nums []int) []int {l:=0r:=len(nums) - 1pos:= len(nums) - 1ans := make([]int,len(nums))for ;pos >=0;pos--{if nums[l]*nums[l] > nums[r]*nums[r]{ans[pos] = nums[l] * nums[l]l++}else{ans[pos] = nums[r] * nums[r]r--}}return ans
}

844. 比较含退格的字符串

给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。

注意:如果对空文本输入退格字符,文本继续为空。

示例 1:

输入:s = “ab#c”, t = “ad#c” 输出:true 解释:s 和 t 都会变成 “ac”。
示例 2:

输入:s = “ab##”, t = “c#d#” 输出:true 解释:s 和 t 都会变成 “”。
示例 3:

输入:s = “a#c”, t = “b” 输出:false 解释:s 会变成 “c”,但 t 仍然是 “b”。

class Solution:def backspaceCompare(self, s: str, t: str) -> bool:def finalstring(ss):res=list()for x in ss:if x!='#':res.append(x)# 如果是#  且res不空 telif res:res.pop()return ''.join(res)return finalstring(t)==finalstring(s)

func finalstring(s string)string {res:= []byte{}for i:= range s{if s[i]!='#'{res = append(res,s[i])}else if len(res)!=0 {res = res[:len(res)-1]}}return string(res)
}
func backspaceCompare(s string, t string) bool {return finalstring(s) == finalstring(t)
}

法二:模拟退格
https://leetcode.cn/problems/backspace-string-compare/solution/shuang-zhi-zhen-bi-jiao-han-tui-ge-de-zi-8fn8/

假设有两个数组,遍历所有旧数组的所有字符,把不是#的字母放入新数组,如果是#新数组的idx回退一个

class Solution(object):def backspaceCompare(self, s, t):""":type s: str:type t: str:rtype: bool"""def finastr(str):fast = 0slow = 0s = list(str)for fast in range(len(s)):#不是“#”放到新数组,新数组的idx往后移动if s[fast] !='#':s[slow] = s[fast]slow += 1# 当slow不是0的时候才可以回退elif slow >0:slow -=1print(s)print(s[:slow])return s[:slow]return finastr(s) == finastr(t)            

这篇关于2数组-双指针-移除元素/删除有序数组中的重复项/有序数组的平方/比较含退格的字符串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/697795

相关文章

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元

golang float和科学计数法转字符串的实现方式

《golangfloat和科学计数法转字符串的实现方式》:本文主要介绍golangfloat和科学计数法转字符串的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望... 目录golang float和科学计数法转字符串需要对float转字符串做处理总结golang float