一、大小为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即可