深信服笔试 深信服笔试题 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多种语言版本,持续更新中。