[LeetCode] Strobogrammatic Number II 对称数之二
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.
Example:
Input: n = 2
Output:["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的那种情况,参见代码如下:
解法一:
class Solution {
public:
vector<string> findStrobogrammatic(int n) {
return find(n, n);
}
vector<string> find(int m, int n) {
if (m == ) return {""};
if (m == ) return {"", "", ""};
vector<string> t = find(m - , n), res;
for (auto a : t) {
if (m != n) res.push_back("" + a + "");
res.push_back("" + a + "");
res.push_back("" + a + "");
res.push_back("" + a + "");
res.push_back("" + a + "");
}
return res;
}
};
这道题还有迭代的解法,感觉也相当的巧妙,需要从奇偶来考虑,奇数赋为 0,1,8,偶数赋为空,如果是奇数,就从 i=3 开始搭建,因为计算 i=3 需要 i=1,而已经初始化了 i=1 的情况,如果是偶数,从 i=2 开始搭建,也已经初始化了 i=0 的情况,所以可以用 for 循环来搭建到 i=n 的情况,思路和递归一样,写法不同而已,参见代码如下:
解法二:
class Solution {
public:
vector<string> findStrobogrammatic(int n) {
vector<string> one{"", "", ""}, two{""}, res = two;
if (n % == ) res = one;
for (int i = (n % ) + ; i <= n; i += ) {
vector<string> t;
for (auto a : res) {
if (i != n) t.push_back("" + a + "");
t.push_back("" + a + "");
t.push_back("" + a + "");
t.push_back("" + a + "");
t.push_back("" + a + "");
}
res = t;
}
return res;
}
};
Github 同步地址:
https://github.com/grandyang/leetcode/issues/247
类似题目:
参考资料:
https://leetcode.com/problems/strobogrammatic-number-ii/
https://leetcode.com/problems/strobogrammatic-number-ii/discuss/67280/AC-clean-Java-solution
LeetCode All in One 题目讲解汇总(持续更新中...)
[LeetCode] Strobogrammatic Number II 对称数之二的更多相关文章
- [LeetCode] 247. Strobogrammatic Number II 对称数II
A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside ...
- [LeetCode] Strobogrammatic Number III 对称数之三
A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside ...
- [LeetCode] Ugly Number II 丑陋数之二
Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...
- [LeetCode] 248. Strobogrammatic Number III 对称数III
A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside ...
- [LeetCode] 248. Strobogrammatic Number III 对称数之三
A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside ...
- LeetCode Strobogrammatic Number II
原题链接在这里:https://leetcode.com/problems/strobogrammatic-number-ii/ 题目: A strobogrammatic number is a n ...
- [LeetCode] 264. Ugly Number II 丑陋数之二
Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...
- [LeetCode] Strobogrammatic Number 对称数
A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside ...
- 246. Strobogrammatic Number 上下对称的数字
[抄题]: A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at u ...
随机推荐
- 微信开发之Ngrok环境准备
一.为什么要使用ngrok? 各位肯定都知道,做微信开发,我们的开发服务器需要和微信服务器做交互,SO,我们需要准备一台放置在公网的服务器,能够使得我们的服务器可以正常访问微信服务器,并且微信服务器也 ...
- 网站实现微信登录之嵌入二维码——基于yii2开发的描述
之前写了一篇yii2获取登录前的页面url地址的文章,然后发现自己对于网站实现微信扫码登录功能的实现不是很熟悉,所以,我会写2-3篇的文章来描述下一个站点如何实现微信扫码登录的功能,来复习下微信扫码登 ...
- NginxWeb服务器安装
1. 安装编译工具和库文件 [root@bigdata-51cdh opt]# yum -y install make zlib zlib-devel gcc-c++ libtool opens ...
- 【转】基于.NET平台常用的框架整理
自从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大开发工具,极小的学习曲线,让我对这个平台产生了浓厚的兴趣,在工作和学习中也积累 了一些开源的组件,就目前想到的先整理于此,如果再想到, ...
- C#写文本日志帮助类(支持多线程)改进版(不适用于ASP.NET程序)
由于iis的自动回收机制,不适用于ASP.NET程序 代码: using System; using System.Collections.Concurrent; using System.Confi ...
- VS2012程序打包部署详解
VS2012没有自带打包工具,所以要先下载并安装一个打包工具.我采用微软提供的打包工具: InstallShield2015LimitedEdition.下载地址:https://msdn.micr ...
- ASP.net MVC 文件下载的几种方法(欢迎讨论)
在ASP.net MVC 中有几种下载文件的方法 前提:要下载的文件必须是在服务器目录中的,至于不在web项目server目录中的文件下载我不知道,但是还挺想了解的. 第一种:最简单的超链接方法,&l ...
- Delphi_07_Delphi_Object_Pascal_基本语法_05_函数参数
这里主要讨论Delphi中函数.方法的相关内容. 一.工程文件 { Delphi语法方法和函数 1.方法 2.函数 } program Routine; {$APPTYPE CONSOLE} uses ...
- TypeSDK总体设计思路和架构
引言:本文旨在提供读者制作一个自己的聚合SDK的思路,抛砖引玉,让更多的读者对聚合SDK有好的理解. 这是最好的时代,这是最坏的时代,这是智慧的时代,这是愚蠢的时代:这是信仰的时期,这是怀疑的时期:这 ...
- Java名字的由来
Java语言的历程丰富多彩,被现在众多程序员和企业广泛使用,不用质疑这是Java的领先技术的结果. Java是Sun公司开发的一种编程语言,Sun公司最初的方向是让Java来开发一些电器装置程序,如: ...