1. 题目来源
链接:2810. 故障键盘
2. 题目解析
很直接的一道题目,只不过要注意下时间消耗。
思路1:
- 直接排序即可
思路2:
- 双端队列,如果没有遇见 i,则顺序向后加字符即可,即向右拓展。
- 如果遇见 i,则需要调转方向,向左拓展。
思路2 很不错,同时也需要注意写法。
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( 1 ) O(1) O(1)
思路1:
class Solution {
public:
string finalString(string s) {
string res = "";
for (char c : s) {
if (c == 'i') reverse(res.begin(), res.end());
else res += c;
}
return res;
}
};
思路2:
func finalString(s string) string {
q := [2][]rune{} // 两个 slice 背靠背,q[0] 向左,q[1] 向右
dir := 1
for _, c := range s {
if c == 'i' {
dir ^= 1 // 修改添加方向
} else {
q[dir] = append(q[dir], c)
}
}
slices.Reverse(q[dir^1])
return string(append(q[dir^1], q[dir]...))
}