hulu公司2018年9月10日技术岗笔试试题答案

第二题

原题没有截图,下面是我回忆的版本:

在二维坐标系中,以原点为中心有一个圆,给定一个数组arr,数组中的数字为某个度数,范围是[0°, 360°],度数的含义是以x轴为起点逆时针旋转的角度。现在让你求从数组中选出三个数,每个数对应的角度都可以得到一个圆上的点,这三个点可以构成一个三角形。现在要求数组中可以组成的所有三角形中,钝角三角形的个数。

输入:第一行为数字n,是数组的长度。以下n行为数组中的n个数。

输入样例:

4
0
10
100
300

输出:

1

样例解析:数组长度为4,数组为{0, 10, 100, 300},钝角三角形只有1种情况(0, 10, 100)。

解题思路:

利用一个数学定理:如果圆上的三个点构成的三角形为钝角三角形,那么这三个点必须是位与同一个半圆范围内。例如(0, 10, 100)三个点都是处于0°~180°这个半圆范围内。

如何判断三个角度是否位与同一个半圆范围内?

得到三个角度后,首先对角度最小的点做反向延长线,例如(0, 10, 100)三个点,做0的反向延长线,得到180,现在我们只需判断其它两个角度10和100是否同时处于[0°, 180°)的半圆内,或同时处于(180°, 360°]的半圆内即可。

注意:当有两个角度相差180°的时候,例如(0, 10, 180),组成的三角形一定是直角三角形,而不是钝角三角形。

Python源代码:

# -*- coding:utf-8 -*-

def find_tri(alist):
    res = 0
    alist_copy = list(alist)
    for i, num in enumerate(alist_copy):
        key = num + 180
        bigger = [x for x in alist if x > key and x != num]
        smaller = [x for x in alist if x < key and x != num]
        alist.remove(num)

        print bigger
        print smaller

        if len(bigger) >= 2:
            res += len(bigger) * (len(bigger) - 1) / 2

        if len(smaller) >= 2:
            res += len(smaller) * (len(smaller) - 1) / 2
        print "i =", i, "res=", res
    print "res =", res


if __name__ == "__main__":
    num = int(raw_input())
    alist = []
    for i in range(num):
        alist.append(int(raw_input()))
    alist.sort()
    find_tri(alist)

猜你喜欢

转载自blog.csdn.net/ai_XX/article/details/82597314
今日推荐