吉比特笔试 吉比特秋招 0914

笔试时间:2025年9月14日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

给定一个由'0'和'1'构成的字符串s。我们从字符串开头开始,按照长度依次取出以下子串并解析为十进制数:长度1的子串;长度2的子串;长度3的子串;...;长度10的子串;然后循环回长度1,依此类推。子串被取走后,视为删除,下一次从剩余的字符串中继续取子串,直到剩余字符不足以组成当前长度的子串。

输入描述

在一行上输入一个长度为1 ≤ len(s) ≤ 10^5,由字符'0'和'1'构成的字符串s

输出描述

  • 第一行输出一个整数p,表示解析得到的数字个数
  • 第二行输出p个整数,表示所有解析出的十进制数字,数字之间用空格隔开
  • 样例输入

    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,表示有t组数据
  • 接下来有2×t行,其中第一行一个字符串a,第二行为一个字符串b
  • 1 ≤ t ≤ 101 ≤ len(b) ≤ len(a) ≤ 10^5
  • 输出描述

    输出为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 春招笔试合集 文章被收录于专栏

    2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

    全部评论

    相关推荐

    评论
    点赞
    1
    分享

    创作者周榜

    更多
    牛客网
    牛客网在线编程
    牛客网题解
    牛客企业服务