LeetCode 实践练习26-30

LeetCode—26(删除排序数组中的重复项)

在这里插入图片描述
方法一:这道题与移除有序链表中的重复项题(82与83)很类似,但是更要简单一些,因为毕竟数组的值可以通过下标直接访问,而链表不行。我们使用快慢指针来记录遍历的坐标,最开始时两个指针都指向第一个数字,如果两个指针指的数字相同,则快指针向前走一步,如果不同,则两个指针都向前走一步,然后将cur值赋值给不同值的坐标那。这样当快指针走完整个数组后,慢指针当前的坐标加1就是数组中不同数字的个数。
C++代码:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if(nums.empty()) return 0;
        int pre = 0,cur = 0,n = nums.size();
        while(cur < n){
            if(nums[pre] == nums[cur]) ++cur;
            else nums[++pre] = nums[cur++];
        }
        return pre + 1;
    }
};

LeetCode—27 (移除元素)

在这里插入图片描述
方法:用一个变量用来计数,然后遍历原数组,如果当前的值和给定值不同,那就覆盖计数变量的位置,并将计数变量加1.
C++代码:

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

LeetCode—28(实现strStr())

在这里插入图片描述
方法:遍历即可,但是需要注意特殊情况。具体看代码。

class Solution {
public:
    int strStr(string haystack, string needle) {
        if (needle.empty()) return 0;
        if (haystack.size() < needle.size()) return -1;
        int m = haystack.size(),n = needle.size();
        for (int i = 0; i <= m -n; ++i){//m-n的意思是不需要循环到末尾,到达n的长度停止即可。且一定得<=不然m=n时,将直接返回-1
            int j = 0;
            for (j = 0; j < n; ++j){
                if(haystack[i+j] != needle[j]) break;
            }
            if (j == n) return i;
        }
        return -1;
    }
};

LeetCode—29(两数相乘)

在这里插入图片描述
在这里插入图片描述

C++代码:

class Solution {
public:
    int divide(int dividend, int divisor) {
        if(divisor == 0 || dividend == INT_MIN && divisor == -1) return INT_MAX;
        long long m = abs((long long)dividend),n = abs((long long)divisor),res = 0;
        int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;//^符号为异或符号,相同为假,不同为真。没有同或符号
        if (n == 1) return sign == 1 ? m : -m;
        while(m >= n){
            long long t = n,p = 1;
            while(m >= (t << 1)){
                t <<= 1;
                p <<= 1;
            }
            res += p;
            m -= t;
        }
        return sign == 1? res : -res;
    }
};

LeetCode—30(串联所有单词的子串)

在这里插入图片描述在这里插入图片描述

C++代码:

class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        vector<int> res;
        if(s.empty() || words.empty()) return res;//判断为空则,返回空。
        int n = words.size(),m = words[0].size();
        unordered_map<string,int> m1;
        for (auto &a : words) ++m1[a];
        for (int i=0; i <= (int)s.size() - n*m; ++i){
            unordered_map<string,int> m2;
            int j = 0;
            for (j = 0;j < n;++j){
                string t = s.substr(i+j*m,m);//依次截取m个2m个字符进行判断
                if (m1.find(t) == m1.end()) break;
                ++m2[t];//放入哈希表2
                if (m2[t] > m1[t]) break;//?不太清楚  好像是不可以重复使用
            }
            if (j == n) res.push_back(i);
        }
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值