腾讯云智笔试 腾讯云智笔试题 0405
笔试时间:2025年04月05日
历史笔试传送门:
第一题
题目:
牛牛开了一家水果店,已知,一个水果恰好可切成 n 块(不论大小),也只能切成 n 块。一个顾客,他 / 她买一盒水果,要求是:这盒水果中的水果块数必须在闭区间 [l, r] 中。牛牛只按 “个” 卖水果,而不是按 “块” 卖水果,所以,如果整数个水果并不满足顾客要求,牛牛就不会卖给这位顾客;而如果存在整数个水果,使得这些水果切成的块数满足顾客要求,那么,牛牛希望你告诉他,牛牛最少需要切多少个水果,以及最多需要切多少个水果。
输入描述
本题为多组测试数据,第一行输入一个正整数 T (1 ≤ T ≤ 1000),代表测试数据的组数。
对于每组测试数据,一行输入三个正整数 n, l, r (1 ≤ n ≤ 100; 1 ≤ l ≤ r ≤ 1000) ,含义如题所述。
输出描述
对于每组测试数据,如果牛牛的卖水果规则不能满足顾客要求,则输出 -1,否则输出两个正整数,依次代表牛牛需要为这位顾客最少切多少个水果,最多切多少个水果。
样例输入
5
2 6 9
3 7 8
1 6 6
9 233 965
10 996 996
样例输出
3 4
-1
6 6
26 107
-1
参考题解
模拟题,需要满足 l ≤ k*n ≤ r 变形为 k ≥ ceil(l/n) 且 k ≤ floor(r/n) 。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream> using namespace std; int main() { int T; cin >> T; while (T--) { int n, l, r; cin >> n >> l >> r; int kMin = (l + n - 1) / n; // ceil(l / n) int kMax = r / n; if (kMax < 1 || kMin > kMax) { cout << -1 << endl; } else { cout << kMin << " " << kMax << endl; } } return 0; }
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Scanner; publicclass Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int T = sc.nextInt(); while (T-- > 0) { int n = sc.nextInt(); int l = sc.nextInt(); int r = sc.nextInt(); int kMin = (l + n - 1) / n; // 向上取整 int kMax = r / n; if (kMax < 1 || kMin > kMax) { System.out.println(-1); } else { System.out.println(kMin + " " + kMax); } } } }
Python:[此代码未进行大量数据的测试,仅供参考]
import math T = int(input()) for _ in range(T): n, l, r = map(int, input().split()) kMin = (l + n - 1) // n # Equivalent to ceil(l / n) kMax = r // n if kMax < 1 or kMin > kMax: print(-1) else: print(kMin, kMax)
第二题
题目
对于一个只包含英文字母的字符串,你可以更改其中的字符,不同的更改类型,代价如下:将一个字母改为另一个大小写相同的字母,花费为 5。将一个字母由大写改为小写或者由小写改为大写花费为 5。现在请你求出对于任给的一个只包含英文字母的字符串,使其中包含有子串 AcMer 的最小代价是多少
输入描述
在一行中给出一个只包含大小写英文字母的字符串 str ,5 ≤ |str| ≤ 200000 。
输出描述
在一行中输出最小的代价。
样例输入
AcAer
样例输出
5
参考题解
滑动窗口遍历 :遍历所有长度为5的子串(时间复杂度O(n))窗口滑动范围:0 <= i <= s.length()-5
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream> #include <string> #include <climits> #include <cctype> using namespace std; int calculateCost(char current, char target) { if (current == target) return 0; bool currentUpper = isupper(current); bool targetUpper = isupper(target); if (currentUpper == targetUpper) return 5; // same case, different letter else if (tolower(current) == tolower(target)) return 5; // same letter, different case else return 10; // different letter and case } int main() { string s; getline(cin, s); const string target = "AcMer"; int minCost = INT_MAX; for (size_t i = 0; i + 5 <= s.size(); ++i) { int cost = 0; for (int j = 0; j < 5; ++j) { cost += calculateCost(s[i + j], target[j]); } minCost = min(minCost, cost); } cout << minCost << endl; return 0; }
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Scanner; publicclass Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.nextLine().trim(); char[] target = {'A', 'c', 'M', 'e', 'r'}; int minCost = Integer.MAX_VALUE; for (int i = 0; i <= s.length() - 5; i++) { int cost = 0; for (int j = 0; j < 5; j++) { cost += calculateCost(s.charAt(i + j), target[j]); } minCost = Math.min(minCost, cost); } System.out.println(minCost); } private static int calculateCost(char current, char target) { if (current == target) return0; boolean currentUpper =
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南