LeetCode笔记:反转字符串
问题
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[]
的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1)
的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例 1:
输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]
示例 2:
输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]
ACSII 码可打印字符
十进制 | 符号 | 中文解释 | 十进制 | 符号 | 中文解释 |
---|---|---|---|---|---|
32 | 空格 | 80 | P | 大写字母 P | |
33 | ! | 感叹号 | 81 | Q | 大写字母 Q |
34 | " | 双引号 | 82 | R | 大写字母 R |
35 | # | 井号 | 83 | S | 大写字母 S |
36 | $ | 美元符 | 84 | T | 大写字母 T |
37 | % | 百分号 | 85 | U | 大写字母 U |
38 | & | 与 | 86 | V | 大写字母 V |
39 | ’ | 单引号 | 87 | W | 大写字母 W |
40 | ( | 左括号 | 88 | X | 大写字母 X |
41 | ) | 右括号 | 89 | Y | 大写字母 Y |
42 | * | 星号 | 90 | Z | 大写字母 Z |
43 | + | 加号 | 91 | [ | 左中括号 |
44 | , | 逗号 | 92 | \ | 反斜杠 |
45 | - | 连字号或减号 | 93 | ] | 右中括号 |
46 | . | 句点或小数点 | 94 | ^ | 音调符号 |
47 | / | 斜杠 | 95 | _ | 下划线 |
48 | 0 | 0 | 96 | ` | 重音符 |
49 | 1 | 1 | 97 | a | 小写字母 a |
50 | 2 | 2 | 98 | b | 小写字母 b |
51 | 3 | 3 | 99 | c | 小写字母 c |
52 | 4 | 4 | 100 | d | 小写字母 d |
53 | 5 | 5 | 101 | e | 小写字母 e |
54 | 6 | 6 | 102 | f | 小写字母 f |
55 | 7 | 7 | 103 | g | 小写字母 g |
56 | 8 | 8 | 104 | h | 小写字母 h |
57 | 9 | 9 | 105 | i | 小写字母 i |
58 | : | 冒号 | 106 | j | 小写字母 j |
59 | ; | 分号 | 107 | k | 小写字母 k |
60 | < | 小于 | 108 | l | 小写字母 l |
61 | = | 等号 | 109 | m | 小写字母 m |
62 | > | 大于 | 110 | n | 小写字母 n |
63 | ? | 问号 | 111 | o | 小写字母 o |
64 | @ | 电子邮件符号 | 112 | p | 小写字母 p |
65 | A | 大写字母 A | 113 | q | 小写字母 q |
66 | B | 大写字母 B | 114 | r | 小写字母 r |
67 | C | 大写字母 C | 115 | s | 小写字母 s |
68 | D | 大写字母 D | 116 | t | 小写字母 t |
69 | E | 大写字母 E | 117 | u | 小写字母 u |
70 | F | 大写字母 F | 118 | v | 小写字母 v |
71 | G | 大写字母 G | 119 | w | 小写字母 w |
72 | H | 大写字母 H | 120 | x | 小写字母 x |
73 | I | 大写字母 I | 121 | y | 小写字母 y |
74 | J | 大写字母 J | 122 | z | 小写字母 z |
75 | K | 大写字母 K | 123 | { | 左大括号 |
76 | L | 大写字母 L | 124 | | | 垂直线 |
77 | M | 大写字母 M | 125 | } | 右大括号 |
78 | N | 大写字母 N | 126 | ~ | 波浪号 |
79 | O | 大写字母 O | 127 | 删除 |
解法
思路:
- 先为每一个字符加一个顺序标识
- 按照标识的顺序,倒序排序这个数组,达到反转效果
- 提取反转后的数组中的关键字符,重新设置这个字符
注意:
问题中的要求是 ASCII 码表中的可打印字符,基于这个要求,如果在第一步加顺序标识的时候,用 ['0-a','1-b','2-c']的分割字符的方式来排序,是不够严谨的。
代码:
/**
* @param {character[]} s
* @return {void} Do not return anything, modify s in-place instead.
*/
var reverseString = function (s) {
/**
* 为每个字符加一个顺序标识
*
* ['a','b','c']
*
* =>
*
* [
* {index:0,str:'a'},
* {index:1,str:'b'},
* {index:2,str:'c'},
* ]
*/
s.map((item, index) => {
return {
index: index,
str: item,
};
})
/**
* 倒序排序
*
* [
* {index:0,str:'a'},
* {index:1,str:'b'},
* {index:2,str:'c'},
* ]
*
* =>
*
* [
* {index:2,str:'c'},
* {index:1,str:'b'},
* {index:0,str:'a'},
* ]
*/
.sort((a, b) => {
return b.index - a.index;
})
/**
* 还原
*
* [
* {index:2,str:'c'},
* {index:1,str:'b'},
* {index:0,str:'a'},
* ]
*
* =>
*
* [
* 'c',
* 'b',
* 'a',
* ]
*/
.forEach((item, index, arr) => {
s[index] = item.str;
});
};
评论