【Leetcode】2810. 故障键盘

文章目录

题目

题目链接🔗

你的笔记本键盘存在故障,每当你在上面输入字符 ′ i ′ 'i' ′i′ 时,它会反转你所写的字符串。而输入其他字符则可以正常工作。

给你一个下标从 0 0 0 开始的字符串 s s s ,请你用故障键盘依次输入每个字符。

返回最终笔记本屏幕上输出的字符串。

示例 1:

输入:s = "string"

输出:"rtsng"

解释:

输入第 1 1 1 个字符后,屏幕上的文本是: " s " "s" "s" 。

输入第 2 2 2 个字符后,屏幕上的文本是: " s t " "st" "st" 。

输入第 3 3 3 个字符后,屏幕上的文本是: " s t r " "str" "str" 。

因为第 4 4 4 个字符是 ′ i ′ 'i' ′i′ ,屏幕上的文本被反转,变成 " r t s " "rts" "rts" 。

输入第 5 5 5 个字符后,屏幕上的文本是: " r t s n " "rtsn" "rtsn" 。

输入第 6 6 6 个字符后,屏幕上的文本是: " r t s n g " "rtsng" "rtsng" 。

因此,返回 " r t s n g " "rtsng" "rtsng" 。
示例 2:

输入:s = "poiinter"

输出:"ponter"

解释:

输入第 1 1 1 个字符后,屏幕上的文本是: " p " "p" "p" 。

输入第 2 2 2 个字符后,屏幕上的文本是: " p o " "po" "po" 。

因为第 3 3 3 个字符是 ′ i ′ 'i' ′i′ ,屏幕上的文本被反转,变成 " o p " "op" "op" 。

因为第 4 4 4 个字符是 ′ i ′ 'i' ′i′ ,屏幕上的文本被反转,变成 " p o " "po" "po" 。

输入第 5 5 5 个字符后,屏幕上的文本是: " p o n " "pon" "pon" 。

输入第 6 6 6 个字符后,屏幕上的文本是: " p o n t " "pont" "pont" 。

输入第 7 7 7 个字符后,屏幕上的文本是: " p o n t e " "ponte" "ponte" 。

输入第 8 8 8 个字符后,屏幕上的文本是: " p o n t e r " "ponter" "ponter" 。

因此,返回 " p o n t e r " "ponter" "ponter" 。
提示:

  • 1 ≤ s . l e n g t h ≤ 100 1 \leq s.length \leq 100 1≤s.length≤100
  • s s s 由小写英文字母组成
  • s 0 ! = ′ i ′ s0 != 'i' s0!=′i′

思路

这道题目要求模拟故障键盘的输入,其中故障键盘会在输入字符 'i' 时反转已输入的字符串,而其他字符则正常输入。所以我们需要一个变量来追踪当前输入的方向(从左到右或从右到左),以及一个数据结构来存储已输入的字符。

  1. 使用一个 d e q u e deque deque(双端队列)来存储字符,因为我们需要在两端进行插入操作。
  2. 使用一个布尔变量 l e f t 2 r i g h t left2right left2right 来追踪当前输入方向,初始值为 t r u e true true 表示从左到右。
  3. 遍历字符串 s s s,对于每个字符:
  • 如果是字符 ′ i ′ 'i' ′i′,则将 l e f t 2 r i g h t left2right left2right 取反,表示要改变输入方向。
  • 如果当前输入方向是从左到右,则将字符加入到双端队列的末尾。
  • 如果当前输入方向是从右到左,则将字符加入到双端队列的开头。
  1. 根据 l e f t 2 r i g h t left2right left2right 的值来确定最终输出的字符串是正序还是逆序。

代码

c++ 复制代码
class Solution {
public:
    string finalString(string s) {
        deque<char> dq;
        bool left2right = true;  // 从左到右
        for (int i = 0; i < s.length(); ++i) 
        {
            if (s[i] == 'i') left2right = !left2right;  // 反向
            else if (left2right) dq.push_back(s[i]);
            else dq.push_front(s[i]);
        }
        return left2right ? string(dq.begin(), dq.end()) : string(dq.rbegin(), dq.rend());
    }
};

复杂度分析

时间复杂度

O ( n ) O(n) O(n)

空间复杂度

O ( n ) O(n) O(n)

结果

总结

通过维护输入方向和使用双端队列,可以在 O ( n ) O(n) O(n) 的时间和 O ( n ) O(n) O(n) 的空间内完成

相关推荐
不正经学生10 分钟前
C语言大小端字节序:内存里字节的排列顺序
c语言·开发语言·arm开发·c++·算法·c#
evans在进步38 分钟前
LeetCode 34:在排序数组中查找元素的首尾位置——Java 两次二分查找详解
java·python·leetcode
小则又沐风a1 小时前
负载均衡式在线OJ---------第二幕
linux·c++·后端
a3535413821 小时前
C++项目如何架构优化
java·c++·架构
键盘会跳舞1 小时前
C++:智能指针源码级深度拆解——从 RAII 思想到引用计数的内存安全体系
c++·智能指针·unique_ptr·shared_ptr·weak_ptr
依然鸣1 小时前
PTA团体程序设计天梯赛L2真题讲解L2-001-004
经验分享·学习·算法·深度优先·pat考试
SNAKEpc121381 小时前
OpenGL(十三)- Mip贴图
c语言·c++·图形渲染·贴图
杨航 AI3 小时前
** AI 面试算法 50 题清单**,不是单纯的 LeetCode 题号列表,而是按照“**考察概率 × 面试价值 × 你当前准备方向**”排序
算法·leetcode·面试
m0_720245019 小时前
1543.统计好三元组(简单)
开发语言·算法
To_OC10 小时前
LC 560 和为 K 的子数组:前缀和配哈希表,这对组合我是真的服了
javascript·算法·程序员