LeetCode[26/27/28]删除有序数组中的重复项、移除元素、实现 strStr()C/C++——第三天

删除有序数组中的重复项

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

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

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

思路:[数组移动]

对于数组元素原地删除,更多的是将后面的元素覆盖前面的元素,通过移动元素达到删除原元素的效果。本题中,原数组是已经进行了升序排序了的,我们从第一元素开始遍历,可以通过if元素之间的关系,作为第一个元素,肯定不是重复项,同时保存前k个元素为1,之后所有元素都要与前一个元素进行比较,看是否相同,如果相同,就不管,如果不相同,就要将这个元素赋值给第二个元素,即前k给位置为2,以此类推,直到遍历完全部元素。

C++

class Solution {
    
    
public:
    int removeDuplicates(vector<int>& nums) {
    
    
       int k = 0 ;
       for(int i = 0 ; i < nums.size() ; i++){
    
    
           if( i == 0 || nums[ i ] != nums[ i - 1 ])
           nums[k++] = nums[i] ;
       }
       return k ;
    }
}; 

其实本题还可以用链表的方式来解决,但是本人觉得没必要哈哈哈哈。算法上来说是个更好,但是我还是觉得怎么简单怎么来。

移除元素

题目描述[简单]:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

示例1:
输入: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。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

思路:[数组移动]

本体思路与上一题一模一样,当该元素不等于val的值时,记录k值。

C++

class Solution {
    
    
public:
    int removeElement(vector<int>& nums, int val) {
    
    
        int k = 0 ;
        for(int i = 0 ; i < nums.size(); i++){
    
    
                if(nums[i]  != val)
                nums[k++]=nums[i];         
        }
        return k;
    }
};

其实本题可以用链表,但是我觉得没必要哈哈哈哈。
本题算法分析

芜湖!第一次100%!!!记录一下哈哈哈哈

实现 strStr()

题目描述[简单]:
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。

示例 1:

输入:haystack = “hello”, needle = “ll”
输出:2

思路(暴力):

让字符串 needle 与字符串haystack的所有长度为 m 的子串均匹配一次。为了减少不必要的匹配,我们每次匹配失败后立即停止当前子串匹配,转对下一个子串继续匹配。若当前子串匹配成功,我们就返回当前子串的开始位置。若所有子串都匹配失败,则返回 -1。

C++

class Solution {
    
    
public:
    int strStr(string haystack, string needle) {
    
    
        int n = haystack.size(), m = needle.size();
        for(int i = 0; i <= n - m; i++){
    
    
            int j = i, k = 0; 
            while(k < m && haystack[j] == needle[k]){
    
    
                j++;
                k++;
            }
            if(k == m) return i;
        }
        return -1;

    }
};

当 needle 是空字符串时,我们应当返回 0 。
strStr()与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。

这件事情告诉我们好好学习内置库,不然自己写了一堆还没有一个引用来的标准。本体也可以用KMP,但是我觉得小题大做哈哈哈
算法分析

虽然KMP可以,但是传统也还是香的。

猜你喜欢

转载自blog.csdn.net/Lailalalala/article/details/126024377