4.14 华为机试题

第一题

给出一个字符串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生成一次速度数据。

  1. 周期上报:每30s上报一次,启动后的第一个速度开始计算,第一帧需要上报。
  2. AEB(自动紧急制动)上报:当汽车速度比上一次生成的速度减少了9及以上时,认为触发AEB流程,如果连续2s均保持AEB状态,触发AEB上报,上报内容有:
    (1)本次AEB过程中的所有速度数据,触发AEB前2s的数据和AEB结束后2s的数据。
    (2)该范围内的数据中如果包含了已经周期上报的数据,重复上报
    (3)如果两次AEB上报的数据有重叠,重叠数据上报一次。
  3. 在满足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;
}
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值