26. 删除有序数组中的重复项
给你一个 非严格递增排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
考虑 nums
的唯一元素的数量为 k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。 - 返回
k
。
class Solution {
public int removeDuplicates(int[] nums) {
//双指针解法
int first = 0, end = 1;
while(end < nums.length){ //当第二个下标小于nums的长度时,继续执行
if(nums[first] == nums[end]) //第一轮:当第一个数等于第二个数,则第二个指针的下标增加【进行移除操作】
end++;
else
nums[++first] = nums[end]; //nums[first]的值为nums[0]的值,当first下标的值与end下标的值不相等,才对nums数组重新进行添加数值操作,且下标开始值为++first(即1)
}
return first+1;
}
}
27. 移除元素
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
class Solution {
public int removeElement(int[] nums, int val) {
int count = 0; //将数组nums从0开始重新赋值
for(int n : nums){ //遍历数组将每个值都赋给n
if(n != val) //若n不等于val值
nums[count++] = n; //则将n赋给数组nums,下标从count(即0)开始
}
return count;
}
}
28. 找出字符串中第一个匹配项的下标
给你两个字符串 haystack
和 needle
,请你在 haystack
字符串中找出 needle
字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle
不是 haystack
的一部分,则返回 -1
。
示例 1:
输入:haystack = "sadbutsad", needle = "sad" 输出:0 解释:"sad" 在下标 0 和 6 处匹配。 第一个匹配项的下标是 0 ,所以返回 0 。
示例 2:
输入:haystack = "leetcode", needle = "leeto" 输出:-1 解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。
class Solution {
public int strStr(String haystack, String needle) {
int h = haystack.length(), n = needle.length();
//hay与need字符数组分别存储haystack、needle拆分出来的字母
char[] hay = haystack.toCharArray(), need = needle.toCharArray();
for(int i = 0; i<= h - n; i++){ //h-n代表needle在haystack字符串中的最后几个
//a代表haystack的发起点,b代表needle的首位
int a = i,b = 0;
while(b < n && hay[a] == need[b]){ //当b的值下雨匹配串的长度且字符数组相等时,执行下面语句
//a++,b++继续匹配两者
a++;
b++;
}
//当跳出while语句时,有两种情况:1.完全匹配 2.中断匹配
//对于情况1,则返回haystack的发起点(即i)【注意:不是a的值,因为a的值已经a++了,不是发起点的值】
//对于情况2,则继续执行for循环i++
if(b==n) //如果b的值等于needle的长度,则是完全匹配
return i;
}
return -1; //当for循环执行完毕之后,还未找到匹配项,则返回-1
}
}