小米1014秋招笔试真题解析
- 2026-11-05 03:52:52
关注我们,每周更新两到三次大厂最新笔试题解析
前言
题目比较简单。 第一题简单模拟就好了,注意一定要删除一个元素。 第二题也是模拟题,注意边界处理就好。
数组处理
时间限制:1000MS内存限制:65536KB
题目描述
刷掉一个元素以后全为1的最长子数组。
给定一个二进制数组 nums ,你需要从中删掉一个元素。
请你在删掉元素的结果数组中,返回最长的且只包合 1 的非空子数组的长度。
如果不存在这样的子数组,请返回 0。
输入描述
一个二进制数组
限制; 1length(二进制数组)<10^4
输出描述
删掉元素的结果数组中,返回最长的且只包含 1 的非空子数组的长度。
样例输入
[1,1,0,1]
样例输出
3
提示
删掉位置 2 的数后,[1,1,1] 包含 3 个 1。
思路与代码
删掉一个数,返回最长的全是1的子数组。
遍历一遍,记录连续1的起点和终点。
然后再遍历一遍刚才记录的起点和终点,前面的终点和后面的起点要是只差1的话就可以合并,这个过程中记录下最长的就行了。
复杂度O(n)。
要注意是一定要删掉一个元素,如果全是1的话,结果是要少1的。
std::vector<int> split(std::string s, const char c) { // 输入是[1,1,0,1]这种形式的,所以要写split函数
std::istringstream iss(s);
std::string token;
std::vector<int> result;
while (std::getline(iss, token, c)) {
result.push_back(token[0] - '0');
}
return result;
}
int main() {
std::string s; std::cin >> s;
std::vector<int> nums = split(s.substr(1, s.size() - 2), ',');
// 记录连续1的起点终点
// 如果不是1,start也是-1,continue,否则push
// 如果是连续的第一个1,也就是start = -1,那就两个都变
// 如果不是第一个1,只有end++
int n = nums.size();
std::vector<std::vector<int>> sande;
int start = -1; int end = -1;
for (int i = 0; i < n; i++) {
if (nums[i] != 1) {
if (start == -1) continue;
else { sande.push_back({ start, end }); start = -1; end = -1; }
}
else {
if (start == -1) { start = i; end = i; }
else { end = i; }
}
}
if (start != -1) sande.push_back({ start, end });
if (sande.size() == 1) { std::cout << sande[0][1] - sande[0][0] << std::endl; return 1; } // 全是1的情况
int result = 0;
for (int i = 0; i < sande.size() - 1; i++) {
int len1 = sande[i][1] - sande[i][0] + 1; if (result < len1) result = len1;
int len2 = sande[i + 1][1] - sande[i + 1][0] + 1; if (result < len2) result = len2;
int len3 = 0;
if (sande[i + 1][0] - sande[i][1] == 2) {
len3 = len1 + len2;
}
if (result < len3) result = len3;
}
std::cout << result << std::endl;
}
比较版本号
时间限制:1000MS内存限制:65530KB
假设你是一个安卓app的开发者,在App的版本升级时经常需要比较两个版本号。给你两个版本号version1和version2,请你比较它们。版本号由一个或多个修订号组成,各修订号由一个.链接。每个修订号由多位数字组成,可能包含前导零。例如,2.5.33和0.1都是有效的版本号。
比较版本号时,请注意如下规则:
1.按从左到右的顺序依次比较它们的修订号。
2.从左到右比较两个版本号时,如果其中一个版本号没有修订号,可以用0补齐,也就是说,版本号1.1和1.1.0相等。
3.只离比较忽略任何前导零后的整数值,也就是说,修订号1和修订号 001相等。
输入描述
2个版本号之间用逗号分隔,例如: 1.01,1.001
输出描述
1.如果 version1 > version2 返回 1,
2.如果 version1 < version2 返回-1
3.除此之外返回 0。
样例输入
1.01,1.001
样例输出
0
思路与代码
比较两个版本号,每个版本号由多个修订号用“.”连接(可能有前导0)
从左到右比较,位数可能不相等,需要用0补,前导0是需要被忽略的
如果长度不一样就把短的补补0
然后遍历
先处理前导0,转成int,比较
std::vector<std::string> split(std::string s, const char c) { // 输入要想用","分再用"."分
std::istringstream iss(s);
std::string token;
std::vector<std::string> result;
while (std::getline(iss, token, c)) {
result.push_back(token);
}
return result;
}
int string2int(std::string s) { // 处理前导0和string转int
int index = 0;
int n = s.size();
for (int i = 0; i < n; i++) {
if (s[i] == 0) index++;
}
if (index >= n) return 0;
else return std::stoi(s.substr(index, n - index));
}
int main() {
std::string s; std::cin >> s;
std::vector<std::string> s_ = split(s, ',');
std::vector<std::string> s1 = split(s_[0], '.');
std::vector<std::string> s2 = split(s_[1], '.');
if (s1.size() > s2.size()) { // 补齐长度
for (int i = 0; i < s1.size() - s2.size(); i++) {
s2.push_back("0");
}
}
if (s2.size() > s1.size()) {
for (int i = 0; i < s2.size() - s1.size(); i++) {
s1.push_back("0");
}
}
int n = s1.size();
for (int i = 0; i < n; i++) {
int ver1 = string2int(s1[i]);
int ver2 = string2int(s2[i]);
if (ver1 > ver2) { std::cout << 1 << std::endl; return 1; }
if (ver1 < ver2) { std::cout << -1 << std::endl; return 1; }
}
std::cout << 0 << std::endl;
return 1;
}
最后插一下我们的进阶一对一辅导啦
我们是一个针对技术岗(前后端开发、测试、测开、大数据开发)校招一对一进阶提高的工作室。我们从2020年2月份开始,迄今整整三年的时间,带领300+学员斩获1500+大厂offer,参加活动的同学人均5个中大厂offer以上,以下是我们活动内容的介绍! 万诺coding
我们主要是针对有一定基础的同学提供一对一笔试和面试辅导,针对每个同学不同的情况定制内容,包括但不限于“数据结构与算法”/“计算机基础知识”/“项目梳理”/“面试技巧”/“面试复盘”等内容。
摸底测试:如果有兴趣深入了解我们的活动,需要先参加我们的“摸底测试”(类似面试),方便我们了解你的具体情况(主要是code能力和计算机素养),定制出相应的辅导计划。同时这也是一个双向筛选的过程,如果基础过差的同学,抱歉我们可能无法辅导(基础过差的同学一对一辅导成本过高,对双方都不适合);摸底测试通过的同学,我们会定制化一个针对性的提高计划。然后你再考虑是否参加我们的活动。
承诺保offer:通过摸底测试后,我们会针对每个同学的情况给定一个“保offer”计划。然后同学可以根据自己的实际情况考虑参不参加我们的活动。
有兴趣的同学可以扫码添加我们的微信(whynotlab)