Como você reverte uma string no local (ou no local) no JavaScript quando é passada para uma função com uma instrução de retorno, sem usar funções internas ( .reverse()
, .charAt()
etc.)?
javascript
string
reverse
Kobe
fonte
fonte
Respostas:
Contanto que você esteja lidando com caracteres ASCII simples e esteja feliz em usar funções internas, isso funcionará:
Se você precisar de uma solução que suporte UTF-16 ou outros caracteres de vários bytes, saiba que esta função fornecerá cadeias unicode inválidas ou cadeias válidas que parecerão engraçadas. Você pode considerar esta resposta .
[... s] reconhece Unicode, uma pequena edição fornece: -
fonte
return [...s].reverse().join("");
pode funcionar.A seguinte técnica (ou semelhante) é comumente usada para reverter uma string em JavaScript:
De fato, todas as respostas postadas até agora são uma variação desse padrão. No entanto, existem alguns problemas com esta solução. Por exemplo:
Se você está se perguntando por que isso acontece, leia a codificação interna de caracteres do JavaScript . (TL; DR:
𝌆
é um símbolo astral e o JavaScript o expõe como duas unidades de código separadas.)Mas tem mais:
Uma boa sequência para testar implementações reversas é a seguinte :
Por quê? Porque contém um símbolo astral (
𝌆
) (que é representado por pares substitutos em JavaScript ) e uma marca combinada (ñ
a últimamañana
na verdade consiste em dois símbolos: U + 006E LETRA PEQUENA LATINA N e U + 0303 COMBINING TILDE).A ordem na qual os pares substitutos aparecem não pode ser revertida; caso contrário, o símbolo astral não aparecerá mais na sequência 'invertida'. É por isso que você viu essas
��
marcas na saída do exemplo anterior.As marcas combinadas sempre são aplicadas ao símbolo anterior; portanto, você deve tratar o símbolo principal (U + 006E LETRA PEQUENA N) como a marca combinada (U + 0303 COMBINING TILDE) como um todo. Inverter a ordem fará com que a marca combinada seja emparelhada com outro símbolo na sequência. É por isso que a saída de exemplo teve em
ã
vez deñ
.Felizmente, isso explica por que todas as respostas postadas até agora estão erradas .
Para responder à sua pergunta inicial - como reverter [adequadamente] uma string em JavaScript -, escrevi uma pequena biblioteca JavaScript capaz de reverter seqüências compatíveis com Unicode. Não possui nenhum dos problemas que acabei de mencionar. A biblioteca é chamada Esrever ; seu código está no GitHub e funciona em praticamente qualquer ambiente JavaScript. Ele vem com um utilitário de shell / binário, para que você possa reverter facilmente as strings do seu terminal, se desejar.
Quanto à parte "no local", consulte as outras respostas.
fonte
ou
fonte
Análise detalhada e dez maneiras diferentes de reverter uma string e seus detalhes de desempenho.
http://eddmann.com/posts/ten-ways-to-reverse-a-string-in-javascript/
Desempenho dessas implementações:
Implementações de melhor desempenho por navegador
Aqui estão essas implementações:
Implementação 1:
Implementação 2:
Implementação 3:
Implementação 4:
Implementação 5:
Implementação 6:
Implementação 7:
Implementação 8:
Implementação 9:
Implementação 10
fonte
Todo o "inverter uma seqüência de caracteres no lugar" é uma pergunta de entrevista antiquada programadores C, e as pessoas que foram entrevistadas por eles (por vingança, talvez?), Perguntarão. Infelizmente, é a parte "No Local" que não funciona mais porque as strings em praticamente qualquer linguagem gerenciada (JS, C # etc.) usam sequências imutáveis, derrotando assim toda a idéia de mover uma sequência sem alocar nova memória.
Embora as soluções acima de fato invertam uma string, elas não o fazem sem alocar mais memória e, portanto, não atendem às condições. Você precisa ter acesso direto à string conforme alocado e poder manipular seu local de memória original para poder revertê-la no lugar.
Pessoalmente, eu realmente odeio esse tipo de perguntas para entrevistas, mas, infelizmente, tenho certeza de que continuaremos vendo-as nos próximos anos.
fonte
Primeiro, use
Array.from()
para transformar uma string em uma matriz, depoisArray.prototype.reverse()
inverter a matriz e depoisArray.prototype.join()
transformá-la novamente em uma string.fonte
reverse
lógica pré-existente .string.split('')
não funciona. Veja esta resposta para mais explicações.Array.from('foo 𝌆 bar mañana mañana').reverse().join('') == 'anãnam anañam rab 𝌆 oof'
Array.from('foo 𝌆 bar mañana mañana'.normalize('NFC')).reverse().join('')
se tornará"anañam anañam rab 𝌆 oof"
No ECMAScript 6, você pode reverter uma string ainda mais rapidamente sem usar o
.split('')
método split, com o operador spread assim:fonte
('')
string.split('')
é mais claro para a maioria das pessoas do que[...string]
..split('')
tem o problema de caracteres dos planos suplementares (pares substitutos no UTF-16), porque ele é dividido pela unidade de código UTF-16 em vez do ponto do código . O operador de spread eArray.from()
(minha preferência) não.Parece que estou 3 anos atrasado para a festa ...
Infelizmente você não pode, como foi indicado. Consulte As strings do JavaScript são imutáveis? Preciso de um "construtor de strings" em JavaScript?
A próxima melhor coisa que você pode fazer é criar uma "view" ou "wrapper", que pega uma string e reimplementa quaisquer partes da API de string que você está usando, mas finge que a string está invertida. Por exemplo:
Demo:
O kicker - o seguinte é feito no local por pura matemática, visitando cada personagem apenas uma vez e somente se necessário:
Isso gera uma economia significativa se aplicada a uma cadeia muito grande, se você estiver usando apenas uma fatia relativamente pequena.
Se vale a pena (reverter como uma cópia, como na maioria das linguagens de programação) depende muito do seu caso de uso e da eficiência com que você reimplementa a API de cadeia de caracteres. Por exemplo, se tudo o que você deseja é manipular o índice de cadeias de caracteres ou usar
slice
s ou s pequenossubstr
, isso economizará espaço e tempo. No entanto, se você planeja imprimir grandes fatias ou substratos invertidos, a economia pode ser pequena, ainda pior do que ter feito uma cópia completa. Sua string "invertida" também não terá o tipostring
, embora você possa fingir isso com a criação de protótipos.A implementação de demonstração acima cria um novo objeto do tipo ReversedString. É prototipado e, portanto, bastante eficiente, com trabalho quase mínimo e sobrecarga de espaço mínima (as definições de protótipo são compartilhadas). É uma implementação lenta que envolve fatiamento diferido. Sempre que você executa uma função como
.slice
ou.reversed
, ela executa matemática de índice. Finalmente, quando você extrai dados (chamando implicitamente.toString()
ou.charCodeAt(...)
ou algo assim), aplicará os de uma forma "inteligente", tocando o mínimo de dados possível.Nota: a API da string acima é um exemplo e pode não ser implementada perfeitamente. Você também pode usar apenas 1-2 funções necessárias.
fonte
Existem várias maneiras de reverter uma string em JavaScript. Estou anotando três maneiras que prefiro.
Abordagem 1: Usando a função reversa:
Abordagem 2: Loop através dos personagens:
Abordagem 3: Usando a função de redução:
Eu espero que isso ajude :)
fonte
Durante uma entrevista, me pediram para reverter uma string sem usar variáveis ou métodos nativos. Esta é minha implementação favorita:
fonte
slice
? : - /Array.prototype.reverse()
.Existem várias maneiras de fazer isso, você pode verificar o seguinte,
1. Tradicional para loop (incrementando):
2. Tradicional para loop (decrescente):
3. Usando o loop for-of
4. Usando o método de matriz forEach / high order:
5. Norma ES6:
6. A última maneira:
7. Você também pode obter o resultado usando o seguinte,
fonte
No ES6, você tem mais uma opção
fonte
Esta é a maneira mais fácil que eu acho
fonte
Array.prototype.reverse()
dessa seria a maneira mais fácil, daí a resposta mais popular. Obviamente, isso exigiria um bom conhecimento prévio de JavaScript.OU
// Saída: 'gnirts elpmas'
fonte
[...str]
.Sei que essa é uma pergunta antiga que foi bem respondida, mas, para minha própria diversão, escrevi a seguinte função reversa e pensei em compartilhá-la caso fosse útil para qualquer outra pessoa. Ele lida com pares substitutos e marcas combinadas:
Todas as sugestões para Mathias, Punycode e várias outras referências para me ensinar sobre as complexidades da codificação de caracteres em JavaScript.
fonte
Você não pode porque as strings JS são imutáveis. Solução curta não no local
Mostrar snippet de código
fonte
Se você não quiser usar nenhuma função incorporada. Tente isto
fonte
A resposta real é: você não pode revertê-lo no lugar, mas pode criar uma nova string que é o inverso.
Assim como um exercício para brincar com a recursão: às vezes, quando você vai a uma entrevista, o entrevistador pode perguntar como fazer isso usando a recursão, e eu acho que a "resposta preferida" pode ser "eu preferiria não fazer isso na recursão, pois pode causar facilmente um estouro de pilha "(porque é
O(n)
melhor queO(log n)
. Se forO(log n)
, é muito difícil obter um estouro de pilha - 4 bilhões de itens podem ser manipulados por um nível de pilha de 32, pois 2 ** 32 é 4294967296. Mas se forO(n)
, pode facilmente obter um estouro de pilha.Às vezes, o entrevistador ainda pergunta: "Apenas como exercício, por que você ainda não o escreve usando recursão?" E aqui está:
execução de teste:
resultado:
Para tentar obter um estouro de pilha, mudei
1000
para10000
no Google Chrome e ele relatou:fonte
As cadeias de caracteres são imutáveis, mas você pode criar facilmente uma cópia invertida com o seguinte código:
fonte
fonte
Uma pequena função que lida com caracteres diacríticos e caracteres de 2 bytes:
Atualizar
Uma lista mais completa de combinação de diacríticos é:
fonte
isCombiningDiacritic
função para incluir todos os 316 intervalos; fique à vontade para fornecer essa edição, pois você parece ter os dados disponíveis.fonte
sem converter string em array;
usando Array.reverse sem converter caracteres em pontos de código;
fonte
var c = array[i-1]; array[i-1] = array[i]; array[i] = c;
não requer concatenação do par de códigos. Além disso, o loop for deve começar em 1.'\ud83c\ud83c\udfa5'.reverse()
- ela produzirá o mesmo que a entrada. A adição++i;
naif
instrução deve corrigir isso.'a\u0303bc'.reverse() === 'cba\u0303'
deve retornar verdadeiro.Eu acho que String.prototype.reverse é uma boa maneira de resolver esse problema; o código como abaixo;
fonte
Usando funções Array,
fonte
fonte
Minha própria tentativa original ...
http://jsbin.com/bujiwo/19/edit?js,console,output
fonte
Mantenha-o seco e simples bobo !!
fonte
OK, bem simples, você pode criar uma função com um loop simples para fazer a string inversa sem usar
reverse()
,charAt()
etc , como este:Por exemplo, você tem esta sequência:
Crie uma função como essa, eu chamo de
reverseString
...E você pode chamar assim:
E o resultado será:
fonte
Melhores maneiras de reverter uma string em JavaScript
1) Array.reverse:
Você provavelmente está pensando, espere, pensei que estávamos revertendo uma string, por que você está usando o método Array.reverse. Usando o método String.split, estamos convertendo nossa string em uma matriz de caracteres. Então, estamos revertendo a ordem de cada valor na matriz e, finalmente, convertemos a matriz de volta em uma String usando o método Array.join.
2) Decrementando o loop while:
Embora bem detalhada, esta solução tem vantagens sobre a solução um. Você não está criando uma matriz e apenas concatenando uma sequência com base em caracteres da sequência de origem.
De uma perspectiva de desempenho, esse provavelmente traria os melhores resultados (embora não testado). Para seqüências extremamente longas, os ganhos de desempenho podem cair pela janela.
3) Recursão
Eu amo como esta solução é simples e clara. Você pode ver claramente que os métodos String.charAt e String.substr estão sendo usados para passar por um valor diferente chamando a si próprio todas as vezes até que a string esteja vazia, da qual o ternário retornaria uma string vazia em vez de usar a recursão para chamar a si mesma. . Provavelmente, isso renderia o segundo melhor desempenho após a segunda solução.
fonte