前言
最近,字节跳动的青训营再次扬帆起航,作为第二次参与其中的小北,深感荣幸能借此机会为那些尚未了解青训营的友友们带来一些详细介绍。青训营不仅是一个技术学习与成长的摇篮,更是一个连接未来与梦想的桥梁~
1、报名方式
2、考核内容
在指定的题库中自主选择不少于 15 道算法题并完成解题,其中题目难度分配如下:
- 简单题不少于 10 道
- 中等题不少于 4 道
- 困难题不少于 1 道
eg:解答代码(简单10题)
1、 线上报警问题分类 (简单)
AI调试代码:
import java.util.*;
public class Main {
public static List<Integer> solution(int n, int m, int q, int[][] arrayN, int[][] arrayQ) {
// 首先创建一个布尔类型的二维数组来记录每个用户是否命中每个实验
boolean[][] userHitExperiments = new boolean[n][m];
// 遍历用户命中的实验序列,标记相应的位置为 true
for (int i = 0; i < n; i++) {
for (int j = 1; j <= arrayN[i][0]; j++) {
userHitExperiments[i][arrayN[i][j] - 1] = true;
}
}
// 创建一个列表来存储每次查询的结果
List<Integer> result = new ArrayList<>();
// 遍历每次查询的实验序列
for (int i = 0; i < q; i++) {
int count = 0;
// 对于每个用户,检查是否符合查询条件
for (int j = 0; j < n; j++) {
boolean isMatch = true;
for (int k = 1; k <= arrayQ[i][0]; k++) {
// 根据正负号判断是否命中或未命中实验
if ((arrayQ[i][k] > 0 && !userHitExperiments[j][arrayQ[i][k] - 1]) ||
(arrayQ[i][k] < 0 && userHitExperiments[j][-arrayQ[i][k] - 1])) {
isMatch = false;
break;
}
}
// 如果符合条件,计数器加 1
if (isMatch) {
count++;
}
}
result.add(count);
}
return result;
}
public static void main(String[] args) {
// Add your test cases here
System.out.println(solution(3, 3, 3, new int[][] { { 2, 1, 2 }, { 2, 2, 3 }, { 2, 1, 3 } },
new int[][] { { 2, 1, -2 }, { 2, 2, -3 }, { 2, 3, -1 } }).equals(Arrays.asList(1, 1, 1)));
}
}
运行结果:
2、版本号比较(简单)
AI调试代码:
public class Main {
public static void main(String[] args) {
System.out.println(solution("0.1", "1.1") == -1);
System.out.println(solution("1.0.1", "1") == 1);
System.out.println(solution("7.5.2.4", "7.5.3") == -1);
System.out.println(solution("1.0", "1.0.0") == 0);
}
public static int solution(String version1, String version2) {
// 首先将版本号按 '.' 分割成修订号数组
String[] revisions1 = version1.split("\.");
String[] revisions2 = version2.split("\.");
// 找出较长的修订号数组长度
int maxLength = Math.max(revisions1.length, revisions2.length);
// 逐个比较修订号
for (int i = 0; i < maxLength; i++) {
// 如果当前下标超出了其中一个版本号的修订号数量,视为 0
int revision1 = i < revisions1.length ? Integer.parseInt(revisions1[i]) : 0;
int revision2 = i < revisions2.length ? Integer.parseInt(revisions2[i]) : 0;
// 比较当前修订号
if (revision1 > revision2) {
return 1;
} else if (revision1 < revision2) {
return -1;
}
}
// 如果所有修订号都相等,返回 0
return 0;
}
}
运行结果:
3、 字符串字符类型排序问题(简单)
AI调试代码:
import java.util.ArrayList;
import java.util.List;
import java.util.Comparator;
public class Main {
public static String solution(String inp) {
// 首先,将输入字符串拆分成字符数组
char[] charArray = inp.toCharArray();
// 分别创建用于存储数字、字母和问号的列表
List<Character> numbers = new ArrayList<>();
List<Character> letters = new ArrayList<>();
List<Integer> questionMarkIndices = new ArrayList<>();
// 遍历字符数组,将数字、字母和问号分别存储到对应的列表中,并记录问号的位置
for (int i = 0; i < charArray.length; i++) {
char c = charArray[i];
if (Character.isDigit(c)) {
numbers.add(c);
} else if (Character.isAlphabetic(c)) {
letters.add(c);
} else if (c == '?') {
questionMarkIndices.add(i);
}
}
// 对数字列表进行从大到小排序
numbers.sort((a, b) -> b - a);
// 对字母列表进行字典序排序
letters.sort(Comparator.naturalOrder());
// 重新构建输出字符串
StringBuilder output = new StringBuilder();
int numIndex = 0;
int letterIndex = 0;
for (int i = 0; i < charArray.length; i++) {
if (questionMarkIndices.contains(i)) {
output.append('?');
} else if (Character.isDigit(charArray[i])) {
output.append(numbers.get(numIndex++));
} else if (Character.isAlphabetic(charArray[i])) {
output.append(letters.get(letterIndex++));
}
}
return output.toString();
}
public static void main(String[] args) {
// Add your test cases here
System.out.println(solution("12A?zc").equals("21A?cz"));
System.out.println(solution("1Ad?z?t24").equals("4Ad?t?z21"));
System.out.println(solution("???123??zxy?").equals("???321??xyz?"));
}
}
运行结果:
结语
在这篇技术博客中,小北与友友们分享了字节跳动青训营的精彩内容,从报名方式到考核内容,再到具体的算法题目示例和解答代码,让我们对青训营有了更深入的了解。通过这些实际的算法题目和解决方案,我们不仅能够学习到编程技巧,还能够感受到解决实际问题的乐趣。
希望这篇博客能够激励更多的技术爱好者参与到青训营中,提升自己的技术水平,同时小北也期待在未来能带给友友们更多有价值的技术分享~
最后,祝愿所有参与青训营的朋友们都能学有所成,技术精进,未来在技术的道路上越走越远。同时,也期待字节跳动青训营能够培养出更多的技术人才,为技术社区注入更多的活力和创新!
感谢友友们的阅读,我们下次再见~