Aqui eu criei um programa para compactação de strings, então para input chars = ["a","a","b","b","c","c","c"] estamos obtendo uma saída como 6 caracteres ["a","2","b","2","c","3"]. Então criei um programa usando a abordagem de array, que também é muito demorada e complexa. Existe alguma solução usando a abordagem de dois ponteiros ou recursão para resolver esse programa com muito pouco código e eficiência? Você pode fornecer isso com um código muito curto? O código é fornecido abaixo.
var compress = function(chars) {
if (!chars.length) {
return 0;
}
let j = 0;
let cur = chars[0];
let counter = 0;
for (let i = 0; i <= chars.length; i++) {
if (chars[i] === cur) {
counter++;
} else {
// Otherwise, add the current character and count to the compressed array
chars[j] = cur;
if (counter > 1) {
const s = counter.toString();
for (let k = 0; k < s.length; k++) {
chars[++j] = s[k];
}
}
j++;
cur = chars[i];
counter = 1;
}
}
return j
};
console.log(compress ('aaaabbc'))//a4b2c
Aqui está a solução usando dois ponteiros. O conceito chave aqui é: NÃO PASSE DUAS VEZES PARA CADA ELEMENTO DA ENTRADA .
Complexidade:
Você pode usar
replace
na entrada e usar uma expressão regular para corresponder a cada ocorrência de uma sequência repetida (de tamanho 2 ou mais). Em seguida, use o argumento de retorno de chamada para substituir pela versão codificada:Observe que se sua entrada tiver dígitos, a saída poderá ser ambígua. Por exemplo, se a saída for "a20", você poderá se perguntar se a entrada foi "aaaaaaaaaaaaaaaaaaaa" ou "aa0".
Um liner: você pode usar
Array::reduce()
:Você poderia iterar os caracteres e pegar duas variáveis para o caractere real e contar. A contagem começa com uma string vazia e finalmente é incrementada para obter um valor de contagem, se o valor for verdadeiro. Caso contrário, apenas o caractere será adicionado à sequência de resultados.
Abordagem de dois ponteiros ligeiramente modificada para evitar incrementos de contador. Eu rotulei as variáveis para que você possa seguir o código facilmente.
Espero que você ache isso útil.