吉比特笔试 吉比特秋招 0914
笔试时间:2025年9月14日
往年笔试合集:
第一题
给定一个由'0'和'1'构成的字符串s。我们从字符串开头开始,按照长度依次取出以下子串并解析为十进制数:长度1的子串;长度2的子串;长度3的子串;...;长度10的子串;然后循环回长度1,依此类推。子串被取走后,视为删除,下一次从剩余的字符串中继续取子串,直到剩余字符不足以组成当前长度的子串。
输入描述
在一行上输入一个长度为1 ≤ len(s) ≤ 10^5,由字符'0'和'1'构成的字符串s
输出描述
样例输入
0101001001010
样例输出
4
0 2 4 9
样例说明:依次切分并解析如下:
- 长度1的子串"0"转换为0
- 长度2的子串"10"转换为2
- 长度3的子串"100"转换为4
- 长度4的子串"1001"转换为9
- 此后剩余字符长度不足以组成长度5的子串,故舍弃
参考题解
解题思路: 维护当前处理位置的索引和当前需要截取的子字符串长度。从字符串起始位置开始,按照递增的长度(1, 2, 3, ..., 10,然后循环回1)依次截取子串。每截取一个子串,就将其从二进制转换为十进制数并存入列表。
C++:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
string s;
cin >> s;
vector<int> resultNumbers;
int currentIndex = 0;
int currentLength = 1;
while (currentIndex + currentLength <= s.length()) {
string binarySubstring = s.substr(currentIndex, currentLength);
int decimalValue = stoi(binarySubstring, nullptr, 2);
resultNumbers.push_back(decimalValue);
currentIndex += currentLength;
currentLength++;
if (currentLength > 10) {
currentLength = 1;
}
}
cout << resultNumbers.size() << endl;
if (!resultNumbers.empty()) {
for (int i = 0; i < resultNumbers.size(); i++) {
if (i > 0) cout << " ";
cout << resultNumbers[i];
}
cout << endl;
}
return 0;
}
Java:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.StringJoiner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
scanner.close();
List<Integer> resultNumbers = new ArrayList<>();
int currentIndex = 0;
int currentLength = 1;
while (currentIndex + currentLength <= s.length()) {
String binarySubstring = s.substring(currentIndex, currentIndex + currentLength);
int decimalValue = Integer.parseInt(binarySubstring, 2);
resultNumbers.add(decimalValue);
currentIndex += currentLength;
currentLength++;
if (currentLength > 10) {
currentLength = 1;
}
}
System.out.println(resultNumbers.size());
if (!resultNumbers.isEmpty()) {
StringJoiner sj = new StringJoiner(" ");
for (Integer num : resultNumbers) {
sj.add(String.valueOf(num));
}
System.out.println(sj.toString());
}
}
}
Python:
s = input().strip()
result_numbers = []
current_index = 0
current_length = 1
while current_index + current_length <= len(s):
binary_substring = s[current_index:current_index + current_length]
decimal_value = int(binary_substring, 2)
result_numbers.append(decimal_value)
current_index += current_length
current_length += 1
if current_length > 10:
current_length = 1
print(len(result_numbers))
if result_numbers:
print(' '.join(map(str, result_numbers)))
第二题
牛牛有两个仅由小写字符构成的字符串a, b。牛牛可以删除a串的一段子串(可以为空串)。问:删除子串后的a串和b串相同吗?相同输出"YES",否则输出"NO"。
输入描述
输出描述
输出为t行,每行为一组答案
样例输入
3
abcdef
abef
abcdef
abddef
abcdef
abcdef
样例输出
YES
NO
YES
样例说明: 第一组,a串删除中间的子串"cd"。第二组,无论怎么删除,a串和b串都不相同。第三组,a串删除空串。
参考题解
解题思路: 判断字符串b是否能通过从字符串a中删除一个连续子串得到,等价于检查b是否由a的一个前缀和一个后缀拼接而成。算法通过两个步骤验证:从左到右比较a和b找到共同前缀长度,从右到左比较a和b找到共同后缀长度。
C++:
#include <iostream>
#include <string>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
string a, b;
cin >> a >> b;
int lenA = a.length();
int lenB = b.length();
int l = 0;
while (l < lenA && l < lenB && a[l] == b[l]) {
l++;
}
int ra = lenA - 1;
int rb = lenB - 1;
while (rb >= l && ra >= 0 && a[ra] == b[rb]) {
ra--;
rb--;
}
if (l > rb) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
}
return 0;
}
Java:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
while (t-- > 0) {
String a = sc.next();
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南
查看17道真题和解析