经过一番考虑,从这题开始暂时不更新我自己认为太简单的题目的博客,为了争取时间。
简单描述一下这个strobogrammatic number转180度的意义,其实就是建立一个表格
1对应1,6对应9(=_=),8对应8,9对应6,0对应0。
所以一个完整的strobogrammatic数字就是第一个数字对应的数字和倒数第一个数字相等,第二个对应的和倒数第二个相等,第三个对应的和倒数第三个相等...如此类推。
所以这一题要列举出来全部,其实就有点类似于穷举递归排列。每个位置是一个递归层,递归到长度的一半就结束(因为另一半就是它表格里对应的数字),这个时候你就会发现一个情况,如果n是一个奇数,那么砍了一半之后会多出来一个中间的数字,那个就需要自对应,也就是表格里对应的数字等于自己的:1,8,0。另外还有一个情况,那就是首字母不能为0,否则就没有意义了。因为没有一个合理的数字是0开头的。。007么?=。=
所以基本就是一个穷举递归外加处理两个特殊情况。给出代码如下:
public List<String> findStrobogrammatic(int n) {
Map<Character, Character> diffMap = new HashMap<>();
char[] selfArr = new char[]{'0', '1', '8'};
diffMap.put('6', '9');
diffMap.put('9', '6');
List<String> result = new LinkedList<String>();
buildResult(0, n, new char[n], selfArr, diffMap, result);
return result;
}
private void buildResult(
int curPos,
int n,
char[] cache,
char[] selfArr,
Map<Character, Character> diffMap,
List<String> result
)
{
if (curPos < (n + 1) / 2) {
for (char c : selfArr) {
if (curPos == 0 && c == '0' && n != 1) continue;
cache[curPos] = cache[n - 1 - curPos] = c;
buildResult(curPos + 1, n, cache, selfArr, diffMap, result);
}
if (n % 2 == 0 || curPos != n / 2) {
for (char c : diffMap.keySet()) {
cache[curPos] = c;
cache[n - 1 - curPos] = diffMap.get(c);
buildResult(curPos + 1, n, cache, selfArr, diffMap, result);
}
}
} else if (n != 0) {
result.add(new String(cache));
}
}
写代码的过程里面自己打了自己脸,确实有数字是可以以0开头的。那就是0自己。。。所以if(curPos == 0 && c == '0')这个判断后面又加了一个n != 1。。。