持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
0 < radius <= 108-107 <= x_center, y_center <= 107randPoint最多被调用3 * 104次
二、思路分析:
我们读取本题,题目要求实现随机返回一个在圆内的坐标点的函数。函数对象初始化给出三个参数:
- radius:圆的半径
- x_center: 圆点的x坐标点
- y_center: 圆点的y坐标点
我们一拿到题目,很容易想到使用随机函数random分别求出x,y的随机数
- xx:[-(x_center+radius),x.center+radius]
- yy: [-(y.center+radius),y_center+radius]
然而现实很残酷,一提交NG,果然今天的题没有那么简单,仔细思考一番,需要用上数学的方法。
本题是涉及到圆,那么大家还记高中时候的勾股定理吗?
- 直角三角形中,两个直角边的平方加起来等于斜边的平方
- a^2 + b^2 = c^2
-
方法一:模拟法
通过勾股定理,我们可以求出坐标点到圆点的距离
- 当距离d大于半径r时,则在圆外,不符合要求继续生成新坐标
- 当距离d小于等于半径r时,则在圆内
- 因为圆点的坐标是不固定的,则结果需要加上圆点的坐标点(x_center,y_center)
圆的面积 pir^2 ,正方形面积则为 4rr ,则出现在圆内的概率为P = pi/4 ≈1.274=O(1)
class Solution(object):
def __init__(self, radius, x_center, y_center):
"""
:type radius: float
:type x_center: float
:type y_center: float
"""
self.radius = radius
self.x_center = x_center
self.y_center = y_center
def randPoint(self):
while True:
xx,yy = random.uniform(-self.radius,self.radius), random.uniform(-self.radius,self.radius)
if self.radius * self.radius >= xx * xx + yy * yy :
return [self.x_center+xx,self.y_center+yy]
三、总结:
本题考察我们数学知识的,俗话说得好,学好数理化走遍天下都不怕,AC记录如下:
- 时间复杂度O(1)
- 空间复杂度O(1)
以上是本期内容,欢迎大佬们点赞评论,下期见~~