247. Strobogrammatic Number
Strobogrammatic Number I
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.
From:https://segmentfault.com/a/1190000003787462
翻转后对称的数就那么几个,我们可以根据这个建立一个映射关系:8->8, 0->0, 1->1, 6->9, 9->6
,然后从两边向中间检查对应位置的两个字母是否有映射关系就行了。比如619,先判断6和9是有映射的,然后1和自己又是映射,所以是对称数。
1 public class Solution { 2 public boolean isStrobogrammatic(String num) { 3 for (int i = 0; i <= num.length() / 2; i++) { 4 char a = num.charAt(i); 5 char b = num.charAt(num.length() - 1 - i); 6 if (!isValid(a, b)) { 7 return false; 8 } 9 } 10 return true; 11 } 12 private boolean isValid(char c, char b) { 13 switch (c) { 14 case '1': 15 return b == '1'; 16 case '6': 17 return b == '9'; 18 case '9': 19 return b == '6'; 20 case '8': 21 return b == '8'; 22 case '0': 23 return b == '0'; 24 default: 25 return false; 26 } 27 } 28 }
Strobogrammatic Number II
From: http://www.cnblogs.com/grandyang/p/5200919.html
A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside down).
Find all strobogrammatic numbers that are of length = n.
For example, Given n = 2, return ["11","69","88","96"]
.
这道题是之前那道Strobogrammatic Number的拓展,那道题让我们判断一个数是否是对称数,而这道题让我们找出长度为n的所有的对称数,我们肯定不能一个数一个数的来判断,那样太不高效了,而且OJ肯定也不会答应。题目中给了提示说可以用递归来做,而且提示了递归调用n-2,而不是n-1。我们先来列举一下n为0,1,2,3,4的情况:
n = 0: none
n = 1: 0, 1, 8
n = 2: 11, 69, 88, 96
n = 3: 101, 609, 808, 906, 111, 619, 818, 916, 181, 689, 888, 986
n = 4: 1001, 6009, 8008, 9006, 1111, 6119, 8118, 9116, 1691, 6699, 8698, 9696, 1881, 6889, 8888, 9886, 1961, 6969, 8968, 9966
我们注意观察n=0和n=2,可以发现后者是在前者的基础上,每个数字的左右增加了[1 1], [6 9], [8 8], [9 6],看n=1和n=3更加明显,在0的左右增加[1 1],变成了101, 在0的左右增加[6 9],变成了609, 在0的左右增加[8 8],变成了808, 在0的左右增加[9 6],变成了906, 然后在分别在1和8的左右两边加那四组数,我们实际上是从m=0层开始,一层一层往上加的,需要注意的是当加到了n层的时候,左右两边不能加[0 0],因为0不能出现在两位数及多位数的开头,在中间递归的过程中,需要有在数字左右两边各加上0的那种情况,参见代码如下:
1 class Solution { 2 public List<String> findStrobogrammatic(int n) { 3 return helper(n, n); 4 } 5 6 List<String> helper(int n, int m) { 7 if (n == 0) return new ArrayList<>(Arrays.asList("")); 8 if (n == 1) return new ArrayList<>(Arrays.asList("0", "1", "8")); 9 // we added 2 more digits,that is why n-2 10 List<String> list = helper(n - 2, m); 11 List<String> res = new ArrayList<>(); 12 13 for (int i = 0; i < list.size(); i++) { 14 String s = list.get(i); 15 // 0 cannot be placed at the beginning and ending of the digits 16 if (n != m) res.add("0" + s + "0"); 17 18 res.add("1" + s + "1"); 19 res.add("6" + s + "9"); 20 res.add("8" + s + "8"); 21 res.add("9" + s + "6"); 22 } 23 return res; 24 } 25 }