Problem:

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"].

Analysis:

This problem is easy. It is just a reverse process of checking a Strobogrammatic number. But I have made following mistakes at this process. 

Mistake 1:
Wrongly use return when forking search branch. (This would cause other search branches were ignored!)
if (len != n - 2)
cur = num + cur + num;
else
return; Mistake 2:
Wrongly pass around String's reference, without create a new one.
Usually I use String in following way.
helper (..., cur + 'c', ...)
It works totally fine. But this time, I have used the reference in following way, which is totally wrong!
helper(..., cur, ...) To pass around string reference, we should be very careful. Since it is not primitive type, but it was conveniently used as a primitive type. When we use a string, we actually pass it's reference around.
1. Only when we make a change over it, the instance of the old string was discarded and a new string was created.
2. Only when we use a new reference and use "=" sign to copy the content. If we do not pass the new intance as an argument, many problems could occur! 2.1 get the wrong length of the string. Even the cur was actually changed, we keep on get it's original length 0. Thus there is no stop for this program.
...
searchPath(n, nums, "", 0, ret);
..
private void searchPath(int n, char[] nums, String cur, List<String> ret) {
int len = cur.length();
if (len == n) {
ret.add(cur);
return;
}
...
} Errors:
Overflow 2.2 Get wrong result.
To fix above problem, I have tried to pass around the cur's length. But it actually still wrong!! Wrong solution : (update on the same cur all the time)
public class Solution {
public List<String> findStrobogrammatic(int n) {
if (n < 0)
throw new IllegalArgumentException("n is negative!");
List<String> ret = new ArrayList<String> ();
if (n == 0)
return ret;
char[] nums = {'0', '1', '6', '8', '9'};
if (n % 2 == 1) {
for (char num : nums) {
searchPath(n, nums, num + "", 1, ret);
}
} else{
searchPath(n, nums, "", 0, ret);
}
return ret;
} private void searchPath(int n, char[] nums, String cur, int cur_len, List<String> ret) {
if (cur_len == n) {
ret.add(cur);
return;
}
for (char num : nums) {
if (num == '0') {
if (cur_len != n - 2)
cur = num + cur + num;
else
continue;
} else{
if (num == '9')
cur = '9' + cur + '6';
else if (num == '6')
cur = '6' + cur + '9';
else
cur = num + cur + num;
}
searchPath(n, nums, cur, cur_len+2, ret);
}
}
} Error cases:
Input:
2
Output:
["11","6119","861198","98611986"]
Expected:
["11","69","88","96"] As you can see, the "cur" was passed around all the time. Actually we use the same instance all the time.
Fix method:
String next_cur;
for (char num : nums) {
if (num == '0') {
if (len != n - 2)
next_cur = num + cur + num;
else
continue;
} else{
if (num == '9')
next_cur = '9' + cur + '6';
else if (num == '6')
next_cur = '6' + cur + '9';
else
next_cur = num + cur + num;
}
searchPath(n, nums, next_cur, ret);
} Mistake 3:
Another mistake I have made is that I fail to consider "6" and "9" could not be put in the middle when n is odd.
Error case:
Input:
3
Output:
["101","609","808","906","111","619","818","916","161","669","868","966","181","689","888","986","191","699","898","996"]
Expected:
["101","111","181","609","619","689","808","818","888","906","916","986"]

Solution:

public class Solution {
public List<String> findStrobogrammatic(int n) {
if (n < 0)
throw new IllegalArgumentException("n is negative!");
List<String> ret = new ArrayList<String> ();
if (n == 0)
return ret;
char[] core_num = {'0', '1', '8'};
char[] nums = {'0', '1', '6', '8', '9'};
if (n % 2 == 1) {
for (char num : core_num) {
searchPath(n, nums, num + "", ret);
}
} else{
searchPath(n, nums, "", ret);
}
return ret;
} private void searchPath(int n, char[] nums, String cur, List<String> ret) {
int len = cur.length();
if (len == n) {
ret.add(cur);
return;
}
String next_cur;
for (char num : nums) {
if (num == '0') {
if (len != n - 2)
next_cur = num + cur + num;
else
continue;
} else{
if (num == '9')
next_cur = '9' + cur + '6';
else if (num == '6')
next_cur = '6' + cur + '9';
else
next_cur = num + cur + num;
}
searchPath(n, nums, next_cur, ret);
}
}
}

[LeetCode#247] Strobogrammatic Number II的更多相关文章

  1. [LeetCode] 247. Strobogrammatic Number II 对称数II

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

  2. 247. Strobogrammatic Number II

    题目: A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at ups ...

  3. 247. Strobogrammatic Number II输出所有对称数字

    [抄题]: A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at u ...

  4. [LeetCode] 246. Strobogrammatic Number 对称数

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

  5. [LeetCode] 248. Strobogrammatic Number III 对称数III

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

  6. [LeetCode] 248. Strobogrammatic Number III 对称数之三

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

  7. LeetCode 246. Strobogrammatic Number

    原题链接在这里:https://leetcode.com/problems/strobogrammatic-number/ 题目: A strobogrammatic number is a numb ...

  8. [Locked] Strobogrammatic Number & Strobogrammatic Number II & Strobogrammatic Number III

    Strobogrammatic Number A strobogrammatic number is a number that looks the same when rotated 180 deg ...

  9. LeetCode 137. Single Number II(只出现一次的数字 II)

    LeetCode 137. Single Number II(只出现一次的数字 II)

随机推荐

  1. CentOS 6.5系统上安装MySQL数据库

    1.查看系统是否安装了MySQL      使用命令:      #rpm -qa | grep mysql 2.卸载已安装的MySQL       卸载mysql命令如下:        #rpm ...

  2. js获取时间

    var myDate = new Date(); console.log(myDate.toLocaleString()); function getNowFormatDate() { var dat ...

  3. 【HTTP】Fiddler(一) - Fiddler简介

    1.为什么是Fiddler? 抓包工具有很多,小到最常用的web调试工具firebug,达到通用的强大的抓包工具wireshark.为什么使用fiddler?原因如下: a.Firebug虽然可以抓包 ...

  4. Unity3D 游戏开发应用篇——每日登陆(持久化类实现)

    上一篇中我们实现用本地文件实现了持久化类的保存,当然小型数据用PlayerPrefs存储,或者采用XML服务器持久化也行.因为我涉及的角色类和玩家类数据比较多,加上项目要求尽量少与服务器交互,所以采用 ...

  5. ByteArrary(优化数据存储和数据流)

    原地址:http://www.unity蛮牛.com/blog-1801-799.html 首页 博客 相册 主题 留言板 个人资料   ByteArrary(优化数据存储和数据流) 分类:unity ...

  6. CentOS下使用cmake编译安装mysql

    一.下载安装所必需的依赖包 1.因为高版本mysql都用cmake安装,所以下载cmake wget http://www.cmake.org/files/v3.0/cmake-3.0.1.tar.g ...

  7. 【面试题021】包含min函数的栈

    [面试题021]包含min函数的栈  MinStack.cpp: 1234567891011121314151617181920212223242526272829303132333435363738 ...

  8. substr_replace()函数:将手机号中间4位隐藏为*号

    <?php $mobile = "15810320826"; echo substr_replace($mobile,'****',3 , 4); ?> substr_ ...

  9. DJANGO的requirements的运用

    这里记录一下我现在项目的requirements.pip文件,安装命令为: pip install -r requirements.pip 这样一来,所有依赖,全部搞定. Django== djang ...

  10. hdu 1133 Buy the Ticket

    首先,记50的为0,100的为1. 当m=4,n=3时,其中的非法序列有0110010; 从不合法的1后面开始,0->1,1->0,得到序列式0111101 也就是说,非法序列变为了n-1 ...