type
status
password
date
slug
summary
category
URL
tags
icon
26. 删除有序数组中的重复项 - 力扣(LeetCode)
给你一个有序数组
nums
,请你 原地 删除重复出现的元素,使每个元素最多出现一次 ,返回删除后数组的新长度。80. 删除有序数组中的重复项 II - 力扣(LeetCode)
给你一个有序数组
nums
,请你 原地 删除重复出现的元素,使每个元素最多出现两次 ,返回删除后数组的新长度。283. 移动零 - 力扣(LeetCode)
给定一个数组
nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。注意到以下性质:
- 左指针左边均为非零数;
- 右指针左边直到左指针处均为零。
因此每次交换,都是将左指针的零与右指针的非零数交换,且非零数的相对顺序并未改变。
解法一
解法二
344. 反转字符串 - 力扣(LeetCode)
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组
s
的形式给出。557. 反转字符串中的单词 III - 力扣(LeetCode)
给定一个字符串
s
,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。1.旋转数组(189 - 中)
题目描述:
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。进阶:
- 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
- 你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?
示例 :
模拟循环:
用一个变量tmp维护移动k次,注意移动数组时倒序进行填充,防止覆盖,时间复杂度O(kn),但是超时。空间复杂度O(1)
java
python
使用额外数组:
遍历原数组,将原数组下标为 i 的元素放至新数组下标为 (i+k)%n 的位置,最后将新数组拷贝至原数组即可。空间复杂度O(N)
java
python3
数组翻转(想不到,所以记住):
操作结果 | 原始数组 |
原始数组 | 1 2 3 4 5 6 7 |
翻转所有元素 | 7 6 5 4 3 2 1 |
翻转 [0,k mod n−1] 区间的元素 | 5 6 7 4 3 2 1 |
翻转 [k mod n,n−1] 区间的元素 | 5 6 7 1 2 3 4 |
- 比较巧妙,先整体翻转,在将0 ~ k - 1和k - 1 ~ n - 1进行翻转。空间复杂度O(1)
代码实现: