【Lintcode】 776. Número estrobogramático II

Dirección del título:

https://www.lintcode.com/problem/strobogrammatic-number-ii/description

Si es un número, voltéalo 180 ° 180 \ grados igual a sí mismo, entonces este número se llama número estrobogramático. Encuentra todas las longitudes como norte norte Número estrobogramático de .

Fácil de saber si s [ 0 0 , . . . , l e n 1 ] p [0, ..., en-1] es el número estrobogramático, entonces s [ 1 , . . . , l e n 2 ] de [1, ..., en-2] debe ser un número estrobogramático. Y para el caso base, está claro n = 0 n = 0 el número estrobogramático tiene solo una cadena vacía ( " " ) ("") n = 1 n = 1 número estrobogramático es ( " 0 " , " 1 " , " 8 " ) ("0", "1", "8") . Entonces puedes usar la recursión para resolver. Quiero solicitar una longitud de n norte El número de , primero podemos obtener la longitud como n 2 n-2 El número de , luego agrega dos números simétricos al centro de la cabeza y la cola, es decir, suma ( 1 , 1 ) , ( 6 , 9 ) , ( 8 , 8 ) , ( 9 , 6 ) (1,1), (6,9), (8,8), (9,6) . Como no hay 0 0 0 , entonces también necesitamos cambiar n norte se pasa como parámetro, si está comparando n norte número corto, entonces puedes agregar 0 0 0 , que es la formación " 0 " + s + " 0 " "0" + s + "0" , entonces la longitud es n norte 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 O ( n 2 n ) O (n2 ^ n) , complejidad espacial O ( n ) O (n) n norte es la longitud.

Publicado 388 artículos originales · me gustaron 0 · 10,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/qq_46105170/article/details/105355879
Recomendado
Clasificación