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原题,但是做的并不是太理想,还是最近手比较生了,多总结吧!多练习!今年秋招真的感觉好难,好好加油!