用友笔试 用友笔试题 0819
笔试时间:2025年8月19日
往年笔试合集:
第一题
某电商平台要搞营销活动,对一批优质用户发放优惠券,每个用户只能领1张。平台对用户的账号进行了ID映射,用户id从0开始自增。比如:第一个用户A的ID为0,第二个用户B的ID为1,第三个是2,...…第n个是n-1。相邻的用户不能同时领到优惠券。假设给定一个整数数组,由若干0和1组成,其中 0表示未领取优惠券,1表示领取了优惠券。另有一个数n,判断能否在遵循领取规则的情况下再发放 n张优惠券?能返回 true,不能返回 false。
输入描述
输入两个参数: 1、一个int的一维数组coupons,该数组由0,1组成,0表示未领取优惠券,1表示领取了优惠券; 2、准备再发放优惠券的张数n
输出描述
输出为布尔值,如果能发放n张优惠券,则返回true,否则返回false。
样例输入
1,0,0,0,1
1
样例输出
true
参考题解
该代码采用贪心策略来解决问题。核心思路是:遍历一遍用户列表(数组),只要遇到一个可以发放优惠券的位置,就立即发放一张。一个位置可以发放优惠券的判断条件是:该用户当前没有优惠券(值为0)。其左边相邻的用户没有优惠券(或者该用户是第一个用户)。其右边相邻的用户没有优惠券(或者该用户是最后一个用户)。在遍历过程中,每成功发放一张,就更新该位置的状态并进行计数。遍历完成后,比较成功发放的总数是否大于或等于需要发放的数量 n,从而得出最终结果。
C++:
#include <bits/stdc++.h>
using namespace std;
bool canPlaceMoreCoupons(vector<int>& coupons, int n) {
if (n <= 0) return true;
int count = 0, len = (int)coupons.size();
for (int i = 0; i < len; ++i) {
if (coupons[i] == 0) {
bool leftOk = (i == 0) || (coupons[i - 1] == 0);
bool rightOk = (i == len - 1) || (coupons[i + 1] == 0);
if (leftOk && rightOk) {
coupons[i] = 1;
++count;
}
}
}
return count >= n;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
string line;
if (!getline(cin, line)) return 0; // 第一行: 逗号分隔的数组
int n; cin >> n; // 第二行: 整数 n
vector<int> coupons;
{
stringstream ss(line);
string part;
while (getline(ss, part, ',')) {
if (!part.empty()) coupons.push_back(stoi(part));
else coupons.push_back(0); // 若出现空片段,按 0 处理(与 Java 的 Integer.parseInt 不同,通常无空片段)
}
}
bool ok = canPlaceMoreCoupons(coupons, n);
cout << (ok ? "true" : "false") << "\n";
return 0;
}
Java:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
int n = sc.nextInt();
sc.close();
String[] parts = line.split(",");
int[] coupons = new int[parts.length];
for (int i = 0; i < parts.length; i++) {
coupons[i] = Integer.parseInt(parts[i]);
}
System.out.println(canPlaceMoreCoupons(coupons, n));
}
public static boolean canPlaceMoreCoupons(int[] coupons, int n) {
if (n <= 0) {
return true;
}
int count = 0;
int len = coupons.length;
for (int i = 0; i < len; i++) {
if (coupons[i] == 0) {
boolean leftOk = (i == 0) || (coupons[i - 1] == 0);
boolean rightOk = (i == len - 1) || (coupons[i + 1] == 0);
if (leftOk && rightOk) {
coupons[i] = 1;
count++;
}
}
}
return count >= n;
}
}
Python:
import sys
def can_place_more_coupons(coupons, n):
if n <= 0:
return True
count = 0
length = len(coupons)
for i in range(length):
if coupons[i] == 0:
left_ok = (i == 0) or (coupons[i - 1] == 0)
right_ok = (i == length - 1) or (coupons[i + 1] == 0)
if left_ok and right_ok:
coupons[i] = 1
count += 1
return count >= n
def main():
line = sys.stdin.readline().strip() # 第一行: 逗号分隔的数组
n_line = sys.stdin.readline().strip() # 第二行: 整数 n
n = int(n_line)
parts = line.split(",")
coupons = [int(p) for p in parts if p != ""] # 简单处理空片段
res = can_place_more_coupons(coupons, n)
# 与 Java 输出一致(小写)
print("true" if res else "false")
if __name__ == "__main__":
main()
第二题
小友产业园中有一个电动汽车充电站,充电站中有 k 个充电桩,编号从 1 ~ k。
现在有一个长度为n的二维数组,其中第 i 个元素为[arrivalTime, chargingTime],表示第 i 辆车在时间 arrivalTime 到达充电站需要充电 chargingTime小时。
调度规则:先到先服务: 按到达时间顺序安排充电充电桩分配: 优先使用编号最小的空闲充电桩等待机制: 如果所有充电桩都被占用,车辆需要排队等待同时到达: 如果多辆车同时到达,按车辆编号(输入顺序)优先请你模拟出该充电站的充电桩调度过程。按车辆编号顺序,每行输出一辆车的充电信息,格式为:
车辆编号 开始充电时间 结束充电时间 充电桩编号
输入描述
第一行2个整数n和k,含义如题干所述。
接下来n行,每行2个整数arrivalTime和chargingTime,含义如题干所述。200>=k>=1200>=n>=1arrivalTime>=010>=chargingTime>=1
输出描述
输出n行,每行4个整数,分别表示车辆编号,开始充电时间,结束充电时间,充电桩编号。
样例输入
4 2
0 5
1 1
2 2
6 3
样例输出
0 0 5 1
1 1 2 2
2 2 4 2
3 6 9 1
说明:时间0: 车0到达,用桩1(0-5)时间1: 车1到达,用桩2(1-2)时间2: 车2到达,车1完成,车2用桩2(2-4)时间4: 车2完成时间5: 车0完成时间6: 车3到达,用桩1(6-9)
参考题解
数据结构:创建一个 Car 类来存储每辆车的所有信息,包括其原始编号(ID)、到达时间、充电时长,以及后续计算出的开始充电时间、结束充电时间、和使用的充电桩编号。确定处理顺序:将所有车辆信息读入一个 Car 对象列表。对这个列表进行排序。排序规则完全遵循题目的调度优先级:首先按到达时间升序,如果到达时间相同,则按车辆原始编号升序。这样排序后,列表中的车辆顺序就是它们被处理的先后顺序。模拟调度过程:对于当前车辆,遍历所有充电桩(从1到k)。计算该车在每个桩上可能的最早开始充电时间。这个时间点是 车辆到达时间 和 充电桩当前可用时间 中的较大值。在所有充电桩中,选择一个能提供 最早开始充电时间 的桩。如果多个桩都能提供相同的最早开始时间,由于遍历顺序是从小到大,自然会选中编号最小的那个。确定了最佳充电桩和开始时间后,计算出结束时间,并将这些结果存入当前车辆对象中。最后,更新所选充电桩的 pileFreeTime 为该车的结束充电时间,表示它在该时间点之前都处于占用状态。创建一个数组 pileFreeTime 来记录每个充电桩下一次可用的时间点,初始时所有值都为0。遍历排好序的车辆列表,为每辆车分配充电桩:格式化输出:所有车辆都处理完毕后,Car 列表中已经包含了所有结果,但列表当前是按处理顺序排列的。为了按车辆原始编号顺序输出,需要对列表再次排序,这次的排序规则仅依据车辆的原始ID。最后,遍历排序后的列表,按题目要求的格式输出每辆车的信息。
C++:
#include <bits/stdc++.h>
using namespace std;
struct Car {
int id;
int arrivalTime;
int chargingTime;
int startChargeTime = 0;
int endChargeTime = 0;
int pileId = 0;
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, k;
if (!(cin >> n >> k)) return 0;
vector<Car> cars;
cars.reserve(n);
for (int i = 0; i < n; ++i) {
int at, ct;
cin >> at >> ct;
cars.push_back(Car{i, at, ct});
}
// 按到达时间、id排序
sort(cars.begin(), cars.end(), [](const Car& a, const Car& b){
if (a.arrivalTime != b.arrivalTime) return a.arrivalTime < b.arrivalTime;
return a.id < b.id;
});
// 桩的空闲时间(1..k)
vector<int> pileFreeTime(k + 1, 0);
for (auto& car : cars) {
int bestPileIndex = -1;
int earliestStartTime = INT_MAX;
for (int i = 1; i <= k; ++i) {
int currentStartTime = max(car.arrivalTime, pileFreeTime[i]);
if (currentStartTime < earliestStartTime) {
earliestStartTime = currentStartTime;
bestPileIndex = i;
}
}
car.startChargeTime = earliestStartTime;
car.endChargeTime = car.startChargeTime + car.chargingTime;
car.pileId = bestPileIndex;
pileFreeTime[bestPileIndex] = car.endChargeTime;
}
// 按id输出
sort(cars.begin(), cars.end(), [](const Car& a, const Car& b){
return a.id < b.id;
});
for (const auto& car : cars) {
cout << car.id << ' ' << car.startChargeTime << ' ' << car.endChargeTime << ' ' << car.pileId << '\n';
}
return 0;
}
Java:
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Main {
static class Car {
int id;
int arrivalTime;
int chargingTime;
int startChargeTime;
int endChargeTime;
int pileId;
public Car(int id, int arrivalTime, int chargingTime) {
this.id = id;
this.arrivalTime = arrivalTime;
this.chargingTime = chargingTime;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
List<Car> cars = new ArrayList<>();
for (int i = 0; i < n; i++) {
cars.add(new Car(i, sc.nextInt(), sc.nextInt()));
}
Collections.sort(cars, new Comparator<Car>() {
@Override
public int compare(Car c1, Car c2) {
if (c1.arrivalTime != c2.arrivalTime) {
return Integer.compare(c1.arrivalTime, c2.arrivalTime);
} else {
return Integer.compare(c1.id, c2.id);
}
}
});
int[] pileFreeTime = new int[k + 1];
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南
