• 2023 校园招聘 大疆8-7 后端笔试题总结


    1. Leetcode539

    题意:

    给定一个 24 小时制(小时:分钟 "HH:MM")的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。

    示例 1:

    输入:timePoints = ["23:59","00:00"]
    输出:1
    示例 2:

    输入:timePoints = ["00:00","23:59","00:00"]
    输出:0

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/minimum-time-difference
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    思路:

    首先对所有时间进行排序,因为是 string类型,直接排序即可。其次,计算出每个时间对应的分钟,那么最小的时间必然出现在两个相邻的时间点。最后,需要特殊处理一下最后一个时间点和第一个时间点之间,可以将第一个时间点+24hour减去最后一个时间点即可.

    代码:

    1. /*
    2. * @lc app=leetcode.cn id=539 lang=cpp
    3. *
    4. * [539] 最小时间差
    5. */
    6. // @lc code=start
    7. class Solution {
    8. public:
    9. int getMinutes(string time){
    10. int h = stoi(time.substr(0,2));
    11. int m = stoi(time.substr(3));
    12. int total = h*60+m;
    13. return total;
    14. }
    15. int findMinDifference(vector& timePoints) {
    16. sort(timePoints.begin(),timePoints.end());
    17. int n = timePoints.size();
    18. int cur = getMinutes(timePoints[1]) - getMinutes(timePoints[0]);
    19. int minn = cur;
    20. for(int i=1;i-1;i++){
    21. int t1 = getMinutes(timePoints[i+1]);
    22. int t2 = getMinutes(timePoints[i]);
    23. cur = t1-t2;
    24. minn = min(minn,cur);
    25. }
    26. minn = min(minn, getMinutes(timePoints[0])+1440 - getMinutes(timePoints[n-1]));
    27. return minn;
    28. }
    29. };
    30. // @lc code=end

    2.Leecode1675

    题意:

    给你一个由 n 个正整数组成的数组 nums 。

    你可以对数组的任意元素执行任意次数的两类操作:

    如果元素是 偶数 ,除以 2
    例如,如果数组是 [1,2,3,4] ,那么你可以对最后一个元素执行此操作,使其变成 [1,2,3,2]
    如果元素是 奇数 ,乘上 2
    例如,如果数组是 [1,2,3,4] ,那么你可以对第一个元素执行此操作,使其变成 [2,2,3,4]
    数组的 偏移量 是数组中任意两个元素之间的 最大差值 。

    返回数组在执行某些操作之后可以拥有的 最小偏移量 。

    示例 1:

    输入:nums = [1,2,3,4]
    输出:1
    解释:你可以将数组转换为 [1,2,3,2],然后转换成 [2,2,3,2],偏移量是 3 - 2 = 1

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/minimize-deviation-in-array
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    思路:

    可以发现,偶数除于2可以能为奇数或者偶数,而奇数乘2必然能得到偶数,且除2又可得到本身。所以,换种思路,将所有的数据统一转换成偶数,然后记录最大值和最小值,记录两者之间的差,将最大值除于2,更新最大值和最小值以及差值,直到最大值为奇数为止。这时最大值无法缩小了,就应该考虑最小值变大,思考可以发现:一开始全是偶数,如果最小值是奇数,那么它一定是由上一个偶数除以2变过来的,我们在上一个状态已经计算过这个偶数了,因此没必要扩大他。因此,结束!

    代码:

    1. class Solution {
    2. public:
    3. int minimumDeviation(vector<int>& nums) {
    4. priority_queue<int> queue;
    5. int minn = INT_MAX;
    6. for(auto&num:nums){
    7. num = (num&1)?num<<1:num;
    8. queue.push(num);
    9. minn = min(minn,num);
    10. }
    11. int ans = INT_MAX;
    12. while(!queue.empty() && !(queue.top()&1)){
    13. ans = min(ans, queue.top()-minn);
    14. int cur = queue.top()>>1;
    15. queue.pop();
    16. queue.push(cur);
    17. minn = min(minn,cur);
    18. }
    19. ans = min(ans, queue.top() - minn);
    20. return ans;
    21. }
    22. };

    总结:

    这次笔试全是leetcode原题,但是做的并不是太理想,还是最近手比较生了,多总结吧!多练习!今年秋招真的感觉好难,好好加油!

  • 相关阅读:
    浅析ARMv8体系结构:异常处理机制
    【毕业设计】基于stm32的车牌识别系统 - 物联网 单片机
    初识React -- 一篇文章让你会用react写东西
    【闲言碎语】学习 文本编辑器vim及其插件、ranger、C语言、WSL配置、X11等等
    JUC简介与环境搭建
    c++ 11 auto、decltype比较
    投影仪有哪些模块组成?
    什么是电源高压测试标准?如何测试?测试时要注意什么?
    编码体系与规范
    双链笔记Logseq的安装指南
  • 原文地址:https://blog.csdn.net/sinat_37668729/article/details/126229934