哔哩哔哩0923秋招笔试真题解析
- 2026-11-05 11:51:33
关注我们,每周更新两到三次大厂最新笔试题解析
前言
题目比较简单,基本都是LC的原题。这个也太不像B站的难度了
数字字符串转化成IP地址
现在有一个只包含数字的字符串,将该字符串转化成IP地址的形式,返回所有可能的情况。
示例1
输入
“25525511135”
输出
["255.255.11.135"255.255.111.35"]
思路与代码
第一题是力扣原题,这个计算器的实现使用了双端队列(Deque)来处理表达式中的括号和符号,遵循了基本的算术规则,而且处理了可能出现的空格。
class Solution {
public int calculate(String s) {
Deque<Integer> ops = new LinkedList<Integer>();
ops.push(1);
int sign = 1;
int ret = 0;
int n = s.length();
int i = 0;
while (i < n) {
if (s.charAt(i) == ' ') {
i++;
} else if (s.charAt(i) == '+') {
sign = ops.peek();
i++;
} else if (s.charAt(i) == '-') {
sign = -ops.peek();
i++;
} else if (s.charAt(i) == '(') {
ops.push(sign);
i++;
} else if (s.charAt(i) == ')') {
ops.pop();
i++;
} else {
long num = 0;
while (i < n && Character.isDigit(s.charAt(i))) {
num = num * 10 + s.charAt(i) - '0';
i++;
}
ret += sign * num;
}
}
return ret;
}
}
手搓计算器
给你一个字符串表达式s,请你实现一个基本计算器来计算并返回它的值。注意不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval0。
运算符仅包含+、1、(、)
示例1
输入
“1+1”
输出
2
思路与代码
IP地址由四个十进制数组成,每个十进制数位于0到255之间,并由三个点分隔。例如,172.16.254.1是一个合法的IP地址。但不所有四个数字都是必需的,例如,0.0.0.0和255.255.255.255都是合法的IP地址。
现在,让我们解释代码的核心思想:
筛选条件:
如果 s的长度小于4或大于12,直接返回。因为合法的IP地址最短长度是4(0.0.0.0),最长长度是12(255.255.255.255)。回溯法(Backtracking):
使用递归的方式尝试所有可能的组合来构建IP地址。 backtrack函数是这个逻辑的核心,它通过添加或删除部分子字符串来尝试构建IP地址。它以 s的当前索引idx为参数,并检查每一个可能的IP地址段。IP地址段的检查:
tmp的长度大于1并且以0开头(例如01,010)是不合法的。tmp转换成整数后大于255是不合法的。ip的大小超过4(因为IP地址只有四段)是不合法的。使用substring方法从 s中提取子字符串tmp。有几个检查以确保子字符串 tmp是合法的IP地址段:如果上述检查都通过,那么 tmp被添加到ip列表中,并递归地进入下一步。结束条件:
如果我们到达了 s的末尾并且ip列表的大小为4,那么我们找到了一个合法的IP地址组合。此时,ip列表的内容被加入到res结果列表中。其他逻辑:
getList方法主要用于返回结果。它先调用restoreIpAddresses方法,然后将结果转换为字符串数组,移除所有null项(虽然这里似乎不可能有null项,removeIf(item -> item == null)可能是多余的)。
import java.util.ArrayList;
import java.util.List;
class C {
List<String> res = new ArrayList<>();
List<String> ip = new ArrayList<>(7);
public String[] getList(String s) {
List<String> strings = restoreIpAddresses(s);
strings.removeIf(item -> item == null);
String[] ss= new String[strings.size()];
for (int i = 0;i<strings.size();i++){
ss[i] = strings.get(i);
}
return ss;
}
public List<String> restoreIpAddresses(String s) {
if (s.length() < 4 || s.length() > 12) {
return res;
}
backtrack(s, 0);
return res;
}
private void backtrack(String s, int idx) {
if (idx == s.length()) {
if (ip.size() == 4) {
res.add(String.join(".", ip));
}
return;
}
for (int i = idx; i < s.length(); ++i) {
String tmp = s.substring(idx, i + 1);
if ((tmp.length() > 1 && tmp.startsWith("0")) || Integer.parseInt(tmp) > 255 || ip.size() >= 4) {
return;
}
ip.add(tmp);
backtrack(s, i + 1);
ip.remove(ip.size() - 1);
}
}
}
最后插一下我们的进阶一对一辅导啦
我们是一个针对技术岗(前后端开发、测试、测开、大数据开发)校招一对一进阶提高的工作室。我们从2020年2月份开始,迄今整整三年半的时间,带领300+学员斩获1500+大厂offer,参加活动的同学人均5个中大厂offer以上,以下是我们活动内容的介绍! 万诺coding
我们主要是针对有一定基础的同学提供一对一笔试和面试辅导,针对每个同学不同的情况定制内容,包括但不限于“数据结构与算法”/“计算机基础知识”/“项目梳理”/“面试技巧”/“面试复盘”等内容。
摸底测试:如果有兴趣深入了解我们的活动,需要先参加我们的“摸底测试”(类似面试),方便我们了解你的具体情况(主要是code能力和计算机素养),定制出相应的辅导计划。同时这也是一个双向筛选的过程,如果基础过差的同学,抱歉我们可能无法辅导(基础过差的同学一对一辅导成本过高,对双方都不适合);摸底测试通过的同学,我们会定制化一个针对性的提高计划。然后你再考虑是否参加我们的活动。
承诺保offer:通过摸底测试后,我们会针对每个同学的情况给定一个“保offer”计划。然后同学可以根据自己的实际情况考虑参不参加我们的活动。
有兴趣的同学可以扫码添加我们的微信(whynotlab)