T1.
用一个数组来存储不连续的数,在新数组中找峰谷和峰顶的数量
代码:
class Solution {
public:
int countHillValley(vector<int>& nums) {
int cnt = 0;
vector<int> ans;
for(int i = 0; i < nums.size(); i ++){
int j = i;
while(j < nums.size() && nums[i] == nums[j]) j ++;
ans.push_back(nums[i]);
i = j - 1;
}
for(int i = 1; i < ans.size() - 1; i ++){
if(ans[i] > ans[i + 1] && ans[i] > ans[i - 1]) cnt ++;
if(ans[i] < ans[i - 1] && ans[i] < ans[i + 1]) cnt ++;
}
return cnt;
}
};
T2.
先在字符串中循环一遍统计碰撞次数并将碰撞的位置改为原地不动,统计字符串中的'L'和'R'的个数(不包括下标从0开始的连续的'L'字符和下标从n-1开始的连续的'R'字符),因为碰撞后都会在原地不懂所以不会出现左右碰撞的场景
代码:
class Solution {
public:
int countCollisions(string s) {
int cnt = 0;
for(int i = 0; i < s.size() - 1; i ++){
if(s[i] == 'L') continue;
else if(s[i] == 'S'){
if(s[i + 1] == 'L'){
cnt ++;
s[i + 1] = 'S';
}
}
else{
if(s[i + 1] == 'R') continue;
else if(s[i + 1] == 'S'){
cnt ++;
s[i] = 'S';
}
else{
cnt += 2;
s[i + 1] = s[i] = 'S';
}
}
}
int i = 0, j = s.size() - 1;
while(i < s.size() && s[i] == 'L') i ++;
while(j >= 0 && s[j] == 'R') j --;
for(int k = i; k <= j; k ++)
if(s[k] == 'L' || s[k] == 'R')
cnt ++;
return cnt;
}
};
t3, t4还是有点难。。。。