1. 程式人生 > 實用技巧 >LeetCode 657. 機器人能否返回原點 普通與加速做法 模擬

LeetCode 657. 機器人能否返回原點 普通與加速做法 模擬

地址https://leetcode-cn.com/problems/robot-return-to-origin/

在二維平面上,有一個機器人從原點 (0, 0) 開始。
給出它的移動順序,判斷這個機器人在完成移動後是否在(0, 0) 處結束。

移動順序由字串表示。字元 move[i] 表示其第 i 次移動。
機器人的有效動作有R(右),L(左),U(上)和 D(下)。
如果機器人在完成所有動作後返回原點,則返回 true。否則,返回 false。

注意:機器人“面朝”的方向無關緊要。 “R” 將始終使機器人向右移動一次,“L” 將始終向左移動等。
此外,假設每次移動機器人的移動幅度相同。



示例 
1: 輸入: "UD" 輸出: true 解釋:機器人向上移動一次,然後向下移動一次。 所有動作都具有相同的幅度,因此它最終回到它開始的原點。 因此,我們返回 true。 示例 2: 輸入: "LL" 輸出: false 解釋:機器人向左移動兩次。它最終位於原點的左側,距原點有兩次 “移動” 的距離。 我們返回 false,因為它在移動結束時沒有返回原點。

演算法1
用map記錄上下左右 看看相反方向的數目是否相同

C++ 程式碼

class Solution {
public:
  map<char, int> m;

bool judgeCircle(string
moves) { for (int i = 0; i < moves.size(); i++) { m[moves[i]]++; } if (m['U'] == m['D'] && m['L'] == m['R']) return true; return false; } };

演算法2
加速下 如果選擇的方向數目是單數 那麼肯定回不了原點
另外不用速度慢的map 直接用陣列記錄

C++ 程式碼

class Solution {
public:
bool judgeCircle(string moves) {
    
if(moves.empty()) return true; if(moves.size()%2) return false; int a = 0; int b = 0; for (const auto& e : moves) { switch(e){ case 'U': a++;break; case 'D': a--;break; case 'L': b++;break; case 'R': b--;break; } } return a == 0 && b == 0; } };