나는 그것이 가장 지루한 일이었다 생각 Toolz.dev 에 문자열 역방향 도구를 발송 I'd 는 모든 달 빌드. It's split('').reverse().join('')니다. 무엇이 잘못 될 수 있습니다. 그런 다음 샘플 텍스트 I & #39;d 를 붙여 넣습니다 - 어떤,귀엽게 느껴졌기 때문에, "로 끝났다유니코드: 你好世界 OME≡" - 그리고 출력은 두 개의 이모티콘이 왜곡 된 상자로 바뀌면서 돌아 왔습니다. 🌍🚀 되었다 \ude80🜍\ud83c니다. 한자가 완벽하게 반전되었습니다. 이모티콘이 산산조각이 났습니다.
그 5 분 놀라움은 실제로 문자열을 반전하는 것에 대해 가르 칠 수있는 가장 유용한 것이므로이 전체 가이드는 그 주위에 구축됩니다. 텍스트 반전은 사소한 것처럼 들리며 일반 ASCII 의 경우 이모티콘,플래그 또는 특정 악센트 문자를 소개하는 순간 "string" 를 반전 시키십시오; 하나의 명백한 답을 갖는 것을 멈 춥니 다 - 그리고이 도구를 포함한 대부분의 도구는 조용히 그들을 깨뜨리는 답을 선택합니다.
X-1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 문자열 반전 도구는 한 가지 일을 합니다: 입력할 때 문자를 즉시 반전시킵니다. 구성할 모드도 없고 가입도 없으며 텍스트가 브라우저에서 절대 나오지 않습니다. 정확히 무엇을 하는지,어디서 깨지는지,텍스트를 반전시키는 방법을 보여드리겠습니다 올바르게 진짜 부호에서 파손 isn't 수락가능할 때.
TL;DR: 텍스트를 붙여넣습니다 문자열 반전 그리고 그것은 문자 순서를 뒤집어 라이브 -
Hello된다olleH. It's 는 단일 문자 반전 모드 (별도의 단어 또는 줄 모드 없음) 이며 입력할 때 자동 업데이트되며 결과를 복사하거나 다운로드할 수 있습니다. It's 는 회문 검사,빠른 퍼즐 및 인터뷰 답변 확인에 적합합니다. 헤드업: 일반 JavaScript 와 같습니다split('')는,에모티콘을 끊고 코드 단위로 분할하기 때문에 플래그를 지정합니다. 일반 텍스트와 CJK 역방향 미세. 와 쌍을 이룹니다 케이스 변환기 또는 워드 카운터 빠른 텍스트 작업을 위해.
문자열 역방향 도구는 실제로 무엇을합니까?
정확히 하나의 연산: 문자의 순서를 뒤집습니다. 마지막 문자가 첫 번째가 되는 식입니다.
입력: Hello World
출력: dlroW olleH
후드 아래 논리는 진정으로 한 줄입니다 - 같은 줄 you'd 는 자바 스크립트 인터뷰에서 쓰기:
text.split('').reverse().join('')
There's no "reverse words" or "reverse lines" 메뉴에 숨기는 모드. 이 페이지의 이전 초안에서는 문자,단어, 문장 및 줄 모드를 설명했습니다; 그것은 실제가 아니라 열망적이었습니다. 도구는 문자를 반전시킵니다. 마침표를 입력하면 자동으로 업데이트되므로 반전된 결과가 실시간으로 표시되며 입력과 출력 모두의 문자와 줄 수를 제공합니다. 텍스트를 붙여넣고,텍스트 파일을 업로드하고,URL 에서 로드한 다음,결과를 복사하거나 a 로 다운로드할 수 있습니다 .txt.
특별히 단어 순서 반전을 원하는 경우(Hello World → World Hello), you'd를 사용하여 코드에서 수행합니다 split(' ').reverse().join(' ')- I'll은 아래의 스니펫을 보여줍니다.
왜 이모티콘은 뒤집으면 깨지는가?
이것은 버그의 전체 클래스를 설명하기 때문에 이해할 가치가 있는 부분입니다.
자바스크립트 문자열은 UTF-16 의 시퀀스이다 코드 단위"characters"가 아니라 인간의 의미에서. 대부분의 일상 문자 - 영문,숫자, 구두점,심지어 중국어,일본어, 한국어 문자 - 는 단일 16 비트 코드 단위에 들어맞습니다. 그래서 split('') 그들 사이의 절단 깨끗하고 역전 작품:
'你好世界'.split('').reverse().join('') // → '界世好你' ✅
하지만 이모티콘, 플래그 시퀀스 및 일부 기호는 라이브입니다 바깥 해당 범위는 다음과 같이 저장됩니다 대리 쌍- 함께 있는 것을 의미하는 두 개의 코드 단위입니다. split('') 행복하게 그들을 반으로 자르고, 반전하면 반쪽이 말도 안되는 것으로 섞인다:
'AB🌍🚀'.split('').reverse().join('') // → mojibake, the emoji shatter ❌
결합 표시는 다른 함정입니다. 악센트가있는 문자는 두 가지 방법으로 저장할 수 있습니다: 하나의 미리 구성된 코드 포인트로 (é) 또는 기본 문자와 별도의 결합 악센트()로 사용됩니다e + .́). 미리 구성된 버전은 잘 반전됩니다. 분해된 버전은 악센트를 분리하여 반전 후 잘못된 문자에 떠내려갑니다.
따라서 이 도구의 정직한 규칙은 다음과 같습니다: 일반 텍스트, 숫자, 구두점 및 CJK가 올바르게 반전됨; 이모티콘, 플래그 이모티콘 및 분해된 악센트가 끊어집니다. That's Toolz.dev 에 고유한 결함이 아닙니다 - it's what split('') 어디서나 할,그리고 많은 "reverse string" 사이트가 동일하게 동작합니다. 나는 순진한 버전을 의도적으로 그대로 두었습니다. 왜냐하면 it's 가 빠르고 투명하며 대부분의 사람들이 "reverse this,"라고 말할 때 의미하는 것과 일치하기 때문입니다. 그러나 당신은 가장자리를 알 자격이 있습니다.
코드에서 문자열을 올바르게 역전시키려면 어떻게 해야 합니까?
만약 you're 실제 코드와 유니코드를 작성 중요, here's 순진한에서 수정에 사다리.
레벨 1 - 순진함(도구가 수행하는 작업): 이모티콘을 깨뜨립니다.
str.split('').reverse().join('')
레벨 2 - 스프레드 연산자: 코드로 반복합니다 포인트그래서 대부분의 이모티콘을 그대로 유지합니다(대리 쌍은 함께 유지됩니다). 여전히 분해된 결합 표시와 플래그와 같은 다중 이모티콘 시퀀스를 깨뜨립니다.
[...str].reverse().join('')
레벨 3 - 문자소 인식: treat each "user-perceived character" as atomic. 이것이 진정으로 올바른 접근법입니다.
const seg = new Intl.Segmenter('en', { granularity: 'grapheme' });
[...seg.segment(str)].map(s => s.segment).reverse().join('');
Intl.Segmenter 이모티콘, 플래그, 스킨 톤 수정자 및 결합 표시를 적절하게 처리합니다. It's 버전 I'd는 이모티콘으로 사용자 텍스트를 되돌리는 것이 실제 요구 사항인 경우 프로덕션에서 배송됩니다.
Here's 면접 연습과 참고를 위한 언어 전반에 걸친 동일한 작업:
# Python — [::-1] works by code point, similar to JS spread
reversed_str = original[::-1]
words_reversed = ' '.join(original.split()[::-1])
// Java — StringBuilder.reverse() is code-unit based (same emoji caveat)
String reversed = new StringBuilder(original).reverse().toString();
// Go — []rune iterates by code point, safer than byte reversal
runes := []rune(original)
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
reversed := string(runes)
// PHP — strrev() is byte-based and mangles any multi-byte UTF-8
$reversed = strrev($original); // breaks UTF-8
패턴을 주목하십시오: 거의 모든 language's "obvious" reverse 는 코드 단위 또는 바이트 기반이며 동일한 유니코드 약점을 공유합니다. grapheme-aware 옵션에 대한 도달은 기본값이 아닌 예외입니다.
문자열 반전이 실제로 좋은 것은 무엇입니까?
정식 인터뷰 워밍업을 넘어 몇 군데에서 유지되고 있습니다.
회문 점검. 문자열을 반전하고 원본과 비교 - 그들이 일치하는 경우, it's 회문. 시도 racecar, level, 또는 12321 도구에서와 출력이 동일하게 돌아 오는 시계. " 같은 문구 회문의 경우;A man a plan a canal Panama, " 스트립 공간과 케이스 먼저.
자신의 코드를 검증하는 것. 때 you're 연삭 LeetCode 스타일의 반전 문제,예상 출력을 도구에 붙여넣어 sanity-check it in a second. It's a fast oracle for the character-reversal case.
빠른 퍼즐과 장난스러운 텍스트. 역방향 메시지, 단어 게임, mirror-y 소셜 게시물 - 낮은 지분, 그리고 반전은 자신의 역, 그래서 두 번 반전하면 원래 다시 제공합니다. 그 속성은 테스트에 편리합니다: 역, 다시 역, 당신을 확인're 홈.
한 가지 아닙니다 그것을 위해 사용하십시오: 보안. 반전은 암호화가 아닌 파티 트릭입니다 - it's 사소하게 취소되었습니다. 그것은 초보자 "obfuscation" 튜토리얼에 표시되지만 반전 된 텍스트를 보호 된 것으로 취급하지 않습니다.
| 반전 유형 | 예 | 도구에? | 코드 조각 |
|---|---|---|---|
| 캐릭터 | abc → cba |
예 (유일한 모드) | [...s].reverse().join('') |
| 단어 | a b c → c b a |
아니 - 코드로 해 | s.split(' ').reverse().join(' ') |
| 라인 | 선 순서가 뒤집혔습니다 | 아니 - 코드로 해 | s.split('\n').reverse().join('\n') |
| 포도주로부터 안전한 | 이모티콘 그대로 유지 | 아니요 - Intl.Segmenter가 필요합니다 | 위의 레벨 3을 참조하세요 |
2점 접근 방식, if you're 인터뷰 준비 중
면접관이이 질문을 사랑하는 이유는 우아한 대답 doesn # 39;t 는 내장 된 역방향을 전혀 사용합니다. 당신은 서로를 향해 두 개의 포인터를 걸어 교환:
Original: H E L L O
i j swap H and O
O E L L H
i j swap E and L
O L L E H
ij pointers meet — done
그것은 O (n) 시간에 실행하고,변경 가능한 배열에 장소에서 완료,O (1) 여분의 공간. 자바 스크립트 문자열은 당신이 할 수 있도록 불변입니다't 말 그대로 장소에서 교환,하지만 두 포인터 로직은 그들이 무엇're 당신이 이해 확인. 재귀 버전 - reverse(s) = last char + reverse(rest)- 는 더 예쁘지만 인터뷰에서 큰 소리로 언급할 가치가 있는 절충안인 O(n) 호출 스택 공간을 사용합니다.
그리고 테스트를 사소한 것으로 만드는 속성을 기억하십시오: reversal 은 그 자체의 역입니다. 문자열을 두 번 반전 시키면 you're back where you started. 내가 어떤 반전 코드라도 unit-test 할 때 that's assertion number one: reverse(reverse(x)) === x 특히 이모티콘을 포함한 입력 배치의 경우 테스트에서는 실제로 대리 쌍 버그를 숨기는 대신 포착합니다.
자주 묻는 질문
문자열 역방향 도구는 단어 또는 줄 반전을 지원합니까?
아니오. 그것은 특성을 반전하는 단 하나 형태를 비치하고 있습니다. There's 는 따로따로 낱말 순서 또는 선 순서 형태를 아닙니다. 당신이 낱말 또는 선의 순서를 반전할 필요가 있는 경우에,코드로 그것을 하십시오 split(' ') 또는 split('\n') 그 뒤를 이어 .reverse().join(...).
반전 후 왜 이모티콘이 왜곡되어 나오나요?
왜냐하면 도구는 JavaScript's 처럼 UTF-16 코드 단위로 반전되기 때문입니다 split(''). 이모티콘과 플래그 시퀀스는 서로 의미가 있는 두 코드 단위인 대리 쌍으로 저장되며 반전하면 서로 분리됩니다. 일반 텍스트와 CJK 문자는 단일 코드 단위이므로 올바르게 반전됩니다.
유니코드 및 CJK 텍스트를 처리합니까?
부분적으로. 중국어,일본어, 한국어,키릴 문자,미리 구성된 악센트 문자는 각각 단일 코드 단위이기 때문에 올바르게 반전됩니다. 이모티콘,플래그 이모티콘 및 분해된 결합 표시가 깨집니다. 자신의 코드에서 완전히 올바른 처리를 위해서는 다음을 사용하십시오 Intl.Segmenter 자소 세분성으로.
내 텍스트가 서버로 전송됩니까?
아니요. 입력할 때 브라우저에서 로컬로 반전이 발생합니다. 텍스트는 업로드되지 않습니다. 따라서 민감한 문자열이나 개인 문자열을 반전시키는 것이 안전합니다.
단어가 회문인지 어떻게 확인하나요?
로 역전시키세요 문자열 반전 도구를 사용하여 원본과 비교합니다. it're 동일하면 it's a palindrome. 구문의 경우 비교하기 전에 공백,구두점 및 대소문자 차이를 제거합니다. - "A man a plan a canal Panama"는 정규화 한 후에 만 회문입니다.
매우 긴 텍스트를 처리할 수 있나요?
예. 브라우저에서 실행되므로 실용적인 한계는 수백만 개의 문자를 편안하게 덮는 device's 메모리입니다. 입력할 때 라이브로 반전되므로 매우 큰 페이스트는 약간 덜 즉각적으로 느껴질 수 있지만 there's 서버 왕복은 없습니다.
왜 문자열을 뒤집는 것이 그렇게 일반적인 인터뷰 질문입니까?
그것은 하나의 작은 문제로 많은 기본 사항을 포장: 배열 및 문자열 조작, 두 포인터 기술, 장소에 대 복사 절충, 재귀, 그리고 - 면접관이 날카로운 경우 - 유니코드 가장자리 케이스. It's 시작 하기 쉽고 철저 한 하나에서 빠른 답변을 분리 하는 데 충분 한 깊이가 있다.
관련 도구:



