我正在做谷歌foobar的挑战,但跑出了以下挑战的时间我试图看看我做错了什么。谷歌foobar gearing_up_fortruction_
挑战
司令员拉姆达的私人助理,你被分配配置LAMBCHOP世界末日装置的轴向取向齿轮的任务。它应该非常简单 - 只需添加齿轮即可创建适当的旋转比率。但问题是,由于LAMBCHOP的布局以及支撑它的横梁和管道的复杂系统,支撑齿轮的挂钩固定在位。
LAMBCHOP的工程师给你列出了各种支撑梁上钉组的位置。您需要在每个挂钩上放置一个齿轮(否则齿轮会与未占用的挂钩碰撞)。工程师有大量不同尺寸的齿轮,因此您可以选择任何尺寸的齿轮,范围从1到1。您的目标是建立一个系统,其中最后一个齿轮以一倍速度(以每分钟转数或rpm)旋转,无论方向如何。每个齿轮(除最后一个齿轮)都接触并转动右侧下一个齿轮上的齿轮。
给定一个名为pegs的不同正整数列表,它表示每个peg沿支撑梁的位置,编写一个函数答案(pegs),如果有解,则返回一个包含两个正整数a和b的列表为了实现上述目标,第一个齿轮半径的分子和分母最简单的形式,即半径= a/b。比率a/b应大于或等于1.并非所有支持配置都必须能够创建正确的旋转比率,因此如果任务不可行,函数answer(pegs)应返回列表[-1, -1]。
例如,如果挂钉放置在[4,30,50]处,则第一个齿轮可以具有12的半径,第二个齿轮可以具有14的半径,并且最后一个半径为6 。因此,最后一个齿轮将旋转两倍于第一个齿轮的速度。在这种情况下,pegs会是[4,30,50],回答(pegs)应该返回[12,1]。
列表挂钩将按升序排列,并且包含至少2个且不超过20个不同的正整数,全部在1到10000之间。
测试用例
Inputs:
(int list) pegs = [4, 30, 50]
Output:
(int list) [12, 1]
Inputs:
(int list) pegs = [4, 17, 50]
Output:
(int list) [-1, -1]
我目前的解决方案如下
def answer(pegs):
n = len(pegs)
g = range(n)
k = pegs[1] - pegs[0]
for i in range(0,k,2):
g[0] = i
for j in range(1,n):
g[j] = (pegs[j] - pegs[j-1]) - g[j-1]
if any(b < 1 for b in g):
continue
if 1.0*g[0]/g[-1] == 2.0:
return [g[0],1]
return [-1, -1]
我只能得到6测试用例来传递我现在已经没有时间了,但我很好奇至于什么是正确的解决方案
哇,好像你做了很多工作..很详细的答案。 – sulavvr
感谢您的详细解答。按照相同的逻辑,如果将该公式看作线性方程组,并用矩阵求逆来求解r0,r1,r2 ... rn,则可以简化公式。系数矩阵的逆矩阵有一个模式,非常容易计算。奇数和偶数的唯一不同之处在于最终答案必须用偶数除以3。 –