392 判断子序列
解题思路
如果s为t的子序列,那么只要遍历一遍t那么一定可以匹配到s.size()个在t字符串中。
只要循环出来后检验i的值是否为s.size()即可!
代码
class Solution {
public:
bool isSubsequence(string s, string t) {
if(s.size() > t.size()) return false;
int i = 0;int j = 0;
while(j<t.size()){
if(i == s.size())break;
if(s[i] == t[j]){
i++;
}
j++;
}
if(i<s.size())
return false;
else
return true;
}
};
541 反转字符串II
解题思路
主要应用reverse函数进行颠倒。注意s.begin()是从字符串0位置处开始到s.end()字符串尾截止。
reverse(s.begin(),s.end());
代码
class Solution {
public:
string reverseStr(string s, int k) {
/*
1.reverse函数对string仍有用.
*/
int count = 1;int i = 0;
for(;i<s.size();i++){
count %= 2 * k;
if(count == 0){
reverse(s.begin()+i-2*k+1,s.begin()+i-k+1);
}
count ++;
}
count--;
if(count < k){
reverse(s.begin()+i-count,s.end());
}else if(count <2*k){
reverse(s.begin()+i-count,s.begin()+i-count + k);
}
return s;
}
};
面试题16.24.数对和
解题思路
双指针,当nums[low]+nums[high]>target时,nums[low+x]+nums[high]也必定大于target
脑子有点浑了,看了看大佬的。
代码
class Solution {
public:
vector<vector<int>> pairSums(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int low = 0, high = nums.size() - 1;
vector<vector<int>> ans;
while (low < high) {
if (nums[low] + nums[high] > target) high--;
else if (nums[low] + nums[high] < target) low++;
else ans.push_back({nums[low++], nums[high--]});
}
return ans;
}
};
696 计数二进制子串
解题思路
首先,用双指针会好做很多。让i去在大循环中遍历,遇到和下一个字符不同时再调用另一个循环去从当前位的下一位去遍历,直至有发现当前位和下一位不同。然后结束循环。计数后i还要正常去遍历下去.
其次要明白是怎么计数的,当然不是题中告诉的那么浅显。重点:首先我们知道这个是01序列中0和1的分布必须连续,当前面连续出现几个0/1计为num0,后面连续出现几个1/0计为num1,每次count加上的数为num0和num1的最小值。
这样就可以解出来了!!! 每次计算结果后,不要忘记将num0和num1重新赋值啊
代码
class Solution {
public:
int countBinarySubstrings(string s) {
/*
1.子串一定长度为偶数,一半0一半1且要么1打头要么0打头
2.如果数值发生了变化,那么前面有多少0后面就有多少1(反过来也是)
3.
*/
int count = 0;
int num0 = 1;//计算首先出现的值的个数.
int num1 = 1;
for(int i = 0;i<s.size()-1;i++){
if(s[i]!=s[i+1]){
for(int j = i+1;j<s.size()&&s[j] == s[j+1];j++){
num1++;
}
count += min(num0,num1);
num0 = num1 = 1;
}else{
num0++;
}
}
return count;
}
};
729 我的日程安排表I
解题思路
当start<=res[i][0]时,确保end大于res[i][0]即可
当start>res[i][0] && start<res[i][1]时,此时不用限定end。因为start处于某个段的中间,end不论是否大于res[i][1]都重叠
当start>=res[i][0]时,此时不重叠
代码
class MyCalendar {
public:
vector<vector<int>> res;
public:
// 新建bool类型数组,需要循环赋值flase的要不然,里边不一定都是啥!
MyCalendar() {}
bool book(int start, int end) {
//当end大于res中某个start的开始,小于等于那个的end就会返回false;
//或者是start大于等于某个start,并且小于那个的end。
for(int i = 0;i<res.size();i++){
if((start >= res[i][0] && start < res[i][1])||
(start <= res[i][0] && end>res[i][0])){
return false;
}
}
res.push_back({start,end});
return true;
}
};
/**
* Your MyCalendar object will be instantiated and called as such:
* MyCalendar* obj = new MyCalendar();
* bool param_1 = obj->book(start,end);
*/