面试算法题:时钟夹角问题

1、题目描述

我们常见的十二小时钟表上,找出时针和分钟夹角为x度的时刻,x输入整数,返回一个字符串数组

(只考虑整点整分的情况, x取值为0到180度)

2、分析

刚开始拿到题目的时候,隐约记得告诉过我家读小学的小表弟做过这个题目,小学经典数学题。

分针每走一分钟,时针的位置也会变,例如:12点整(0点整),时针分钟夹角0度,12点零1分是5.5度。

即每过一分钟,分针是走6度(分针整个表盘一共分成60格,360/60=6);时针是走0.5度(时针整个表盘一共12格,一小时是60分钟,每过一分钟,时针走360/12/60=0.5,而每过一小时,时针走360/12=30)

这样设时为h,分为m,依据题意,都是整数,以0点为起点,h时m分时,时针走的度数为30 * h + 0.5 * m,而分针走的度数为 6 * m,差值即为x

注意:考虑到算出来的结果可能大于180度,需要另外判断处理

复杂度分析:

时间:O(12 * 60) == O(1)

空间:需要数组存储结果,在某些算法题中返回结果不算占用空间,此处即为O(1)。。。。如果非得算,那最多也就O(12 * 60)

3、代码

py:

import math


def time(degree: int) -> list[str]:
    res = []
    for h in range(0, 12):
        for m in range(0, 60):
            count = math.fabs(h * 30.0 + m * 0.5 - m * 6.0)
            count = count if count < 180.0 else 360.0 - count
            if count == degree * 1.0:
                res.append("{}:{}".format(h, m))
    return res


if __name__ == '__main__':
    print(time(6))

java:

package com.practice;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Degree {
    public static String[] time(int degree) {
        List<String> res = new ArrayList<>();
        for (int h = 0; h < 12; h++) {
            for (int m = 0; m < 60; m++) {
                double count = Math.abs(h * 30.0 + m * 0.5 - m * 6.0);
                count = count < 180.0 ? count : 360.0 - count;
                if (count == (double) degree) {
                    res.add(String.format("%d:%d", h, m));
                }
            }
        }
        return res.toArray(new String[0]);
    }

    public static void main(String[] args) {
        System.out.println(Arrays.toString(time(6)));
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值