Easy
题目描述
你的笔记本电脑键盘坏了,每当你在上面输入字符 ‘i’ 时,它会反转你已经写的字符串。输入其他字符按预期工作。
给你一个 0 索引的字符串 s,你使用故障键盘输入 s 的每个字符。
返回最终会出现在你笔记本电脑屏幕上的字符串。
示例 1:
输入:s = "string"
输出:"rtsng"
解释:
输入第一个字符后,屏幕上的文本是 "s"。
输入第二个字符后,文本是 "st"。
输入第三个字符后,文本是 "str"。
由于第四个字符是 'i',文本被反转变成 "rts"。
输入第五个字符后,文本是 "rtsn"。
输入第六个字符后,文本是 "rtsng"。
因此,我们返回 "rtsng"。
示例 2:
输入:s = "poiinter"
输出:"ponter"
解释:
输入第一个字符后,屏幕上的文本是 "p"。
输入第二个字符后,文本是 "po"。
由于你输入的第三个字符是 'i',文本被反转变成 "op"。
由于你输入的第四个字符是 'i',文本被反转变成 "po"。
输入第五个字符后,文本是 "pon"。
输入第六个字符后,文本是 "pont"。
输入第七个字符后,文本是 "ponte"。
输入第八个字符后,文本是 "ponter"。
因此,我们返回 "ponter"。
约束条件:
- 1 <= s.length <= 100
- s 由小写英文字母组成
- s[0] != ‘i’
解题思路
这道题是一个典型的模拟问题。我们需要按照题目描述的规则逐个处理字符串中的每个字符。
解题思路:
直接模拟法:遍历输入字符串,维护一个结果字符串。当遇到非 ‘i’ 字符时,将其添加到结果字符串末尾;当遇到 ‘i’ 字符时,将当前结果字符串反转。
优化思考:由于字符串长度最大只有100,直接模拟的时间复杂度完全可以接受。每次反转操作的复杂度是O(n),最坏情况下需要反转多次,但由于数据规模较小,不需要过度优化。
实现要点:
- 初始化一个空的结果字符串
- 遍历输入字符串的每个字符
- 如果字符不是 ‘i’,直接添加到结果字符串
- 如果字符是 ‘i’,对当前结果字符串进行反转
- 返回最终的结果字符串
这种方法简单直观,代码易于理解和实现,时间复杂度为O(n²)(最坏情况下每个字符都是’i’),空间复杂度为O(n)。
代码实现
class Solution {
public:
string finalString(string s) {
string result = "";
for (char c : s) {
if (c == 'i') {
reverse(result.begin(), result.end());
} else {
result += c;
}
}
return result;
}
};
class Solution:
def finalString(self, s: str) -> str:
result = ""
for c in s:
if c == 'i':
result = result[::-1]
else:
result += c
return result
public class Solution {
public string FinalString(string s) {
string result = "";
foreach (char c in s) {
if (c == 'i') {
char[] arr = result.ToCharArray();
Array.Reverse(arr);
result = new string(arr);
} else {
result += c;
}
}
return result;
}
}
var finalString = function(s) {
let result = "";
for (let char of s) {
if (char === 'i') {
result = result.split('').reverse().join('');
} else {
result += char;
}
}
return result;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(n²) | 最坏情况下每个字符都是’i’,需要进行n次反转,每次反转O(n) |
| 空间复杂度 | O(n) | 需要存储结果字符串,长度最多为n |
相关题目
. Reverse Vowels of a String (Easy)
. Reverse String II (Easy)
. Reverse Only Letters (Easy)