最小时间差
给定一个 24 小时制(小时:分钟 "HH:MM" )的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
输入:
2
23:59
00:00
输出:
1
解题思路
将时间段标记在一个圆形上就比较好理解了,最大的时间差为720,最小为0;计算一遍头尾是因为时间超过了720就超出最大的时间差了,需要将其中小的分钟加上1440分钟(也就是一天)来计算。
import java.util.Arrays;
import java.util.Scanner;
class Solution {
public int findMinTime(String[] timeArr) {
// 定义一个int类型的数组,大小跟传进来一样长
int[] minutes = new int[timeArr.length];
// 设置最大的时间差
int min = 720;
// 定义循环变量和计算变量
int i;
// 把String类型的时间数组转化成int类型的分钟数组
for (i = 0; i < minutes.length; i++) {
// int minute = Integer.parseInt(timeArr.get(i).substring(0,2)) * 60 + Integer.parseInt(timeArr.get(i).substring(3,5));
minutes[i] = timeToMinutes(timeArr[i]);
}
// 从小到大排序
Arrays.sort(minutes);
// 用当前项减去前一项,将一项小的赋值给min
for (i = 1; i < minutes.length; i++) {
min = min(min, minutes[i] - minutes[i - 1]);
}
// 计算数组头尾的差并赋值
min = min(min, minutes[0] + 1440 - minutes[minutes.length - 1]);
// 返回min
return min;
}
public int min(int a,int b) {
return Math.min(a, b);
}
public int timeToMinutes(String time) {
int h, m;
h = Integer.parseInt(time.substring(0, 2)) * 60;
m = h + Integer.parseInt(time.substring(3, 5));
return m == 0 ? 1440 : m;
}
}
public class Time {
public static void main(String[] args) {
// Main main = new Main();
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
String[] arr = new String[n];
for (int i = 0; i < n; i++) {
arr[i] = scanner.next();
}
Solution solution = new Solution();
System.out.println(solution.findMinTime(arr));
}
}
最小偏移量
给你一个由 n 个正整数组成的数组 nums 。
你可以对数组的任意元素执行任意次数的两类操作:
如果元素是 偶数 ,除以 2
例如,如果数组是 [1,2,3,4] ,那么你可以对最后一个元素执行此操作,使其变成 [1,2,3,2]
如果元素是 奇数 ,乘上 2
例如,如果数组是 [1,2,3,4] ,那么你可以对第一个元素执行此操作,使其变成 [2,2,3,4]
数组的 偏移量 是数组中任意两个元素之间的 最大差值 。
返回数组在执行某些操作之后可以拥有的 最小偏移量
输入
[1,2,3,4]
输出
1
输入
[4,1,5,20,3]
输出
3
解题思路
奇数只能乘以2(变偶数),偶数可以一直除以2直到变成奇数。首先将所有的奇数乘以2,然后每次将最大值除以并比较最小值即可。
import java.util.Arrays;
import java.util.PriorityQueue;
class Solution {
public int minimumDeviation(int[] nums) {
int ans, mn;
Arrays.sort(nums);
int n = nums.length;
mn = Integer.MAX_VALUE;
ans = nums[n - 1] - nums[0];
PriorityQueue<Integer> q = new PriorityQueue<>((a, b) -> b - a);
for (int i = 0; i < n; i++) {
if (nums[i] % 2 != 0)
nums[i] *= 2;
q.add(nums[i]);
mn = Math.min(mn, nums[i]);
}
while (!q.isEmpty()) {
int now = q.poll();
ans = Math.min(ans, now - mn);
if (now % 2 != 0) break;
q.add(now / 2);
mn = Math.min(mn, now / 2);
}
return ans;
}
}