LC402. Mover K dígitos

Mover K dígitos


Descripción del problema:
  dado un número entero no negativo representado por una cadena, elimine el número de k dígitos de este número para que el número restante sea el más pequeño.

Nota:

La longitud de num es menor que 10002 y ≥ k.
num no contendrá ceros a la izquierda.

Ejemplo 1:

Entrada: num = "1432219", k = 3
Salida: "1219"
Explicación: Quite los tres números 4, 3 y 2 para formar un nuevo número más pequeño 1219.

Ejemplo 2

Entrada: num = "10200", k = 1
Salida: "200"
Explicación: Elimine el primer 1 y el número restante es 200. Tenga en cuenta que la salida no puede tener ceros a la izquierda.

Ejemplo 3

Entrada: num = "10", k = 2
Salida: "0"
Explicación: Elimine todos los dígitos de los dígitos originales y deje el resto en blanco para que sea cero.


Idea de resolución de problemas 1:

1. Estrategia codiciosa.

2. La pregunta requiere la eliminación de los números K. Mi método es extraer los números num.size () -k en el rango apropiado, porque no puedes hacerlo con avaricia si lo eliminas. Ninguna de las respuestas es correcta.

1432219 Eliminar el más grande: 1221; eliminar el más pequeño: 4329 (más incorrecto).

3. ¿Cuál es el rango apropiado? Por ejemplo: num = "1432219", k = 3; es encontrar 7-3, 4 números. La primera vez que tiene que buscarlo desde 1432, los siguientes tres de 219 no se pueden mover, porque ha encontrado uno, debe asegurarse de que haya tres y tener suficientes cuatro.

4. La clave es cómo tratarlo después de encontrarlo. Como se muestra a continuación: 1432, después de encontrar 1, guarde 1 e intercepte el número después de 1: 432219.

5. Busque e intercepte en el rango apropiado, y finalmente puede obtener la respuesta correcta, pero la complejidad del tiempo y la complejidad del espacio son demasiado altas.

El código es el siguiente 1:

string removeKdigits(string num, int k) {
        if(num.size()<=k){//长度小于等于k则直接返回“0”
            return "0";
        }
        string s;
        k=num.size()-k;
        while(k--){//选取num.size()-k个
            char ch='9';
            int n=0;//位置,方便截取
            for(int i=0;i<num.size()-k;i++){//合适的范围
            if(num[i]<ch){//寻找最小
                ch=num[i];
                n=i;
            }
      	  }
      	    num=num.substr(n+1);//截取
            s+=ch;//加上
        }
        int i=0;
		while(s[i]=='0'){//开头的清零
			i++;
		}
		s=s.substr(i);
        if(s.size()==0){//清完0可能位空,所以这里要返回0
            return "0";
        }
        return s;
    }

Solución 2:

1. El método anterior, seleccione el más pequeño en el rango apropiado y luego extraiga, puede usar la pila para mejorar la eficiencia.

2. Haga un bucle para juzgar cada carácter de num y determine si el elemento en la parte superior de la pila es más grande que el carácter. Si lo es, saldrá de la pila.

3. Tenga en cuenta que la pila se elimina en el problema, y ​​la pila es una vez k–, por lo que la cadena no se ordenará de pequeña a grande, dependiendo de si k es lo suficientemente grande. Cuando se usa el número de k, se consideran los siguientes caracteres No hay forma de salir de la pila si los personajes en la parte superior de la pila son pequeños.

4. Hay un caso especial de uso de la pila, es decir, las cadenas se han ordenado, por ejemplo: num = "123456789", k = 3, entonces no hay forma de reventar la pila, la cadena que obtenemos es demasiado larga, por lo que Para determinar si la longitud de la cadena es demasiado larga, si es demasiado larga, elimine los siguientes k caracteres, "123456789", elimine los últimos 3 y deje "123456", el más pequeño.

5. Debe sacar la cadena y luego invertir el orden para usar la pila. Debido a que sale primero, por supuesto, también debe determinar si el bit más alto es 0 y si es todo 0.

El código es el siguiente 2:

string removeKdigits(string num, int k) {
        if(num.size()<=k){//长度小于等于k则直接返回“0”
            return "0";
        }
        stack<char>s;
        s.push(num[0]);
        for(int i=1;i<num.size();i++){
        	 while(!s.empty()&&k!=0&&s.top()>num[i]){
        	 //栈空或者k的次数用完了或者栈顶最小则不用进入while
        	 	s.pop();//出栈
        	 	k--;//次数减一
			 }
			 s.push(num[i]);
		}
		string ss;
		while(!s.empty()){//提取字符
			ss+=s.top();
			s.pop();
		}
		reverse(ss.begin(),ss.end());//逆序
		int i=0;
		while(ss[i]=='0'){//跳过最高位为0
			i++;
		}
		ss=ss.substr(i);
		if(ss.size()==0){//全为0
			return "0";
		}
		if(ss.size()>n){//长度过长
			return ss.substr(0,n);
		}
		return ss;
    }
14 artículos originales publicados · Me gusta 10 · Visitantes más de 10,000

Supongo que te gusta

Origin blog.csdn.net/Milan_1in/article/details/105544984
Recomendado
Clasificación