美团二笔
感觉这次的难度明显亲和的很多(但并不妨碍我a不出第三题orz)
第一题
本来打算用栈处理多个'Z'连续撤销的情况,后来一看题目中说'R'和'Z'都只会出现一次,所以直接模拟即可。
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
in.nextLine();
for (int i = 0; i < n; i++) {
String s = in.nextLine();
StringBuilder sb = new StringBuilder();
for (int j = 0; j < s.length(); j++) {
char c = s.charAt(j);
if (c == 'Z') {
if (j > 0) {
if (s.charAt(j - 1) == 'R') {
sb.reverse();
}
else {
sb.deleteCharAt(sb.length() - 1);
}
}
}
else if (c == 'R') {
sb.reverse();
}
else {
sb.append(c);
}
}
System.out.println(sb.toString());
}
}
}
第二题
直接n^2暴力的话肯定会超时,考虑到l1至r1之间的数字都是连续的,可以遍历每个l2至r2之间的数,每次用O(1)的时间开销计算出当前数字能被多少个数整除。这样可以过50%的用例。
然后我们可以再进行剪枝。如果遍历至l2 > r1,那么后面将不再存在被整除的情况,直接返回结果即可。这样便可通过全部测试用例。
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int l1 = in.nextInt();
int r1 = in.nextInt();
int l2 = in.nextInt();
int r2 = in.nextInt();
long ans = 0l;
for (int i = l2; i <= r2; i++) {
if (i > r1) break;
int start = l1 / i;
start = i * start < l1 ? (start + 1) : start;
int end = r1 / i;
ans += end - start + 1;
}
System.out.println(ans);
}
}
第三题一看是图,直接开摆交卷了QAQ
#软件开发笔面经##技术岗笔试题求解##牛客创作赏金赛#
