JavaScript 从浅入深 100 题训练计划--(24)字符串反转

题目:反转字符串,要求处理 Unicode 字符(如 emoji)

reverseString("hello") // "olleh"
reverseString("👋🌍") // "🌍👋" 

 

⚠️ 关键坑:Unicode 字符(emoji、中文组合字符)

问题:split('') 会破坏 emoji 和特殊字符

  • emoji(如 😀)在 JavaScript 内部用 两个 UTF-16 码元(surrogate pair) 表示
  • split('') 按码元切分,会把 emoji 劈成两半
  • [...str]Array.from() 按**码点(code point)**切分,能正确识别 emoji
1 // "e\u0301" = é(e + 组合重音符号,两个码点)
2 const str = 'e\u0301';
3 
4 [...str].reverse().join('');  // "\u0301e" ← 符号跑到前面了,视觉上还是错的
5 
6 // 终极解决方案:用 Intl.Segmenter 按"字素簇"切分
7 const segmenter = new Intl.Segmenter('zh', { granularity: 'grapheme' });
8 const reversed = [...segmenter.segment(str)].reverse().map(s => s.segment).join(''); 

 

 1 function reverseString(str) {
 2   // return [...str].reverse().join('');
 3   return Array.from(str).reverse().join('');
 4 }
 5 
 6 function reverseString(str) {
 7   const chars = [...str];
 8   let result = '';
 9   
10   for (let i = chars.length - 1; i >= 0; i--) {
11     result += chars[i];
12   }
13   
14   return result;
15 }
16 
17 
18 // 双指针
19 function reverseString(str) {
20   return [...str].reduce((acc, char) => char + acc, '');
21 }
22 
23 function reverseString(s) {   // s 是字符数组,如 ["h","e","l","l","o"]
24     let left = 0;
25     let right = s.length - 1;
26 
27     while (left < right) {
28         [s[left], s[right]] = [s[right], s[left]];  // 交换
29         left++;
30         right--;
31     }
32     return s;
33 }
34 
35 // 手动处理Unicode
36 
37 function reverseStringUnicode(str) {
38   const result = [];
39   
40   for (let i = str.length - 1; i >= 0; i--) {
41     const charCode = str.charCodeAt(i);
42     
43     // 处理代理对(Surrogate Pair)
44     if (charCode >= 0xDC00 && charCode <= 0xDFFF && i > 0) {
45       const highSurrogate = str.charCodeAt(i - 1);
46       if (highSurrogate >= 0xD800 && highSurrogate <= 0xDBFF) {
47         result.push(str[i - 1] + str[i]);
48         i--;
49         continue;
50       }
51     }
52     
53     result.push(str[i]);
54   }
55   
56   return result.join('');
57 }

 

posted @ 2026-09-07 20:15  小新的蜡笔  阅读(2)  评论(0)    收藏  举报