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. Opencv图像与矩阵的操作

    #include "stdafx.h" #include <cv.h> #include <cxcore.h> #include <highgui.h ...

  2. html5游戏引擎-Pharse.js学习笔记(一)

    1.前言 前几天随着flappy bird这样的小游戏的火爆,使我这种也曾了解过html5技术的js业余爱好者也开始关注游戏开发.研究过两个个比较成熟的html5游戏引擎,感觉用引擎还是要方便一些.所 ...

  3. 工程移除CocoaPods依赖库

    http://zanderzhang.gitcafe.io/2015/09/26/工程移除CocoaPods依赖库/ 点这里--->CocoaPods安装和使用教程 当我们工程安装很多第三方开源 ...

  4. 《Dive into Python》Chapter 2 and Chapter 3 笔记

    Example 2.1. odbchelper.py def buildConnectionString(params): """Build a connection s ...

  5. 2433: [Noi2011]智能车比赛 - BZOJ

    Description 新一届智能车大赛在JL大学开始啦!比赛赛道可以看作是由n个矩形区域拼接而成(如下图所示),每个矩形的边都平行于坐标轴,第i个矩形区域的左下角和右上角坐标分别为(xi,1,yi, ...

  6. SQL SERVER开窗函数

    作为一名开发人员来讲,我感觉在职场白混了好多年,可能是自己真的没有进取的精神吧,看了<程序员的SQL金典>这本电子书,真的让我学到了不少知识,真心喜欢这本电子书,书中讲解的内容比较好懂,也 ...

  7. 【AutoMapper】实体类间自动实现映射关系,及其转换。

    官方项目下载: http://automapper.codeplex.com/ 博文 http://www.iteye.com/blogs/tag/AutoMapper 图解: 第一步:创建映射Map ...

  8. Gitlab安装和使用相关信息

    Gitlab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目.它拥有与Github类似的功能,能够浏览源代码,管理 ...

  9. Android SDK下载地址

    原地址:http://lameck.blog.163.com/blog/static/38811374201262111309677/ Android SDK.ADT.tools等官方下载地址(201 ...

  10. POJ 2379 ACM Rank Table(排序)

    题很水,数据注意一下四点即可: 1.有些team会在一道题AC了之后还提交,这个时候只需要算第一次ac的时间以及这之前的wa,之后的全部忽略.2.如果一道题没有ac,那么在计算时间时不应该加上它的wa ...