深信服笔试 深信服笔试题 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%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

