华为4.16算法题三道

华为04.16三道算法题复盘

1.反转每对括号间的子串

给出一个字符串 s(仅含有小写英文字母和括号)。

请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。

注意,您的结果中 不应 包含任何括号。

输入:s = "(u(love)i)"
输出:"iloveu"
解释:先反转子字符串 "love" ,然后反转整个字符串。
package HuaWei;

import java.util.*;
import java.io.*;

public class Demo01_4_16 {
    public static void main(String[] args) {
        /*
        反转每对括号间的子串
        思路:
        1:从内到外依次反转括号内的字符,首先定义一个string用来存放临时数组,创建一个StringBuilder对象便于字符串的拼接
        2:如果是'(',则将str中的字符放入栈中,str置0,进入下一层
        3:如果是')',则表示这一层结束,将字符转反转,并将栈顶元素取出添加到str的首部,表示进入上一次
        4:如果是字符元素,则将字符元素添加到str中去,
         */
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        Stack<String> stack = new Stack<String>();
       //一个string用来存放临时数组,创建一个StringBuilder对象便于字符串的拼接
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < s.length() ; i++) {
            char ch = s.charAt(i);//将根据索引查找字符串中的字符
            if (ch == '(') {        //如果字符是'(',说明进入下一层括号中去,所以将之前存好的字符串放到stack中去
                stack.push(sb.toString());
                sb.setLength(0);    //并将sb清空
            } else if (ch == ')') { //如果是遍历到')',说明本层结束,需要返回上一层,直接反转本层的元素,并将上层放在栈中的字符取出放在本层的首部
                sb.reverse();
                sb.insert(0,stack.pop());
            } else {
                sb.append(ch);
            }
        }
        System.out.println(sb.toString());
    }
}
示例:
(ed(et(oc))el)
leetcode

第二题

建立云端数据库,汽车将自身的运行信息上报到云端,汽车自身每隔0.5s生成一次速度数据。

​ 1.周期上报:每30s上报一次,启动后的第一个速度开始计算,第一帧需要上报。

​ 2.AEB(自动紧急制动)上报:当汽车速度比上一次生成的速度减少了9以及以上时,认为触发A流程, 如果连续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。

第三题

无线设备传输过程中,数据经常需要通过各种中继设备进行中转。有某段传输路径,每隔1km放置1个中继设备用于数据中转,现用一数组来描述包括起始点的所有中继设备的最大传输距离。求从起点到终点,能完成信号传输的最少中转次数。

输入描述:
4
2 3 1 1
第一行代表总共中转设备台数,4台
第二行表示各中转设备的最大传输能力。

package HuaWei;

import java.util.Scanner;

/*
题目描述:从起点到终点,每一步所能跳跃的步数用一个一维数组表示,从七点到终点,所用的最小中转次数
思路,从第一步开始,选择下一步可能跳跃的最远距离作为边界,在下一步跳跃的范围之内选择每一步所能跳跃的最远距离,如果达到边界,step++
 */
public class Demo03_4_16 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = Integer.parseInt(sc.nextLine());
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = sc.nextInt();
        }
        int end = 0;    //定义一个边界值,用来记录每一步所能跳跃的最大边界
        int maxPosition = 0;    //定义一个最大位置maxPosition 用来记录当前佐能跳跃的最大位置
        int step = 0;           //用来记录跳跃的步数
        for (int i = 0; i < nums.length-1; i++) {  //此处只遍历到了数组的倒数第二位,是因为在i= 0时步数已经+1了,如果是遍历到最后的话 i= end step还会继续加一,多一步
            maxPosition = Math.max(maxPosition,nums[i] + i); //每一步的下一步的最大值
            if (i == end) {                        //遍历到每一步的边界值,然后将这一层可以到达的最大步数交付给下一层的边界值,步数加1
                end = maxPosition ;
                step++;
            }
        }
        System.out.println(step);
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值