编程提高班3:Judge Route Circle

Initially, there is a Robot at position (0, 0). Given a sequence of its moves, judge if this robot makes a circle, which means it moves back to the original place.

The move sequence is represented by a string. And each move is represent by a character. The valid robot moves areR (Right),L (Left),U (Up) and D (down). The output should be true or false representing whether the robot makes a circle.

Example 1:

Input: “UD”
Output: true

Example 2:

Input: “LL”
Output: false

基础解法

class Solution {
public:
    bool judgeCircle(string moves) {
         map<char,int>mapWay;
        mapWay['R']=1;
        mapWay['L']=-1;
        mapWay['U']=1;
        mapWay['D']=-1;
        int coutRL=0;
        int coutUD=0;
        for_each(begin(moves),end(moves),[mapWay,&coutRL,&coutUD](char a){
           if(a=='R' or a=='L') {
               coutRL += mapWay.find(a)->second;
           }
            else {coutUD+=mapWay.find(a)->second;
           }
        });
        if(coutRL==0 and coutUD==0)return true;
        else return false;
    }
};

这道题也没什么难点,我使用的方法是利用键值对,将L和R设置为1和-1,U和D设置为1和-1。
对整个字符串的判断就是查看左右方向的计数器和上下方向的计数器是否为0。

高级解法

class Solution {
public:
    bool judgeCircle(string moves) {
        int v = 0;
        int h = 0;
        for (char ch : moves) {
            switch (ch) {
                case 'U' : v++; break;
                case 'D' : v--; break;
                case 'R' : h++; break;
                case 'L' : h--; break;
            }
        }
        return v == 0 && h == 0;
    }
};

对应于for:

这里的for利用了c++11新特性,相比于for_each,它更加容易理解。

对应于switch:

switch…case与if…else的根本区别在于,switch…case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。
从而,switch…case不用像if…else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。
具体地说,switch…case会生成一份大小(表项数)为最大case常量+1的跳表,程序首先判断switch变量是否大于最大case 常量,若大于,则跳到default分支处理;否则取得索引号为switch变量大小的跳表项的地址(即跳表的起始地址+表项大小*索引号),程序接着跳到此地址执行,到此完成了分支的跳转。

总结

虽然普通解法看起来高大尚不少,用到了很多新特性,但高级解法似乎更有说服力,它更简洁易懂,效率也更高。
而这一次,能让大家更清楚的认识到,switch确实要比if快,而且更好理解。

    原文作者:调侃熊
    原文地址: https://www.jianshu.com/p/8471fe4eb3a8
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞