美团二笔
感觉这次的难度明显亲和的很多(但并不妨碍我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
#软件开发笔面经##技术岗笔试题求解##牛客创作赏金赛#