携程笔试 携程笔试题 0415
笔试时间:2025年04月15日
历史笔试传送门:
第一题
题目
首先将每个字符串中把每个字母去重(多次出现只保留最先出现的那个字母),若两个字符串一致,我们则认为两个字符串相似。游游会提出多此询问,请你帮助她判断两个字符串是否相似。
输入描述
每个测试文件均包含多组测试数。
第一行输入一个整数 T(1 <= T <=1000),代表数据组数,每组测试数据描述如下:
对于每一组测试数据:2 行,每行一个字符串。
分别代表81和82,输入保证仅有小写字母组成且长度不超过 10^5。
数据保证单个测试文件的所有字符串长度之和不超过10^5
输出描述
对于每一组数据,若两个字符串相似,输出"YES",否则输出"NO"。
样例输入
2
aba
abba
ac
ca
样例输出
Yes
NO
参考题解
C++:[此代码未进行大量数据的测试,仅供参考]
#include <bits/stdc++.h> using namespace std; string dedup(const string &s) { string result; unordered_set<char> seen; for (char c : s) { if (!seen.count(c)) { seen.insert(c); result += c; } } return result; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; string s1, s2; while (t--) { cin >> s1 >> s2; string d1 = dedup(s1); string d2 = dedup(s2); cout << (d1 == d2 ? "YES\n" : "NO\n"); } return 0; }
Java:[此代码未进行大量数据的测试,仅供参考]
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.HashSet; import java.util.Set; public class Main { static String dedup(String s) { StringBuilder sb = new StringBuilder(); Set<Character> seen = new HashSet<>(); for (char c : s.toCharArray()) { if (seen.add(c)) { sb.append(c); } } return sb.toString(); } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int t = Integer.parseInt(br.readLine()); while (t-- > 0) { String s1 = br.readLine(); String s2 = br.readLine(); String d1 = dedup(s1); String d2 = dedup(s2); System.out.println(d1.equals(d2) ? "YES" : "NO"); } } }
Python:[此代码未进行大量数据的测试,仅供参考]
def dedup(s): result = "" seen = set() for char in s: if char notin seen: seen.add(char) result += char return result t = int(input()) while t > 0: t -= 1 s1 = input() s2 = input() dedup_s1 = dedup(s1) dedup_s2 = dedup(s2) if dedup_s1 == dedup_s2: print("YES") else: print("NO")
第二题
题目:最大收益
游游现在有一个公司,这个公司里有n个任务,每一个任务都有一个能力值和收益值,现在有m个工人,每一个工人都有一个能力值,对于每一个任务来说,只有这个人的能力值不低于该任务需要的能力值,才可以完成这个任务。假设多个工人可以完成,同一个任务,收益为这个任务的收益值乘以这个任务完成的次数,现在想知道每一个工人最多只能安排一个任务的前提下,最大的收益值是多少?
输入描述
每一个文件输入第一行输入一个整数T(1<=T<=100),代表有T组测试数据。
接下来T组,每一组第一行输入两个整数n,m(1≤n,m≤10^4)第二行输入n个整数,其中ai代表第i个任务所需要的的能力值
第三行输入n个整数,其中p[i](1 ≤ p[i]≤10^5)代表第i个任务的收益第四行输入m个整数,其中b[i](1 ≤ b[i]≤10^5)代表第i个工人的能力数据保证同一个文件内n的总和不超过10^5,m的总和不超过10^5数据保证同一个文件内n的总和不超过10^5,m的总和不超过10^5
输出描述
对于每一组测试数据,输出一个答案代表最大的收益。
样例输入
1
5 4
2 4 6 8 10
10 20 30 40 50
4 5 6 7
样例输出
100
说明:对于样例:我们选择前两个工人做第二个任务,第三个工人和第四个工人做第三个任务,此时收益最大
参考题解
贪心
C++:[此代码未进行大量数据的测试,仅供参考]
#include <bits/stdc++.h> using namespace std; struct Task { int ability; int profit; }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while (T--) { int n, m; cin >> n >> m; vector<int> abilities(n), profits(n), workers(m); for (int i = 0; i < n; ++i) cin >> abilities[i]; for (int i = 0; i < n; ++i) cin >> profits[i]; for (int i = 0; i < m; ++i) cin >> workers[i]; vector<Task> tasks(n); for (int i = 0; i < n; ++i) { tasks[i] = {abilities[i], profits[i]}; } sort(tasks.begin(), tasks.end(), [](const Task &a, const Task &b){ return a.ability < b.ability; }); sort(workers.begin(), workers.end()); long long total = 0; int idx = 0; // max-heap of available profits priority_queue<int> pq; for (int w : workers) { while (idx < n && tasks[idx].ability <= w) { pq.push(tasks[idx].profit); ++idx; } if (!pq.empty()) { total += pq.top(); } } cout << total << "\n"; } return 0; }
Java:[此代码未进行大量数据的测试,仅供参考]
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.*; public class Main { static class Task { int ability, profit; Task(int a, int p) { ability = a; profit = p; } } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int T = Integer.parseInt(br.readLine().trim()); while (T-- > 0) { String[] line = br.readLine().split("\\s+"); int n = Integer.parseInt(line[0]); int m = Integer.parseInt(line[1]); int[] abilities = new int[n]; int[] profits = new int[n]; int[] workers = new int[m]; line = br.readLine().split("\\s+"); for (int i = 0; i < n; i++) abilities[i] = Integer.parseInt(line[i]); line = br.readLine().split("\\s+"); for (int i = 0; i < n; i++) profits[i] = Integer.parseInt(line[i]); line = br.readLine().split("\\s+"); for (int i = 0; i < m; i++) workers[i] = Integer.parseInt(line[i]); List<Task> tasks = new ArrayList<>(); for (int i = 0; i < n; i++) { tasks.add(new Task(abilities[i], profits[i])); } tasks.sort(Comparator.comparingInt(t -> t.ability)); Arrays.sort(workers); long total = 0; int idx = 0; // max-heap for available profits PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder()); for (int w : workers) { while (idx < n && tasks.g
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南