Dirección del título:
https://www.lintcode.com/problem/strobogrammatic-number-ii/description
Si es un número, voltéalo igual a sí mismo, entonces este número se llama número estrobogramático. Encuentra todas las longitudes como Número estrobogramático de .
Fácil de saber si es el número estrobogramático, entonces debe ser un número estrobogramático. Y para el caso base, está claro el número estrobogramático tiene solo una cadena vacía , número estrobogramático es . Entonces puedes usar la recursión para resolver. Quiero solicitar una longitud de El número de , primero podemos obtener la longitud como El número de , luego agrega dos números simétricos al centro de la cabeza y la cola, es decir, suma . Como no hay , entonces también necesitamos cambiar se pasa como parámetro, si está comparando número corto, entonces puedes agregar , que es la formación , entonces la longitud es se agrega el número de se agrega el cero inicial. El código es el siguiente:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Solution {
/**
* @param n: the length of strobogrammatic number
* @return: All strobogrammatic numbers
*/
public List<String> findStrobogrammatic(int n) {
// write your code here
return strobog(n, n);
}
// 作用是,返回已知最终要求m位的Strobogrammatic数的情况下,
// 所需要求的所有n位Strobogrammatic数
private List<String> strobog(int n, int m) {
// 如果长度为0或1,这是base case可以直接返回
if (n == 0) {
return new ArrayList<>(Arrays.asList(""));
}
if (n == 1) {
return new ArrayList<>(Arrays.asList("0", "1", "8"));
}
// 接下来先取得长度少了2的Strobogrammatic数
List<String> shorter = strobog(n - 2, n), res = new ArrayList<>();
for (int i = 0; i < shorter.size(); i++) {
String s = shorter.get(i);
// 如果最终要求长度为m的数,而现在正在求的数的长度n比m小,那么前后可以加0,
// 因为在返回到n = m那一层的时候前后是不能加0,否则会造成有开头零,所有这里需要判断一下
if (n < m) {
res.add("0" + s + "0");
}
res.add("1" + s + "1");
res.add("6" + s + "9");
res.add("8" + s + "8");
res.add("9" + s + "6");
}
return res;
}
}
Complejidad de tiempo , complejidad espacial , es la longitud.