[E双端队列] lc2810. 故障键盘(双端队列+模拟)

本文介绍了如何使用双端队列解决故障键盘问题,思路二中,当遇到字符i时,调整队列方向进行左右扩展,最后返回处理后的字符串。时间复杂度和空间复杂度均为O(n)。
摘要由CSDN通过智能技术生成

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]...))
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ypuyu

如果帮助到你,可以请作者喝水~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值