246. Strobogrammatic Number (Easy)

A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside down).

Write a function to determine if a number is strobogrammatic. The number is represented as a string.

For example, the numbers "69", "88", and "818" are all strobogrammatic.

Solution 1: Math

这道题定义了一种对称数,就是说一个数字旋转180度和原来一样,也就是倒过来看一样,比如609,倒过来还是609等等,满足这种条件的数字其实没有几个,只有0,1,8,6,9。这道题其实可以看做求回文数的一种特殊情况,我们还是用双指针来检测,那么首尾两个数字如果相等的话,那么只有它们是0,1,8中间的一个才行,如果它们不相等的话,必须一个是6一个是9,或者一个是9一个是6,其他所有情况均返回false,参见代码如下;

version 1: 3ms

bool isStrobogrammatic(string num) {
    int i = 0, j = num.size()-1;
    while (i <= j) {
        switch(num[i]) {
            case '6':
                if (num[j] != '9') return false;
                ++i; --j;
                break;
            case '9':
                if (num[j] != '6') return false;
                ++i; --j;
                break;
            case '0':
                if (num[j] != '0') return false;
                ++i; --j;
                break;
            case '1':
                if (num[j] != '1') return false;
                ++i; --j;
                break;
            case '8':
                if (num[j] != '8') return false;
                ++i; --j;
                break;
            default:
                return false;
        }

    }
    return true;
}

version 2: 0ms

bool isStrobogrammatic(string num) {
        int i = 0, j = num.size()-1;
        while (i <= j) {
            if (num[i] == num[j]) {
                if (num[i] != '0' && num[i] != '1' && num[i] != '8') return false;
            } else {
                if ((num[i] != '6' || num[j] != '9') && (num[i] != '9' && num[j] != '6')) return false;
            }
            ++i; --j;

        }
        return true;
    }

Solution 2: Hash Table

由于满足题意的数字不多,所以我们可以用哈希表来做,把所有符合题意的映射都存入哈希表中,然后双指针扫描,看对应位置的两个数字是否在哈希表里存在映射,若不存在,返回false,遍历完成返回true,参见代码如下:

bool isStrobogrammatic(string num) {
    unordered_map<char, char> m{{'0', '0'}, {'1', '1'}, {'8', '8'}, {'6', '9'}, {'9', '6'}};
    int i = 0, j = num.size()-1;
    while (i <= j) {
        if (m[num[i++]] != num[j--]) return false;
    }
    return true;
}

results matching ""

    No results matching ""