力扣刷题记录2020-2-27

一、大小为K且平均值大于等于阈值的子数组数目
在这里插入图片描述

class Solution {
public:
    int numOfSubarrays(vector<int>& arr, int k, int threshold) {
        //k个平均值为threshold。总大小k*threshold
        if(arr.size() < k) return 0;

        int mov = 0;
        int count = 0;

        //造大小为K的窗口
        for(int i =0; i < k; i++) mov += arr[i];
        if(mov >= k * threshold) count ++;

        for(int i = k; i < arr.size(); i++)
        {
            //对阈值进行移动
            mov = mov - arr[i - k] + arr[i];

            if(mov >= k * threshold) count ++;
        }

        return count;
    }
};

总结:看本题,平均数与K值,容易想到总和。所以本题思路就是使用滑动窗口方法进行滑动比较。先构造窗口大小为前K个元素的总和。此时对阈值第一次比较。之后进入循环,每次移动元素导致阈值改变进行比较,找到符合题目的数组个数。

二、统计一个字符串在排序数组中出现的次数
在这里插入图片描述

class Solution {
public:
    int search(vector<int>& nums, int target) {
        //二分法查找
        if(nums.size() <= 0) return 0;
        int mid, left, right;
        int x, y;
        left = 0;
        right = nums.size() - 1;
        while(left < right)
        {
            mid = (left + right) / 2;
            if(nums[mid] >= target) right = mid;
            else left = mid + 1;
        }

        if(nums[left] != target) return 0;

        x = left;
        right = nums.size() - 1;
        while(left < right)
        {
            mid = (left + right) / 2;
            if(nums[mid] <= target) left = mid + 1;
            else right = mid;
        }

        y = left;
        return y - x;

    }
};

总结:本题中利用两次二分法查找,找到数字边界,由于数组是有序的,第一次查找到比目标值大于等于的数字,将右边界移动。未找到则左边界移动。查找结束后如果该数组没有目标元素则返回。
此时未返回左边界已经为目标元素的下标,下面开始查找目标元素的个数。
最后查看左边界所移动的下标个数相减,则既可以得到目标元素出现的个数。

三、判断字符串是否唯一出现
在这里插入图片描述

class Solution {
public:
    bool isUnique(string astr) {
        //判断字符串是否所以字符完全不同
        if(astr.size() <= 1) return true;

        //不借用多的数据结构,使用位运算
        int unique = 0;
        int move;
        for(int i = 0; i < astr.size(); i++)
        {
            //对每个元素asscii转换成数字,然后1右移这么多.接下来进行比较。
            move = 1 << (astr[i] - 'a');
            if(unique & move)
            {
                //当unique与move想与为1.表示有重复的字母
                return false;
            }
            //否则进行下一个元素比较
            else
            {
                //因为都是1右移,所以相当于交换数字
                unique = unique | move;
            }
        }
        
        return true;
    }
};

总结:本题最简单的思路就是利用对照法,就是利用多的数组进行比较,最后如果数组的值有大于2的,则表示不唯一。而这种方法会利用多的空间效率。而新解法就是利用位运算进行解,减少空间的利用。

四、判断字符串是否互为重排
在这里插入图片描述

class Solution {
public:
    bool CheckPermutation(string s1, string s2) {
        //还可以类似于找到字符串第一个重复的元素类似进行两个空间标记
        if(s1.size() != s2.size())  return false;
        vector<char> find1(128,'0');
        vector<char> find2(128, '0');

        for(int i = 0;  i < s1.size(); i++)
        {
            find1[s1[i]]++;
            find2[s2[i]]++;
        }
        if(find1 == find2)
            return true;
        else
            return false;

    }
};

总结:此题解法可以类似与上题的解法,利用两个对照法进行每个目标字符串对比进入到申请的字符数组中,最后比较是否相同。还有另一种解法就是直接利用相加法,比较总和即可。

五、字符串URL化
在这里插入图片描述
总结:此题解法,先找到字符串中的空格数,然后通过反向遍历,进行替换。最后在尾部加上/0即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值