深信服笔试 深信服笔试题 0910

笔试时间:2024年09月10日 秋招

历史笔试传送门:2023秋招笔试合集

第一题

题目

桌子上放了一排石头,有n个,每块石头的颜色可以是红色,绿色或蓝色。

现在要从这排石头取出的数个石头,以便剩余的石头里面,任何两颗相邻的石头具有不同的

颜色的(取出1块石头后,就认为两边的石头是相邻的)。

请根据输入的石头数量、排序和颜色,计算最少要取出几块石头?

输入描述

总共有两行数据。

第一行包含整数n(1≤n≤50)一桌子上的石头数量。第二行是字符串,表示宝石的颜色。

我们将考虑从左到右从1到n编号的石头。

如果第i个字符等于'R',石头是红色,如果等于'G',石头是绿色,如果是'B',石头是蓝色。

输出描述

输出最小花费。

样例输入

3

RRG

样例输出

1

参考题解

双指针。

C++:[此代码未进行大量数据的测试,仅供参考]

#include<iostream>
#include<string>
#include<vector>
#include<unordered_map>
using namespace std;
int main() {
    int n;
    cin >> n;
    string s;
    cin >> s;

    int ans = 0;
    for (int i = 0; i < n;) {
        int j = i + 1;
        while (j < n && s[j] == s[i]) {
            ans++;
            j++;
        }
        i = j;
    }

    cout << ans << "\n";
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        String s = scanner.next();
        scanner.close();

        int ans = 0;
        for (int i = 0; i < n;) {
            int j = i + 1;
            while (j < n && s.charAt(j) == s.charAt(i)) {
                ans++;
                j++;
            }
            i = j;
        }

        System.out.println(ans);
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

n = int(input())
s = input()

ans = 0
i = 0

while i < n:
    j = i + 1
    while j < n and s[j] == s[i]:
        ans += 1
        j += 1
    i = j

print(ans)

第二题

题目

验证一个字符串是否是合法的DNS域名。DNS域名的格式要求如下:

1)域名由一系列以点分隔的标签组成。每个标签最长可为63个字节。域名的总长度不能超

过 255 字节,包括点。域名至少由2个标签组成。2)域名标签只能包含字符 a-z、A-Z、0-9 和-(连字符)。不能在标签开头或结尾指定连字

符。域名支持大小写,但是不区分大小写。

输入描述

一行字符串。

输出描述

如果字符串是合法域名,输出true,否则输出false。

样例输入

163.com

样例输出

true

参考题解

模拟。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <string>
#include <vector>

using namespace std;

bool isDns(const string& str) {
    // Check if length is more than 255
    if (str.length() > 255) {
        cout << "false" << endl;
        return false;
    }

    // Split the input by "."
    vector<string> arr;
    size_t start = 0, end = 0;
    while ((end = str.find('.', start)) != string::npos) {
        arr.push_back(str.substr(start, end - start));
        start = end + 1;
    }
    arr.push_back(str.substr(start));

    // Check if there are at least two parts
    if (arr.size() < 2) {
        cout << "false" << endl;
        return false;
    }

    // Validate each part of the DNS
    for (const string& s : arr) {
        int n = s.length();
        char c1 = s[0];
        char c2 = s[n - 1];

        if (!((isdigit(c1) || isupper(c1) || islower(c1)))) {
            cout << "false" << endl;
            return false;
        }

        if (!((isdigit(c2) || isupper(c2) || islower(c2)))) {
            cout << "false" << endl;
            return false;
        }
    }

    cout << "true" << endl;
    return true;
}

int main() {
    string str;
    getline(cin, str);
    isDns(str);
    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

package com.chuquwan.play;

import java.util.Scanner;

public class IsDns {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        if (str.length() > 255) {
            System.out.println("false");
            return;
        }
        String[] arr = str.split("\\.");
        if (arr.length < 2) {
            System.out.println("false");
            return;
        }
        for (String s : arr) {
            int n = s.length();
            char c1 = s.charAt(0);
            char c2 = s.charAt(n - 1);
            if (!(Character.isDigit(c1) || Character.isUpperCase(c1) || Character.isLowerCase(c1))) {
                System.out.println("false");
                return;
            }
            if (!(Character.isDigit(c2) || Character.isUpperCase(c2) || Character.isLowerCase(c2))) {
                System.out.println("false");
                return;
            }
        }

        System.out.println("true");
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

def is_dns():
    str_input = input()
    
    # Check if length is more than 255
    if len(str_input) > 255:
        print("false")
        return
    
    # Split the input by "."
    arr = str_input.split(".")
    
    # Check if there are at least two parts
    if len(arr) < 2:
        print("false")
        return
    
    # Validate each part of the DNS
    for s in arr:
        n = len(s)
        c1 = s[0]
        c2 = s[-1]
        
        if not (c1.isdigit() or c1.isupper() or c1.islower()):
            print("false")
            return
        
        if not (c2.isdigit() or c2.isupper() or c2.islower()):
            print("false")
            return
    
    print("true")

# Call the function
is_dns()

第三题

题目

现在有一批长度不同的木材woods,现在需要将木材进行拼接,正好达到总长度length,在不考虑切割木材,并且每种长度的木材不限量供应情况下,返回满足要求的最少木材数量,如果

无法通过组合达到规定长度,则返回-1。

输入描述

木材长度列表和需要达到的总长度length

木材种类:1<= len(woods)<= 100

木材长度: 1<= wood

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论

相关推荐

点赞 评论 收藏
分享
查看13道真题和解析
点赞 评论 收藏
分享
1 13 评论
分享
牛客网
牛客企业服务