用友笔试 用友笔试题 0819

笔试时间:2025年8月19日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

某电商平台要搞营销活动,对一批优质用户发放优惠券,每个用户只能领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 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论
做出了两道半,发面试了
点赞 回复 分享
发布于 08-26 10:30 北京
是只能用java写吗?
点赞 回复 分享
发布于 09-23 02:43 广东

相关推荐

12-04 15:50
已编辑
南昌大学 Java
12月1号一面35min自我介绍(第一次自我介绍,感觉有点短)平时用过什么集合?ConcurrentHashMap和HashMap的区别?(吟唱)为什么ConcurrentHashMap是线程安全的?(吟唱)HashMap的线程不安全是什么情况?(吟唱)线程池的参数?工作流程?(吟唱)线程的生命周期?(吟唱)wait和sleep的区别?(吟唱)阻塞队列是公平还是非公平的?(说错了)Threadlocal底层?(面试官说我答错了,面试结束我去查了,我是对的)bean的生命周期?(简单的说了说,但是细节说错被指正了)循环依赖?(说了流程,大概是对的,细节可能不太对)redis的缓存穿透为什么用布隆过滤器?布隆过滤器的实现原理?(不知道)CAS是具体是怎么是实现的?(吟唱)AQS?syn锁?(一开始忘了,面试官提醒了一下信号量,后面简单说了说)自己写过lua脚本吗?你这个优化从400ms-100s是怎么测出来的?jmeter不会抢占java程序的cpu吗?(我说不知道)项目都哪里来的?令牌限流怎么实现的?(简单说了下,感觉没答好)用过docker吗?会写docker&nbsp;file吗?了解k8s吗?平时用的ai工具?cursor参数都设置的什么?会用go吗?(下面开始问go了,一点不会啊)go的切片知道吗?go的指针知道吗?反问:业务做私有云容器的没有想象中的八股盛宴,mysql、redis、jvm基本没问多少,项目也没怎么问,juc问挺多,但我不怎么熟悉。面试官是个男的,态度挺好的,不会的地方会指正我,让我回头再了解一下。12月4日编辑:3天没消息默认是挂了,明天再去面一个小厂看看。
发面经攒人品
点赞 评论 收藏
分享
首先,笔试做题写完题目之后给hr,交了之后hr翻了一下说反正做的也就那样吧卷子大概是十道java基础题目,有两题多选,问的大多就跟牛客里的题一样印象很深是几题交简历,然后给hr介绍自己的成果,口齿不清地介绍了一下自己,学校然后说自己简历上两个项目写的是什么,用了什么技术栈java基础:几种基础类型JVM&nbsp;运行&nbsp;.class&nbsp;文件java有几种新建对象的方法,分别是String&nbsp;是基础类型吗,new和直接赋值有什么不同jvm模型linux基础:删除文件命令查看线程,cpu占用命令查看&nbsp;Tomcat&nbsp;日志按文件名查找&nbsp;.log&nbsp;文件多线程的问题:redis并发的问题内存穿透spring的:了解spring框架吗,关于spring&nbsp;boot,spring&nbsp;web有什么关系场景题:如果我去请假,经过审批批假,比如我是申请今天病假,需要部门经理审批,然后要部门经理的上一级领导审批,请问该如何设计流程找ai优化了一下题目这下更加易懂,员工发起当日病假申请,需遵循「两级固定审批流程」——&nbsp;第一级审批人为申请人的直属部门经理,第二级审批人为部门经理的上一级领导(如中心总监&nbsp;/&nbsp;分管领导);仅当两级审批均通过时,请假申请生效;任意一级审批驳回,申请终止并反馈申请人。核心需求是确保审批流程合规、状态可追溯、结果可落地(如同步考勤)。//昨天楼主收到面试邀请才开始仔细背八股,所以基础很差,而且简历上写的也很烂,因为我好多都没有回答出来问题,好像一题也没回答正确,纯来锻炼沟通能力来的(对不起,我不是故意的,但是我真的很烂)问了一下简历,我的简历大概就是黑马点评加黑马外卖,但是我回答的乱七八糟的
查看15道真题和解析
点赞 评论 收藏
分享
评论
1
7
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务