机器人返回原点



问题:

有一个机器人从2D平面上的原点位置(0,0(开始。给定它的一系列动作,判断这个机器人在完成动作后是否会达到(0,0(。

移动序列由字符串表示,字符moves[i]表示其第i次移动。有效的移动是R(右(、L(左(、U(上(和D(下(。如果机器人在完成所有移动后返回原点,则返回true。否则,返回false。

注意:机器人的方式是";面向";无关紧要"R〃;将总是使机器人向右移动一次;L";将始终使其向左移动,等等。此外,假设机器人的移动幅度对于每次移动都是相同的。

输入:moves="UD"输出:true说明:机器人向上移动一次,然后向下移动一次。所有的移动都有相同的幅度,所以它最终到达了开始的原点。因此,我们返回true

我有以下解决方案,对于序列="UD"来说似乎是错误的,它应该返回True。有人能帮我理解我在这里做错了什么,以及我该如何解决吗?

class Solution:
class Mover:
def __init__(self, x, y):
self.x, self.y = x, y
def new_pos(self, x, y):
return x + self.x, y + self.y
WALKS = dict(U=Mover(0, -1), D=Mover(0, 1),
L=Mover(-1, 0), R=Mover(1, 0))
def judge_circle(self, moves):
x = y = 0
for id in moves:
x, y = self.WALKS[id].new_pos(x, y)
return x == y == 0
def move_sequences(self,sequences):
for moves in sequences:
return (solution.judge_circle(moves))
if __name__ == "__main__":
solution = Solution()
sequences = "UD"
print(solution.move_sequences(sequences))

这个解决方案似乎考虑得太多了。您只需对4个方向中的每一个进行计数,就可以计算出相对于Ds的Us和相对于Rs的Ls的数量是否相同。return s.count("U") == s.count("D") and s.count("L") == s.count("R")为您提供了一个线性解决方案,可以使用等方法优化为单程

from collections import Counter
d = Counter(moves)
return d["D"] == d["U"] and d["R"] == d["L"]

至于你的代码,

for moves in sequences:
return (solution.judge_circle(moves))

在我看来很有趣。返回第一次迭代意味着循环毫无意义。这里的moves命名错误——它只是一个字符"U"judge_circle已经执行了一个循环,所以如果你真的想强行执行,你只需要在序列上执行一个循环而不是两个。

您的任务很简单:

def judge_circle(moves):
if moves.lower().count('U') == moves.lower().count('D') and moves.lower().count('L') == moves.lower().count('R'):
return True
else:
return False
print(judge_circle('UD'))

你只需要检查"向上"的数量是否等于"向下"的数量,"向左"是否等于"向右"。

好的,这是重构建议的一部分,你可以用一种简单的方式修复你的脚本。

def move_sequences(self,sequences):
for moves in sequences:
return (solution.judge_circle(moves))

失败是因为您按顺序传递字符串,for循环在字母上循环,将每个字母都传递给judice_circle。删除for循环并将序列传递给judice_circle!

最新更新