LeetCode_Java_2024.2.10(2)

 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. 找出字符串中第一个匹配项的下标

给你两个字符串 haystackneedle ,请你在 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
    }
}

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值