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多种语言分析,解答。
查看7道真题和解析