2025 360春季笔试真题

本文为原创内容,转载请注明出处并附带原文链接。感谢您的尊重与支持!

你必须非常努力,才能看起来毫不费劲。


1.序列翻转

题目描述

给定一个长度为n的二进制数字,你可以选择一个区间[x,y]进行翻转。你的目标是得到一个尽量小的二进制数字。
例如下面这个例子中:对于数字11001,你可以选择第一个到第四个位置进行翻转,将11001变成00111。可以证明,这是翻转后可以得到的最小数字。
至多进行一次翻转,请你找到最小的二进制数字并输出。

输入描述

第一行一个整数n,描述这个二进制数字的长度。
第二行一个长度为n的二进制数字。1 ≤ n ≤ 500

输出描述

一个在题目限制下可以得到的长度为n的最小二进制数字。

输入

5
11001

输出

00111

参考答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.util.Scanner;

public class MinLexStringAfterReverse {
public static void main(String[] args) {
// 贪心
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine();
String t = sc.nextLine();

int first0 = -1;

// 找到第一个 '1' 的位置
for (int i = 0; i < n; i++) {
if (t.charAt(i) == '1') {
first0 = i;
break;
}
}

// 如果字符串中没有 '1',直接输出原字符串
if (first0 == -1) {
System.out.println(t);
return;
}

String res = t;

// 遍历 first0 之后的每一个位置,尝试翻转 first0 到 i 之间的子串
for (int i = first0 + 1; i < n; i++) {
StringBuilder sb = new StringBuilder();
sb.append(t, 0, first0); // 前缀部分
sb.append(new StringBuilder(t.substring(first0, i + 1)).reverse()); // 翻转部分
sb.append(t.substring(i + 1)); // 后缀部分

if (sb.toString().compareTo(res) < 0) {
res = sb.toString();
}
}

System.out.println(res);
}
}

2.修复方程

题目描述

给出一些仅包含正整数,加号,乘号和等号的方程,请判断这些方程能否通过插入至多一个数位(若原方程成立则可以不插)使得方程成立。
插入一个数位即将方程视为一个字符里,并将一个0到9之间的数插入中间,开头或未尾。

输入描述

第一行有一个正整数T(1<=T<=10),代表方程的数是。
接下来T行,每行均有一个仅包含十进制正整数,加号和乘号的方程。每个方程中均只会包含一个等号。
保证输入的方程合法,即每个数均不含前导要,开头和未尾没有运算符,且没有两个相邻的运算符。
输入中方程两边计算结果的最大值不超过1000000000,且每个方程的长度不超过1000。

输出描述

对于每个方程,若其成立或可以通过往该方程中插入一个数位使得方程成立,则输出Yes,否则输出No。

输入

q23

输出

Yes
Yes
No
Yes
Yes
No

参考答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ExpressionFixer {

// 初始化:去空格,=转==,去前导0
public static String init(String s) {
s = s.replaceAll(" ", "");
s = s.replaceAll("=", "==");
Pattern p = Pattern.compile("\\b0+(\\d+)\\b");
Matcher m = p.matcher(s);
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, m.group(1));
}
m.appendTail(sb);
return sb.toString();
}

// 判断表达式是否合法并成立
public static boolean judgeIgnoreError(String s) {
try {
// 这里只能模拟 eval,可通过 ScriptEngine 实现
javax.script.ScriptEngineManager mgr = new javax.script.ScriptEngineManager();
javax.script.ScriptEngine engine = mgr.getEngineByName("JavaScript");
Object result = engine.eval(s);
if (result instanceof Boolean && (Boolean) result) {
return true;
}
} catch (Exception e) {
// 忽略错误
}
return false;
}

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = Integer.parseInt(scanner.nextLine().trim());

for (int t = 0; t < n; t++) {
String raw = scanner.nextLine().trim();
String s = init(raw);
boolean can = judgeIgnoreError(s);
if (!can) {
for (int i = 0; i <= s.length(); i++) {
if (can) break;
for (char c = '0'; c <= '9'; c++) {
String modified = s.substring(0, i) + c + s.substring(i);
if (judgeIgnoreError(modified)) {
can = true;
break;
}
}
}
}
System.out.println(can ? "Yes" : "No");
}
scanner.close();
}
}