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)));
}
}