UVA11988 破损的键盘 Broken Keyboard (a.k.a. Beiju Text)

简介: UVA11988 破损的键盘 Broken Keyboard (a.k.a. Beiju Text)

题意翻译

你在输入文章的时候,键盘上的Home键和End键出了问题,会不定时的按下。你却不知道此问题,而是专心致志地打稿子,甚至显示器都没开。当你打开显示器之后,展现你面前的数一段悲剧文本。你的任务是在显示器打开前计算出这段悲剧的文本。 给你一段按键的文本,其中’[‘表示Home键,’]'表示End键,输入结束标志是文件结束符(EOF)。

输入

This_is_a_[Beiju]_text
[[]][][]Happy_Birthday_to_Tsinghua_University

输出

BeijuThis_is_a__text
Happy_Birthday_to_Tsinghua_University


思路1:由于home 和end键,所以会涉及到字符的插入,如果使用数组,那么插入元素会涉及到数组元素的移动,时间复杂度是很大的。经常插入,我们想到了链表这一数据结构.通过判断home键/end键我们改变迭代器的位置,然后进行后序字符的插入。记得insert函数使用后会返回插入的字符的迭代器(指向该字符),然后插入下一个字符之前记得更新迭代器的位置,不然就会出错我就在这里错了好久


参考代码1


#include<bits/stdc++.h>
using namespace std;
string str;
list<char> L;
void solve(string &s){
  L.clear();
  list<char>::iterator it = L.begin();  
  for(int i = 0; i < s.size();i++){
    if(s[i]=='['){
      it = L.begin();
    }else if(s[i]==']'){
      it = L.end();
    }else{
      it= L.insert(it,s[i]);//在it后面插入一个字符 
      it++;
    }
  }
  for(list<char>::iterator it1 = L.begin(); it1 != L.end(); it1++){
    cout<<*it1;
  } 
  cout<<endl;
}
int main()
{
  while(cin>>str){
    solve(str);
  }
  return 0;
}


思路2:由于字符串具有拼接简便的特性,所以可以利用字符串来搞。对于每个字符串s,遍历每个字符,然后判断,如果是home键,就把之后的字符放到一个临时字符串s2中,然后当下一次遇到end键之时进行更新主串s3 = s2+s3; 最后一步也要需要处理.

参考代码

#include<bits/stdc++.h>
using namespace std;
string s;
void solve(string &s){
  string s2  = "",s3 = "";//s2:用于暂存头部操作的字符串   s3 :主字符串 
  int flag = 0;//用于标记在头部操作还是尾部 
  for(int i = 0; i < s.length(); i++){
    if(s[i]=='['){
      flag = 1;//标记光标最前面 
    }else if(s[i]==']'){
      s3 = s2+s3;
      s2 = "";
      flag = 0;//最后面 
    }else{
      if(flag){
        s2 += s[i];
      } else{
        s3 += s[i];
      }
    }
  }
  s3 = s2+s3; 
  cout<<s3<<endl;
}
int main()
{
  while(cin>>s){
    solve(s);
  }
  return 0;
}

注意:思路二存在一定的漏洞,可能某些细节没处理好,样例通过了但不能AC.希望能够看出问题的小伙伴留言,交流下.


相关文章
|
测试技术 C# Windows
使用Input Simulator模拟键盘与鼠标的输入 (.NET C sharp)
直接使用user32.dll控制键盘与鼠标的操作是较为麻烦的,幸好有Input Simulator这个工具帮我们解决了很多问题
795 0
|
Windows
DTDragDropFile UE Drag the system file to the window Plug-in Description
DTDragDropFile UE Drag the system file to the window Plug-in Description
68 0
|
Web App开发 JSON 前端开发
你不知道的input之文件选择( accept、capture、multiple、webkitdirectory)
前段时间写了一个上传文件前预览的功能,用于 pc 端。 这次又要测试一下移动端的兼容性,在客户端内使用。 正好整理一下,先上测试地址:DEMO 地址,目前有这些功能。 动态设置 accept、capture、multiple、webkitdirectory ?accept=.png 的形式快速还原场景 上传前预览的功能,前端上传前预览文件 image、text、json、video、audio
1249 0
你不知道的input之文件选择( accept、capture、multiple、webkitdirectory)
【1084】Broken Keyboard (20 分)
在第二个字符串中出现,则跳出内层for循环;内层for循环结束时,如果第二个字符串未出现c1,且c1未被输出过,则输出c1。 对于上面的判断c1是否输出过:hashtable数
88 0
|
C#
C#: Get current keyboard layout\input language
原文 https://yal.cc/csharp-get-current-keyboard-layout/   On some occasions, you may want to get a "global" input language - that is, the keyboard layo...
1093 0
1084. Broken Keyboard (20)
On a broken keyboard, some of the keys are worn out. So when you type some sentences, the characters corresponding to those keys will not appear on screen.
712 0