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减去最后一个时间点即可.

代码:

/*
 * @lc app=leetcode.cn id=539 lang=cpp
 *
 * [539] 最小时间差
 */

// @lc code=start
class Solution {
public:
    int getMinutes(string time){
        int h = stoi(time.substr(0,2));
        int m = stoi(time.substr(3));
        int total = h*60+m;
        return total;
    }

    int findMinDifference(vector<string>& timePoints) {
        sort(timePoints.begin(),timePoints.end());
        int n = timePoints.size();
        int cur = getMinutes(timePoints[1]) - getMinutes(timePoints[0]);
        int minn = cur; 
        for(int i=1;i<n-1;i++){
            int t1 = getMinutes(timePoints[i+1]);
            int t2 = getMinutes(timePoints[i]);
            cur = t1-t2;
            minn = min(minn,cur);
        }
        minn = min(minn, getMinutes(timePoints[0])+1440 - getMinutes(timePoints[n-1]));
        return minn;
    }
};
// @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变过来的,我们在上一个状态已经计算过这个偶数了,因此没必要扩大他。因此,结束!

代码:

class Solution {
public:
    int minimumDeviation(vector<int>& nums) {
        priority_queue<int> queue;
        int minn = INT_MAX;
        for(auto&num:nums){
            num = (num&1)?num<<1:num;
            queue.push(num);
            minn = min(minn,num);
        }
        int ans = INT_MAX;
        while(!queue.empty() && !(queue.top()&1)){
            ans = min(ans, queue.top()-minn);
            int cur = queue.top()>>1;
            queue.pop();
            queue.push(cur);
            minn = min(minn,cur);
        }
        ans = min(ans, queue.top() - minn);
        return ans;
    }
};

总结:

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值