最小时间差

给定一个 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;
    }
}
最后修改:2022 年 08 月 07 日
如果觉得我的文章对你有用,请随意赞赏