我在 toolz。dev 上發貨了字串反向工具,認為這是最無聊的東西 I'd 整個月都建置。它's split('').reverse().join(''). 可能出錯的地方。然後我貼了範例文字 I'd 寫的 - 因為我感覺很可愛,所以以 " 結束;統一碼: & & 引用; - 輸出回來時,兩個表情符號變成了亂碼框。 🌍🚀 成為 \ude80🜍\ud83c.漢字完美反轉。表情符號破碎了。
那個五分鐘的驚喜實際上是我可以教給你的關於反轉字串的最有用的東西,所以整個指南都是圍繞著它構建的。反轉文字聽起來很瑣碎,對於普通的 ASCII 來說卻是這樣。當你引入表情符號、標誌或某些重音字元時,"反轉字串"停止有一個明顯的答案 - 大多數工具,包括這個工具,都會悄悄地選擇打破它們的答案。
的 弦反向 工具做一件事:當您鍵入時,它會立即反轉字元。無需配置模式,無需註冊,並且您的文字永遠不會離開瀏覽器。讓我準確地向您展示它的作用、中斷的位置以及如何反轉文字 正確 在真實程式碼中,當破損時 't 可接受。
TL;DR: 將文字貼到 弦反向 它會翻轉角色順序 -
Hello成為olleH. It'為單一字元反轉模式(無單獨的單字或行模式),鍵入時會自動更新,並且可以複製或下載結果。它'非常適合回文檢查、快速謎題和驗證面試答案。抬頭:就像一個簡單的 JavaScriptsplit(''),它會破壞表情符號和標誌,因為它按代碼單位分割。純文字和 CJK 反轉很好。與配對 變形器 或者 字計數器 用於快速文字工作。
字串反轉工具實際上有什麼作用?
正是一個操作:它反轉字元的順序。最後一個字元變成第一個,依此類推。
輸入: Hello World
輸出: dlroW olleH
在幕後,邏輯確實是一行--與你和#39;d 在 JavaScript 訪談中寫的同一行:
text.split('').reverse().join('')
There'沒有&引用;反向單字&引用;或&引用;反向行&引用;模式隱藏在選單中。此頁面的早期草稿描述了字元、單字、句子和行模式;這是理想的,而不是真實的。該工具反轉字符,句號。它確實會在您鍵入時自動更新,因此您可以即時看到反轉的結果,並為您提供輸入和輸出的字元和行數。您可以貼上文字、上傳文字檔案、從 URL 載入、然後複製結果或下載為 a .txt.
如果您特別想要詞序反轉 (Hello World → World Hello),你'd 用程式碼執行此操作 split(' ').reverse().join(' ')- I'將顯示下面的片段。
為什麼表情符號在反轉時會破裂?
這是值得理解的部分,因為它解釋了一整類錯誤。
JavaScript 字串是 UTF-16 的序列 代碼單位,不是&引用;人物和引用;在人類意義上。大多數日常字元--英文字母、數字、標點符號,甚至中文、日文和韓文字母--都適合一個 16 位元代碼單元。所以 split('') 它們之間的切割乾淨且可翻轉:
'你好世界'.split('').reverse().join('') // → '界世好你' ✅
但表情符號、標誌序列和一些符號仍然存在 外面 該範圍和存儲為 代孕對- 兩個代碼單元在一起僅具有某種意義。 split('') 很高興地把它們切成兩半,然後逆轉把兩半變成廢話:
'AB🌍🚀'.split('').reverse().join('') // → mojibake, the emoji shatter ❌
組合標記是另一個陷阱。重音字母可以透過兩種方式儲存:作為一個預先組合的代碼點(()é),或作為基字母加上單獨的組合重音(()e + * 噢)。預製版本反轉良好。分解的版本會分離重音,重音在反轉後會飄落並落在錯誤的字母上。
所以這個工具的誠實規則是: 純文字、數字、標點符號和 CJK 正確反轉;表情符號、標誌表情符號和分解的重音將會中斷。 That'不是 Toolz.dev 獨有的缺陷 - it'這是什麼 split('') 到處都有,而且很多"反向字串"網站的行為都是一樣的。我故意保留了樸素的版本,因為它'快速、透明,並且與大多數人說"時的意思相符;反轉這個,"但你應該知道邊緣。
如何正確反轉程式碼中的字串?
如果您'正在編寫真實的程式碼並且 Unicode 很重要,那麼這裡'是從天真到正確的階梯。
1 級 - 天真(該工具的作用): 打破表情符號。
str.split('').reverse().join('')
2 級 - 擴頻運算子: 按代碼迭代 點,因此它保持了大多數表情符號的完整性(代理對保持在一起)。仍然會破壞分解的組合標記和多表情符號序列(例如標誌)。
[...str].reverse().join('')
3 級 - 字素感知: 處理每個"使用者感知的字元"作為原子。這是真正正確的方法。
const seg = new Intl.Segmenter('en', { granularity: 'grapheme' });
[...seg.segment(str)].map(s => s.segment).reverse().join('');
Intl.Segmenter 正確處理表情符號、旗幟、膚色修飾符和組合標記。如果確實需要使用表情符號反轉使用者文本,則它會發布版本 I'd。
這裡'是跨語言的相同操作,供訪談練習和參考:
# 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
請注意模式:幾乎所有語言's&引用;顯而易見的&引用;反向是基於代碼單元或位元組,並且具有相同的 Unicode 弱點。達到字素感知選項是例外,而不是預設選項。
字串反轉實際上有什麼好處?
除了成為典型的面試熱身之外,它還能在少數地方贏得成功。
回文檢查。 反轉字串並與原始字串進行比較 - 如果匹配,則 's 回文。嘗試 racecar, level,或者 12321 在工具和觀察中,輸出返回相同。對於諸如 " 之類的短語回文,一個人計劃一條巴拿馬運河,"首先剝離空間和案例。
驗證您自己的程式碼。 當您'磨削 LeetCode 風格的反轉問題時,將您預期的輸出貼到工具中以立即對其進行健全性檢查。 It'是字元反轉情況的快速預言機。
快速的謎題和有趣的文字。 向後訊息、文字遊戲、鏡像社交貼文 - 低風險,而反轉本身就是反轉,因此反轉兩次即可獲得原始返回。該屬性易於測試:反向、再次反向、確認您'回家了。
一件事 不是 用它來:安全。反轉是派對技巧,而不是加密 - it'只是簡單地撤銷了。它出現在初學者和引用中;混淆與引用;教程,但切勿將反轉的文字視為受保護。
| 反轉型 | 例子 | 在工具裡? | 代碼片段 |
|---|---|---|---|
| 人物 | abc → cba |
是的(唯一的模式) | [...s].reverse().join('') |
| 詞語 | a b c → c b a |
不--用代碼來做 | s.split(' ').reverse().join(' ') |
| 線 | 換行順序 | 不--用代碼來做 | s.split('\n').reverse().join('\n') |
| 字素安全 | 表情符號保持完整 | 無 - 需要 Intl。Segmenter | 請參閱上面的第 3 級 |
兩分球方法,如果你'正在準備採訪
訪談者喜歡這個問題的原因是優雅的答案根本不使用內建的反向。你向彼此走兩指並交換:
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) 額外空間。在 JavaScript 中,字串是不可變的,因此您可以't 實際上是就地交換,但兩點邏輯就是它們'正在檢查您是否理解。遞歸版本 - reverse(s) = last char + reverse(rest)- 更漂亮,但使用 O(n) 呼叫堆疊空間,這是採訪中值得一提的權衡。
請記住,使測試變得微不足道的屬性:反轉本身就是反轉。將字串反轉兩次,然後您'回到您開始的地方。當我單元測試任何反轉程式碼時,即' 的第一個斷言: reverse(reverse(x)) === x 對於一批輸入,尤其是表情符號,因此測試實際上捕獲了代理對錯誤而不是隱藏它。
常見問題
字串反轉工具支援單字還是行反轉?
不,它有一個反轉字元的單一模式。那裡'沒有單獨的詞序或行序模式。如果您需要反轉單字或行的順序,請使用 code 進行 split(' ') 或者 split('\n') 緊隨其後 .reverse().join(...).
為什麼表情符號在反轉後會出現亂碼?
因為工具被 UTF-16 程式碼單元反轉,例如 JavaScript's split(''). 表情符號和標誌序列儲存為代理對(兩個代碼單元僅一起有意義),反轉將它們分開。純文字和 CJK 字元是單一代碼單元,因此它們可以正確反轉。
它處理 Unicode 和 CJK 文字嗎?
部分地。中文、日文、韓文、西里爾文和預先組合的重音字元正確反轉,因為每個字元都是單一代碼單元。表情符號、標誌表情符號和分解的組合標記都會被破壞。為了完全正確地處理您自己的程式碼,請使用 Intl.Segmenter 具有字素粒度。
我的文字已傳送到伺服器嗎?
否。當您鍵入時,瀏覽器本機會發生反轉 - 文字永遠不會上傳。這使得反轉敏感或私有字串變得安全。
如何檢查一個字是否是回文?
用反轉它 弦反向 工具並與原件進行比較。如果它們'相同,則 '是一個回文。對於短語,在比較之前刪除空格、標點符號和格差異 - "一個人規劃一條運河巴拿馬"只有在標準化後才是回文。
它可以處理很長的文字嗎?
是的。由於它在您的瀏覽器中運行,因此實際限制是您的裝置's內存,可以舒適地覆蓋數百萬個字元。當您鍵入時,它會反轉即時狀態,因此非常大的貼上可能會感覺不太即時,但那裡'沒有伺服器往返。
為什麼反轉字串是這樣一個常見的面試問題?
它將許多基礎知識融入一個小問題中:數組和字串操作、兩分球技術、就地與複製權衡、遞歸,以及(如果訪談者很敏銳)Unicode 邊緣情況。 It'易於啟動,並且有足夠的深度將快速答案與徹底答案分開。
相關工具:



