2023 饿了么笔试题 0817
笔试时间:2023年8月17日 秋招
第一题
题目:小红等外卖
小红在饿了么上面点了一个外卖,饥肠辘辘的她等骑手等得望眼欲穿。
已知小红在时刻t1点了外卖,饿了么上面显示预计送达时间为t2,实际送达时间为t3。请你判断外卖是否超时?
输入描述
第一行输入一个正整数t,代表询问次数。接下来的3*t行,每 3 行代表一次询问:第一行为点外卖的时刻t1,第二行为预计送达时间t2,第三行为实际送达时间t3。
保证骑手送外卖的预期花费时间和实际花费时间均不超过 2 小时。
1<=t<=100
输出描述
输出t行。如果超时则输出"Yes",否则输出"No"。
样例输入
3
18:00
19:05
19:05
23:00
00:21
00:23
23:05
00:05
23:58
样例输出
No
Yes
No
参考题解
这里使用内置的时间类模拟。主要是要处理超过了00:00的情况,如果t2和t3的时间差超过了2小时(题目说了不会超过2小时),那么则判断 t2和t1的差值 是否 大于等于 t3和t1的差值即可。
C++:
#include <iostream> #include <ctime> #include <iomanip> using namespace std; int main() { int t; cin >> t; cin.ignore(); // Consume newline character for (int i = 0; i < t; i++) { struct tm t1, t2, t3; string timeStr; getline(cin, timeStr); strptime(timeStr.c_str(), "%H:%M", &t1); getline(cin, timeStr); strptime(timeStr.c_str(), "%H:%M", &t2); getline(cin, timeStr); strptime(timeStr.c_str(), "%H:%M", &t3); time_t diff1 = mktime(&t2) - mktime(&t3); time_t diff2 = mktime(&t1) - mktime(&t3); if (abs(diff1) <= 7200) { if (mktime(&t3) < mktime(&t2)) { cout << "Yes" << endl; } else { cout << "No" << endl; } } else { if (abs(diff2) >= abs(diff1)) { cout << "Yes" << endl; } else { cout << "No" << endl; } } } return 0; }
Java:
import java.time.Duration; import java.util.Scanner; import java.time.LocalTime; import java.time.format.DateTimeFormatter; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int t = sc.nextInt(); sc.nextLine(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm"); for (int i = 0; i < t; i++) { LocalTime t1 = LocalTime.parse(sc.nextLine(), formatter); LocalTime t2 = LocalTime.parse(sc.nextLine(), formatter); LocalTime t3 = LocalTime.parse(sc.nextLine(), formatter); if (Math.abs(Duration.between(t2,t3).toHours()) <= 2) { if (t3.isAfter(t2)) System.out.println("Yes"); else System.out.println("No"); } else { if (Math.abs(Duration.between(t1,t3).toHours()) >= Math.abs(Duration.between(t1,t2).toHours())) System.out.println("Yes"); else System.out.println("No"); } } } }
Python:
from datetime import datetime t = int(input()) for i in range(t): t1 = datetime.strptime(input(), "%H:%M") t2 = datetime.strptime(input(), "%H:%M") t3 = datetime.strptime(input(), "%H:%M") diff1 = (t2 - t3).total_seconds() diff2 = (t1 - t3).total_seconds() if abs(diff1) <= 7200: if t3 < t2: print("Yes") else: print("No") else: if abs(diff2) >= abs(diff1): print("Yes") else: print("No")
第二题
题目:小红的字符串构造
小红拿到了一个字符串s,她准备构造一个和t长度相同的字符串t:满足以下条件:
1.t的字符集和s的相同(去重后的,也就是说不考虑数量)
2.t的每个位置的字符都和s不同。
例如若 s="aabbc",那么t可以构造为"cbaca"。
你能帮帮小红吗?
输入描述
输入一个仅由小写字母组成的字符串s,长度不超过 200000。
输出描述
如果无解,请输出 -1。否则输出任意合法的字符串。
样例输入
aabbc
样例输出
cbaca
"bcacb"等字符串也是合法的构造。
参考题解
首先将s的字符统计,然后按照规则不重复的将字符填进新字符。
注意点:1.尽量使用没使用过的字符 2.如果所有字符都使用过,则只需要考虑不重复即可。
C++:
#include <iostream> #include <string> #include <unordered_set> using namespace std; int main() { string s; getline(cin, s); unordered_set<char> charSet; for (char c : s) { charSet.insert(c); } string t(s.length(), ' '); int pos = 0; unordered_set<char> used; for (int j = 0; j < s.length(); j++) { if (used.size() != charSet.size()) { for (char c : charSet) { if (charSet.count(c) && !used.count(c) && c != s[j]) { t[j] = c;
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2023秋招各大笔试题汇总,c++,java,python多种语言分析,解答。