华为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);
}
}