360笔试 360笔试题 0406
笔试时间:2025年04月06日
历史笔试传送门:
第一题
题目:序列翻转
给定一个长度为n的二进制数字,你可以选择一个区间[x,y]进行翻转。你的目标是得到一个尽量小的二进制数字。例如下面这个例子中:对于数字11001,你可以选择第一个到第四个位置进行翻转,将11001变成00111。可以证明,这是翻转后可以得到的最小数字。至多进行一次翻转,请你找到最小的二进制数字并输出。
输入描述
第一行一个整数n,描述这个二进制数字的长度。
第二行一个长度为n的二进制数字。
1 ≤ n ≤ 500
输出描述
一个在题目限制下可以得到的长度为n的最小二进制数字。
样例输入
5
11001
样例输出
00111
参考题解
贪心,找到从左到右开始首次出现的'1',然后枚举从当前1开始往后的每个区间进行翻转,在枚举过程中记录出最小的字符串,即最终答案。
C++:[此代码未进行大量数据的测试,仅供参考]
// C++ 版本
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
string t;
cin >> n;
cin >> t;
// 找到第一个 '1' 的位置
int first1 = -1;
for (int i = 0; i < n; i++) {
if (t[i] == '1') {
first1 = i;
break;
}
}
// 如果字符串中没有 '1',直接输出原串并退出
if (first1 == -1) {
cout << t;
return 0;
}
string res = t;
// 枚举从 first1 到 i 的每一种反转方案
for (int i = first1 + 1; i < n; i++) {
// 先截取 [0, first1) 的前缀
string prefix = t.substr(0, first1);
// 再截取 [first1, i] 这段,反转后拼接
string mid = t.substr(first1, i - first1 + 1);
reverse(mid.begin(), mid.end());
// 最后拼接 [i+1, n) 的后缀
string suffix = (i + 1 < n ? t.substr(i + 1) : "");
string tmp = prefix + mid + suffix;
if (tmp < res) {
res = tmp;
}
}
cout << res;
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
// Java 版本
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine().trim());
String t = sc.nextLine().trim();
// 找到第一个 '1' 的位置
int first1 = -1;
for (int i = 0; i < n; i++) {
if (t.charAt(i) == '1') {
first1 = i;
break;
}
}
// 如果字符串中没有 '1',直接输出原串并退出
if (first1 == -1) {
System.out.println(t);
return;
}
String res = t;
// 枚举从 first1 到 i 的每一种反转方案
for (int i = first1 + 1; i < n; i++) {
// 前缀 [0, first1)
String prefix = t.substring(0, first1);
// 中间 [first1, i],反转后拼接
String mid = t.substring(first1, i + 1);
mid = new StringBuilder(mid).reverse().toString();
// 后缀 [i+1, n)
String suffix = (i + 1 < n) ? t.substring(i + 1) : "";
String tmp = prefix + mid + suffix;
if (tmp.compareTo(res) < 0) {
res = tmp;
}
}
System.out.println(res);
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
n = int(input()) t = input() first0 = -1 for i in range(n): if t[i] == '1': first0 = i break if first0 == -1: print(t) exit(0) res = t for i in range(first0 + 1,n): tmp = t[:first0] + t[first0:i + 1][::-1] + t[i+1:] if tmp < res: res = tmp print(res)
第二题
题目:修复方程
给出一些仅包含正整数,加号,乘号和等号的方程,请判断这些方程能否通过插入至多一个数位(若原方程成立则可以不插)使得方程成立。插入一个数位即将方程视为一个字符里,并将一个0到9之间的数插入中间,开头或未尾。
输入描述
第一行有一个正整数T(1<=T<=10),代表方程的数是。
接下来T行,每行均有一个仅包含十进制正整数,加号和乘号的方程。每个方程中均只会包含一个等号。
保证输入的方程合法,即每个数均不含前导要,开头和未尾没有运算符,且没有两个相邻的运算符。
输入中方程两边计算结果的最大值不超过1000000000,且每个方程的长度不超过1000。
输出描述
对于每个方程,若其成立或可以通过往该方程中插入一个数位使得方程成立,则输出Yes,否则输出No。
样例输入
6
16=1+2*3
7*8*9=54
1+1=1+22
4*6=22+2
15+7=1+2
11+1=1+5
样例输出
Yes
Yes
No
Yes
Yes
No
参考题解
模拟,根据数据范围可以暴力枚举并判断,因此枚举插入的数位的位置,去判断等式是否成立即可。可以直接使用python中的eval函数进行判断。在判断过程中要注意使用异常捕捉机制去除掉存在前导0的情况。
C++:[此代码未进行大量数据的测试,仅供参考]
// C++ 版本
// 说明:因为 C++ 标准库并不自带“eval”函数,这里实现了一个简单的
// 四则运算 + 括号解析器(递归下降法),并手动拆分 “==” 比较或仅计算
// 单侧表达式的值。若解析或计算过程中出现错误(如语法不合法、除以 0),
// 就视作表达式不成立。
#include <bits/stdc++.h>
using namespace std;
// 对输入字符串做初始化:去掉所有空格,把每个 '=' 变成 "==",
// 然后用正则去掉数字前导零(例如 "007" → "7";单独的 "0" 不影响)。
string init(const string& s_in) {
// 1) 去掉空格
string s;
for (char c : s_in) {
if (c != ' ') s.push_back(c);
}
// 2) 把每个 '=' 都替换为 "=="
// (如果原本字符串里有 "==",就会被替换成 "====",和 Python 原逻辑一致,
// 但后续解析时会因语法错导致判定为不合法。)
string replaced;
replaced.reserve(s.size() * 2);
for (char c : s) {
if (c == '=') {
replaced += "==";
} else {
replaced.push_back(c);
}
}
s = replaced;
// 3) 用正则 \b0+(\d+)\b 将前导零去掉 (例如 "00123" → "123")。
try {
static const regex p(R"(\b0+(\d+)\b)");
s = regex_replace(s, p, "$1");
} catch (...) {
// 如果此环境下正则抛异常,就跳过,让 s 保持原样
}
return s;
}
// 对单侧算术表达式做求值,返回 (是否合法, 计算结果)。
// 支持:整数、加减乘除、括号,均为整除运算。若语法错误或除以 0,则 ok=false。
pair<bool, long long> evaluateArithmetic(const string& s) {
// 用递归下降法解析:
// Expr := Term { (+|-) Term }
// Term := Factor { (*|/) Factor }
// Factor:= number | '(' Expr ')'
//
// 只允许十进制整数和小括号、不支持一元 + -(原 Python 里如果出现一元 '-',
// 在这里会被判为“语法错误”并返回 false;与原 Python eval 有所区别)。
//
// 注意:输入中的每个数字已经去掉了前导零(除了单独的 "0")。
struct Parser {
const string& str;
size_t pos;
bool ok;
Parser(const string& s_) : str(s_), pos(0), ok(true) {}
// 跳过若干空格(理论上 init 后就没有空格了,这里留作保险)
void skipSpaces() {
while (pos < str.size() && str[pos] == ' ') {
pos++;
}
}
/
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南
