C#LeetCode刷题之#657-机器人能否返回原点(Robot Return to Origin)

C#LeetCode刷题之#657-机器人能否返回原点(Robot Return to Origin)

问题

在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束。

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

注意:机器人“面朝”的方向无关紧要。 “R” 将始终使机器人向右移动一次,“L” 将始终向左移动等。此外,假设每次移动机器人的移动幅度相同。

输入: “UD”

输出: true

解释:机器人向上移动一次,然后向下移动一次。所有动作都具有相同的幅度,因此它最终回到它开始的原点。因此,我们返回 true。

输入: “LL”

输出: false

解释:机器人向左移动两次。它最终位于原点的左侧,距原点有两次 “移动” 的距离。我们返回 false,因为它在移动结束时没有返回原点。

There is a robot starting at position (0, 0), the origin, on a 2D plane. Given a sequence of its moves, judge if this robot ends up at (0, 0) after it completes its moves.

The move sequence is represented by a string, and the character moves[i] represents its ith move. Valid moves are R (right), L (left), U (up), and D (down). If the robot returns to the origin after it finishes all of its moves, return true. Otherwise, return false.

Note: The way that the robot is “facing” is irrelevant. “R” will always make the robot move to the right once, “L” will always make it move left, etc. Also, assume that the magnitude of the robot’s movement is the same for each move.

Input: “UD”

Output: true 

Explanation: The robot moves up once, and then down once. All moves have the same magnitude, so it ended up at the origin where it started. Therefore, we return true.

Input: “LL”

Output: false

Explanation: The robot moves left twice. It ends up two “moves” to the left of the origin. We return false because it is not at the origin at the end of its moves.

示例

public class Program {

    public static void Main(string[] args) {
        var moves = "UD";
        var res = JudgeCircle(moves);
        Console.WriteLine(res);

        moves = "LL";
        res = JudgeCircle2(moves);
        Console.WriteLine(res);

        moves = "ULDR";
        res = JudgeCircle3(moves);
        Console.WriteLine(res);

        moves = "LDURD";
        res = JudgeCircle4(moves);
        Console.WriteLine(res);

        Console.ReadKey();
    }

    private static bool JudgeCircle(string moves) {
        //扫描计数法
        var countL = 0;
        var countR = 0;
        var countU = 0;
        var countD = 0;
        foreach(var move in moves) {
            if(move == 'L') countL++;
            else if(move == 'R') countR++;
            else if(move == 'U') countU++;
            else if(move == 'D') countD++;
        }
        return countL == countR && countU == countD;
    }

    private static bool JudgeCircle2(string moves) {
        //哈希计数法
        var dic = new Dictionary<char, int>() {
            {'L',0},
            {'R',0},
            {'U',0},
            {'D',0}
        };
        foreach(var move in moves) {
            dic[move]++;
        }
        return dic['L'] == dic['R'] && dic['U'] == dic['D'];
    }

    private static bool JudgeCircle3(string moves) {
        //差值计数法
        var diffL = moves.Length - moves.Replace("L", "").Length;
        var diffR = moves.Length - moves.Replace("R", "").Length;
        if(diffL != diffR) return false;
        var diffU = moves.Length - moves.Replace("U", "").Length;
        var diffD = moves.Length - moves.Replace("D", "").Length;
        if(diffU != diffD) return false;
        return true;
    }

    private static bool JudgeCircle4(string moves) {
        //正则计数法
        //若想AC,请手动在 public class Solution { 的上一行
        //添加 using System.Text.RegularExpressions;
        var countL = Regex.Matches(moves, "L").Count;
        var countR = Regex.Matches(moves, "R").Count;
        var countU = Regex.Matches(moves, "U").Count;
        var countD = Regex.Matches(moves, "D").Count;
        return countL == countR && countU == countD;
    }

}

以上给出4种算法实现,以下是这个案例的输出结果:

True
False
True
False

分析:

考虑到部分运行库的使用,以上4种算法的时间复杂度应当均为: O(n) 。

本文由 .Net中文网 原创发布,欢迎大家踊跃转载。

转载请注明本文地址:https://www.byteflying.com/archives/3959

发表评论

登录后才能评论