이 (내장 함수 사용하지 않고, return 문으로 함수에 전달 될 때 어떻게 자바 스크립트에서 장소 (또는 장소)의 문자열을 반대합니까 .reverse()
, .charAt()
등)?
답변
간단한 ASCII 문자를 다루고 내장 함수를 사용하는 것이 좋으면 다음과 같이 작동합니다.
function reverse(s){
return s.split("").reverse().join("");
}
UTF-16 또는 기타 멀티 바이트 문자를 지원하는 솔루션이 필요한 경우이 함수는 유효하지 않은 유니 코드 문자열 또는 재미있는 문자열을 제공합니다. 대신이 답변 을 고려할 수 있습니다 .
[… s]는 유니 코드를 인식하고 작은 편집으로 다음을 제공합니다.
function reverse(s){
return [...s].reverse().join("");
}
답변
다음 기술 (또는 이와 유사한 기술)은 일반적으로 JavaScript에서 문자열을 되 돌리는 데 사용됩니다.
// Don’t use this!
var naiveReverse = function(string) {
return string.split('').reverse().join('');
}
실제로 지금까지 게시 된 모든 답변은이 패턴의 변형입니다. 그러나이 솔루션에는 몇 가지 문제가 있습니다. 예를 들면 다음과 같습니다.
naiveReverse('foo ? bar');
// → 'rab �� oof'
// Where did the `?` symbol go? Whoops!
왜 이런 일이 발생하는지 궁금하다면 JavaScript의 내부 문자 인코딩을 읽으십시오 . (TL; DR : ?
은 별표이고 JavaScript는 두 개의 별도 코드 단위로 표시합니다.)
그러나 더 있습니다 :
// To see which symbols are being used here, check:
// http://mothereff.in/js-escapes#1ma%C3%B1ana%20man%CC%83ana
naiveReverse('mañana mañana');
// → 'anãnam anañam'
// Wait, so now the tilde is applied to the `a` instead of the `n`? WAT.
문자열 역 구현을 테스트하기에 좋은 문자열 은 다음과 같습니다 .
'foo ? bar mañana mañana'
왜? 여기에는 별표 ( ?
) ( 자바 스크립트에서 서로 게이트 쌍으로 표시됨)와 결합 표시 ( ñ
마지막으로 mañana
U + 006E LATIN SMALL LETTER N 및 U + 0303 COMBINING TILDE)가 포함되어 있기 때문입니다.
대리 쌍이 나타나는 순서는 되돌릴 수 없습니다. 그렇지 않으면 별표 기호가 ‘역전 된’문자열에 더 이상 표시되지 않습니다. 그렇기 때문에 ��
이전 예제의 출력에서 해당 마크 를 보았습니다 .
결합 마크는 항상 이전 심볼에 적용되므로 주 심볼 (U + 006E 라틴 작은 문자 N)을 결합 마크 (U + 0303 조합 타일)로 전체적으로 취급해야합니다. 순서를 반대로하면 결합 표시가 문자열의 다른 기호와 쌍을 이루게됩니다. 그렇기 때문에 예제 출력이 ã
대신했습니다 ñ
.
바라건대, 이것은 지금까지 게시 된 모든 답변이 잘못된 이유를 설명합니다 .
JavaScript에서 문자열을 올바르게 바꾼 방법에 대한 초기 질문에 답하기 위해 유니 코드를 인식하는 문자열 반전이 가능한 작은 JavaScript 라이브러리를 작성했습니다. 방금 언급 한 문제가 없습니다. 라이브러리는 Esrever 라고 합니다 . 코드는 GitHub에 있으며 거의 모든 JavaScript 환경에서 작동합니다. 쉘 유틸리티 / 바이너리와 함께 제공되므로 원하는 경우 터미널에서 쉽게 문자열을 되돌릴 수 있습니다.
var input = 'foo ? bar mañana mañana';
esrever.reverse(input);
// → 'anañam anañam rab ? oof'
“제자리”부분은 다른 답변을 참조하십시오.
답변
String.prototype.reverse_string=function() {return this.split("").reverse().join("");}
또는
String.prototype.reverse_string = function() {
var s = "";
var i = this.length;
while (i>0) {
s += this.substring(i-1,i);
i--;
}
return s;
}
답변
문자열과 성능 세부 정보를 반전시키는 자세한 분석 및 10 가지 방법.
http://eddmann.com/posts/ten-ways-to-reverse-a-string-in-javascript/
이러한 구현의 성능 :
브라우저 당 최고의 성능 구현
- 크롬 15-묵시 1과 6
- Firefox 7-구현 6
- IE 9-구현 4
- 오페라 12-구현 9
그 구현은 다음과 같습니다.
구현 1 :
function reverse(s) {
var o = '';
for (var i = s.length - 1; i >= 0; i--)
o += s[i];
return o;
}
구현 2 :
function reverse(s) {
var o = [];
for (var i = s.length - 1, j = 0; i >= 0; i--, j++)
o[j] = s[i];
return o.join('');
}
구현 3 :
function reverse(s) {
var o = [];
for (var i = 0, len = s.length; i <= len; i++)
o.push(s.charAt(len - i));
return o.join('');
}
구현 4 :
function reverse(s) {
return s.split('').reverse().join('');
}
구현 5 :
function reverse(s) {
var i = s.length,
o = '';
while (i > 0) {
o += s.substring(i - 1, i);
i--;
}
return o;
}
구현 6 :
function reverse(s) {
for (var i = s.length - 1, o = ''; i >= 0; o += s[i--]) { }
return o;
}
구현 7 :
function reverse(s) {
return (s === '') ? '' : reverse(s.substr(1)) + s.charAt(0);
}
구현 8 :
function reverse(s) {
function rev(s, len, o) {
return (len === 0) ? o : rev(s, --len, (o += s[len]));
};
return rev(s, s.length, '');
}
구현 9 :
function reverse(s) {
s = s.split('');
var len = s.length,
halfIndex = Math.floor(len / 2) - 1,
tmp;
for (var i = 0; i <= halfIndex; i++) {
tmp = s[len - i - 1];
s[len - i - 1] = s[i];
s[i] = tmp;
}
return s.join('');
}
구현 10
function reverse(s) {
if (s.length < 2)
return s;
var halfIndex = Math.ceil(s.length / 2);
return reverse(s.substr(halfIndex)) +
reverse(s.substr(0, halfIndex));
}
답변
“문자열을 뒤집어 놓는 것”전체는 구식 면접 질문 C 프로그래머이며, 그들과 면담 한 사람들 (복수, 아마도?)이 물을 것이다. 불행히도, 거의 모든 관리 언어 (JS, C # 등)의 문자열이 변경 불가능한 문자열을 사용하므로 새 위치를 지정하지 않고 문자열을 이동한다는 전체 아이디어를 무시하기 때문에 더 이상 작동하지 않는 “제자리”부분입니다.
위의 솔루션은 실제로 문자열을 되돌 리지만 더 많은 메모리를 할당하지 않으면 문자열을 뒤집지 않으므로 조건을 만족시키지 않습니다. 할당 된 문자열에 직접 액세스 할 수 있어야하고 원래 메모리 위치를 조작하여 원래 위치로 되돌릴 수 있어야합니다.
개인적으로, 나는 이런 종류의 인터뷰 질문을 정말로 싫어하지만 슬프게도 앞으로 몇 년 동안 계속해서 보게 될 것이라고 확신합니다.
답변
먼저 Array.from()
문자열을 배열로 바꾸고 배열 Array.prototype.reverse()
을 뒤집은 다음 Array.prototype.join()
다시 문자열로 만드는 데 사용하십시오.
const reverse = str => Array.from(str).reverse().join('');
답변
ECMAScript 6에서는 .split('')
split 연산자 를 사용하여 split 메소드 를 사용하지 않고도 문자열을 더 빠르게 되돌릴 수 있습니다 .
var str = [...'racecar'].reverse().join('');