Artigo original: Three Ways to Reverse a String in JavaScript

Este artigo se baseia no script de algoritmos básicos do Free Code Camp chamadoInverter uma string

Inverter uma string é uma das perguntas mais frequentemente feitas sobre JavaScript nas rodadas de entrevistas técnicas. Os entrevistadores podem pedire que você escreva maneiras diferentes de inverter uma string, pedir que você inverta uma string sem usar os métodos integrados ou ainda pedir que você inverta uma string usando recursão.

Há dezenas de maneiras em potencial de se fazer isso, que não incluem a função integrada reverse, já que o JavaScript não tem essa função.

Abaixo estão as três formas mais interessantes de resolver o problema de inverter uma string em JavaScript.

Desafio do algoritmo

Inverta a string fornecida.
Você pode ter que transformar a string em um array antes de poder inverter.
Seu resultado deve ser uma string.
function reverseString(str) {
    return str;
}
reverseString("hello");

Casos de teste fornecidos

  • reverseString(“hello”) deve retornar a string “olleh”
  • reverseString(“Howdy”) deve retornar a string “ydwoH”
  • reverseString(“Greetings from Earth”) deve retornar a string “htraE morf sgniteerG”

1. Inverter uma string com funções integradas

Para esta solução, usaremos três métodos: o método String.prototype.split() method, o método Array.prototype.reverse() e o método Array.prototype.join().

  • O método split() divide um objeto de string em um array de string separando a string em substrings.
  • O método reverse() inverte um array diretamente. O primeiro elemento do array passa a ser o último e o último se torna o primeiro.
  • O método join() une todos os elementos de um array em uma string.
function reverseString(str) {
    // Passo 1. Use o método split() para retornar um novo array
    var splitString = str.split(""); // var splitString = "hello".split("");
    // ["h", "e", "l", "l", "o"]
 
    // Passo 2. Use o método reverse() para inverter o array recém-criado
    var reverseArray = splitString.reverse(); // var reverseArray = ["h", "e", "l", "l", "o"].reverse();
    // ["o", "l", "l", "e", "h"]
 
    // Passo 3. Use o método join() para unir todos os elementos do array em uma string
    var joinArray = reverseArray.join(""); // var joinArray = ["o", "l", "l", "e", "h"].join("");
    // "olleh"
    
    // Passo 4. Retorne a string invertida
    return joinArray; // "olleh"
}
 
reverseString("hello");

Unindo os três métodos em uma única declaração:

function reverseString(str) {
    return str.split("").reverse().join("");
}
reverseString("hello");

2. Inverter uma string com um laço for por decremento

function reverseString(str) {
    // Passo 1. Crie uma string vazia que vai receber a nova string criada
    var newString = "";
 
    // Step 2. Crie o laço FOR
    /* O ponto inicial do laço será (str.length - 1), que corresponde ao 
       último caractere da string, "o"
       Enquanto i for maior ou igual a 0, o laço continuará
       Decrementamos i após cada iteração */
    for (var i = str.length - 1; i >= 0; i--) { 
        newString += str[i]; // ou newString = newString + str[i];
    }
    /* Aqui, hello's length é igual a 5
        Para cada iteração: i = str.length - 1 e newString = newString + str[i]
        Primeira iteração:    i = 5 - 1 = 4,         newString = "" + "o" = "o"
        Segunda iteração:   i = 4 - 1 = 3,         newString = "o" + "l" = "ol"
        Terceira iteração:    i = 3 - 1 = 2,         newString = "ol" + "l" = "oll"
        Quarta iteração:   i = 2 - 1 = 1,         newString = "oll" + "e" = "olle"
        Quinta iteração:    i = 1 - 1 = 0,         newString = "olle" + "h" = "olleh"
    Fim do laço FOR*/
 
    // Passo 3. Retorne a string invertida
    return newString; // "olleh"
}
 
reverseString('hello');

Sem comentários:

function reverseString(str) {
    var newString = "";
    for (var i = str.length - 1; i >= 0; i--) {
        newString += str[i];
    }
    return newString;
}
reverseString('hello');

3. Inverter uma string com recursão

Para esta solução, usaremos dois métodos: o método String.prototype.substr() e o método String.prototype.charAt().

  • O método substr() retorna os caracteres em uma string começando da localização especificada pelo número especificado de caracteres.
"hello".substr(1); // "ello"
  • O método charAt() retorna o caractere especificado de uma string.
"hello".charAt(0); // "h"

A profundidade da recursão é igual ao tamanho da string. Esta solução não é a melhor e será muito lenta se a string for muito longa. O tamanho da pilha (ou stack) será um problema a considerar.

function reverseString(str) {
  if (str === "") // Este é o caso terminal que encerrará a recursão
    return "";
  
  else
    return reverseString(str.substr(1)) + str.charAt(0);
/* 
Primeira parte do método de recursão
Lembre-se de que não fará apenas uma chamada, mas diversas chamadas aninhadas

Cada chamada: str === "?"        	                  reverseString(str.subst(1))     + str.charAt(0)
1ª chamada – reverseString("Hello")   retornará   reverseString("ello")           + "h"
2ª chamada – reverseString("ello")    retornará   reverseString("llo")            + "e"
3ª chamada – reverseString("llo")     retornará   reverseString("lo")             + "l"
4ª chamada – reverseString("lo")      retornará   reverseString("o")              + "l"
5ª chamada – reverseString("o")       retornará   reverseString("")               + "o"

Segunda parte do método de recursão
O método chega na condição expressa pelo if e a chamada aninhada mais acima é retornada imediatamente

A 5ª chamada retornará reverseString("") + "o" = "o"
A 4ª chamada retornará reverseString("o") + "l" = "o" + "l"
A 3ª chamada retornará reverseString("lo") + "l" = "o" + "l" + "l"
A 2ª chamada retornará reverserString("llo") + "e" = "o" + "l" + "l" + "e"
A 1ª chamada retornará reverserString("ello") + "h" = "o" + "l" + "l" + "e" + "h" 
*/
}
reverseString("hello");

Sem comentários:

function reverseString(str) {
  if (str === "")
    return "";
  else
    return reverseString(str.substr(1)) + str.charAt(0);
}
reverseString("hello");

Operador condicional (ternário):

function reverseString(str) {
  return (str === '') ? '' : reverseString(str.substr(1)) + str.charAt(0);
}
reverseString("hello");

Inverter uma string em JavaScript é um algoritmo pequeno e simples que pode ser solicitado em uma triagem técnica por telefone ou em uma entrevista técnica. Você pode seguir o caminho mais curto na resolução deste problema, ou ainda utilizar a abordagem de resolver a questão usando recursão ou soluções ainda mais complexas.

Espero que você tenha achado este artigo útil. Ele é parte de uma série de artigos chamada, no original em inglês, de “How to Solve FCC Algorithms” (Como resolver os algoritmos do freeCodeCamp), onde a autora propõe diversas soluções e explica o passo a passo do que acontece por debaixo dos panos (todos os textos abaixo, de momento, ainda se encontram em inglês).

Three ways to repeat a string in JavaScript (Três formas de repetir uma string em JavaScript)
Neste artigo, a autora explica como resolver o desafio “Repetir uma string Repetir uma string” do freeCodeCamp. Isso envolve

Two ways to confirm the ending of a String in JavaScript (Duas formas de confirmar o final de uma string em JavaScript)
Neste artigo, a autora explica como resolver o desafio Confirmar o finaldo freeCodeCamp.

Three Ways to Factorialize a Number in JavaScript (Três formas de fazer o fatorial de um número em JavaScript)
Este artigo é baseado no desafio Fatorar um númerodo freeCodeCamp.

Two Ways to Check for Palindromes in JavaScript (Duas formas de verificar palíndromos em JavaScript)
Este artigo é baseado no script de algoritmos básicos Verificador de palíndromos do freeCodeCamp.

Three Ways to Find the Longest Word in a String in JavaScript (Três formas de encontrar a palavra mais longa em uma string em JavaScript)
Este artigo é baseado no script de algoritmos básicos Encontrar a palavra mais longa em uma string do freeCodeCamp.

Three Ways to Title Case a Sentence in JavaScript (Três formas de capitalizar o título de uma frase)
Este artigo é baseado no script de algoritmos básicos Capitalizar o título de uma frase do freeCodeCamp.

Se você tiver sua própria solução ou alguma sugestão, compartilhe-as abaixo, nos comentários.

Além disso, você pode seguir a autora no Medium, no Twitter, no Github e no LinkedIn.

Recursos