问题描述
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.
思路分析
判断一个string表示的数中心旋转180度后是否是对称的。
有这样性质的数只有0,1,6,8,9。从两头开始判断,先判断是不是这五个数,然后看相对应是否有错。
代码
递归
class Solution {
public:
bool isStrobogrammatic(string num) {
int n = num.length();
for (int i = 0; i < n; i++){
if(num[i] == '0' || num[i] == '1' ||num[i] == '6' ||num[i] == '8' ||num[i] == '9'){
if(num[i] == '0' && num[n - 1 - i] != '0')
return false;
if(num[i] == '1' && num[n - 1 - i] != '1')
return false;
if(num[i] == '6' && num[n - 1 - i] != '9')
return false;
if(num[i] == '8' && num[n - 1 - i] != '8')
return false;
if(num[i] == '9' && num[n - 1 - i] != '6')
return false;
}
else
return false;
}
return true;
}
};
时间复杂度:
O(n)
空间复杂度:
O(1)
反思
挺丑陋的,一大堆if判断,看Discussion可以用hash table,建立数字之间的映射,速度更快,代码更简洁。
class Solution {
public:
bool isStrobogrammatic(string num) {
unordered_map<char, char> map;
map['0'] = '0';
map['1'] = '1';
map['6'] = '9';
map['8'] = '8';
map['9'] = '6';
int i = 0, j = num.length() - 1;
while(i < j){
if (map[num[i]] != num[j])
return false;
i++;
j--;
}
if (i == j)
return num[i] == '0'|| num[i] == '1'|| num[i] == '8';
else
return true;
}
};