第一题
给出一个字符串s(仅包含小写英文字母和括号),请你按照从内层到外层的顺序,逐层反转每对匹配括号内包含的字符串,并返回最终的结果。
输入描述:输入为一行带有括号的字符串(只包含英文小写字母和左右小括号,且左右括号是成对的)。
输出描述:反转括号内字符串并输出(只有英文小写字母)。
(u(love)i) 经过内层括号翻转变成(uevoli),再经过翻转得到iloveu。
思路:
1.括号与括号之间为一段
2.遇到左括号,当前这一段存入stack
3.遇到右括号,当前这一段翻转,可以与前一段拼接了。
4.一直进行。即可得到结果。
复盘,知道为什么做错了,是因为stk要用stack结构。代码中的reverse我也用到了。要用stack的top(),而不是用vector的pop_back()。
class Solution
{
public:
string reverseParentheses(string s)
{
stack<string> stk;
string word = "";
for (char c: s)
{
if (c == '(') //遇到左括号 就是一个新的台阶了
{
stk.push(word); //当前的这一段作为一个整体,存进stack
word = ""; //重新计新的一段
}
else if (c == ')') //当前这一段 要翻转 与前面的一段接起来
{
reverse(word.begin(), word.end());
word = stk.top() + word;
stk.pop(); //前面这一段不要了
}
else
word += c; //统计进当前这一段
}
return word;
}
};
第二题
建立云端数据库,汽车将自身的运行信息上报到云端,汽车自身每隔0.5s生成一次速度数据。
- 周期上报:每30s上报一次,启动后的第一个速度开始计算,第一帧需要上报。
- AEB(自动紧急制动)上报:当汽车速度比上一次生成的速度减少了9及以上时,认为触发AEB流程,如果连续2s均保持AEB状态,触发AEB上报,上报内容有:
(1)本次AEB过程中的所有速度数据,触发AEB前2s的数据和AEB结束后2s的数据。
(2)该范围内的数据中如果包含了已经周期上报的数据,重复上报
(3)如果两次AEB上报的数据有重叠,重叠数据上报一次。 - 在满足AEB上报条件时会立刻暂停周期上报,即此时即使进入周期上报的周期也不再上报了。在AEB上报结束后重新启动周期上报,新的周期从AEB上报的最后一个数据开始计算。
请根据输入的速度信息,输出上报到云端的内容。
一次是ABEflag满足大于等于4,但输入的数据组ve结束退出了while,所以要while再加一个判断;之后一次应该就是ABE要把周期上传数据给冲了,所以再count等于60的判断后再加上ABEflag<4。
#include <iostream>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;
int main()
{
int N;
cin >> N;
vector<int> ve(N);
int temp;
for (int i = 0; i < N; i++)
{
cin >> temp;
ve[i] = temp;
}
vector<int> ans;
ans.push_back(ve[0]);
int i = 1, lastspeed = ve[0],count=1,ABEfalg=0,ABEedge=0;
while (i<N)
{
if (lastspeed - ve[i] >= 9)
{
ABEfalg++;
}
else
{
if (ABEfalg >= 4)
{
int l = max(ABEedge, i - ABEfalg-4);
int r = min(N - 1, i + 3);
for (int jj = l; jj <= r; jj++)
ans.push_back(ve[jj]);
ABEedge = i + 4;
count = -3;
}
ABEfalg = 0;
}
if (count == 60&&ABEfalg<4)
{
ans.push_back(ve[i]);
count = 0;
}
lastspeed = ve[i];i++; count++;
}
if (ABEfalg >= 4)
{
int l = max(ABEedge, i - ABEfalg - 4);
int r = min(N - 1, i + 3);
for (int jj = l; jj <= r; jj++)
ans.push_back(ve[jj]);
}
int numcc = ans.size() - 1;
for (int luo=0;luo<numcc;luo++)
cout << ans[luo] << ',';
cout << ans[numcc] << endl;
return 0;
}
3. 第三题
无线设备传输过程中,数据经常需要通过各种中继设备进行中转。有某段传输路径,每隔1km放置1个中继设备用于数据中转,现用一数组来描述包括起始点的所有中继设备的最大传输距离。求从起点到终点,能完成信号传输的最少中转次数。
输入描述:
4
2 3 1 1
第一行代表总共中转设备台数,4台
第二行表示各中转设备的最大传输能力。
思路:跳跃游戏系列
int main()
{
int nums;
int maxPos = 0, end = 0, step = 0;
vector<int> temp;
int tmp;
cin >> nums;
while(cin >> tmp)
{
temp.push_back(tmp);
}
for (int i = 0; i < nums-1; i++)
{
maxPos = max(maxPos, i + temp[i]);
if (i == end)
{
end = maxPos;
step += 1;
}
}
return step;
}