题目描述

你有一个破损的键盘。键盘上的所有键都可以正常工作,但有时Home键或者是End键会自动按下。你并不知道键盘存在这一问题,而是专心地打稿子,甚至连显示器都没打开。当你打开显示器之后,展现在你面前的是一段悲剧的文本,你的任务是在打开显示器之前计算出这段悲剧文本。

输入

输入包含多组数据,每组数据占一行,包含不超过100000个字母、下划线、字符"["或者字符"]",其中字符"["表示Home键,"]"表示End键。

输出

每组输出占一行,输出正确的文本。

样例输入

This_is_a_[beijv]_text
[[]][][]Happy_Birthday_to_Tsinghua_University

样例输出

BeijvThis_is_a__text
Happy_Birthday_to_Tsinghua_University

做题算法思路 

(1)最简单的想法就是用数组保存这段文本,很可惜这样做代码会超时。因为这样改变字符在数组中的顺序会引起大量字符移动,非常消耗时间。

(2)用链表存储字符,链表之间的节点交换很轻松。

(3)数组实现链表方法更好,避免了查找链表数据的时候需要遍历链表,这道题不需要查找数据,所以两种方法都可以达到目的。

方法一:数组实现链表(简洁且难)

#include<cstdio>
#include<cstring>
const int maxn = 10000 + 5;
int last,cur,next[maxn];//光标位于cur号字符的后面
char s[maxn];int main(){while(scanf("%s",s+1)==1){int n=strlen(s+1);//输入保存在s[1],s[2]--中last=cur=0;next[0]=0; for(int i=1;i<=n;i++){char ch=s[i];if(ch=='[') cur=0;else if(ch==']') cur=last;else {next[i]=next[cur];next[cur]=i;if(cur==last) last=i;//更新"最后一个字符"的编号cur=i; }}for(int i=next[0];i!=0;i=next[i])printf("%c",s[i]);printf("\n");    } return 0;
}

方法二:链表

#include<stdio.h>
#include<stdlib.h>
typedef char Typement;//给char取别名,这处改,处处改。
typedef struct ch{Typement c;struct ch *next;//下一个字符
}CH;
void fun(){Typement a;CH *headnew=(CH*)malloc(sizeof(struct ch)); //分配内存CH *realhead=headnew;headnew->next=(CH*)malloc(sizeof(struct ch));//给头节点的下一个节点分配内存 CH *head=headnew->next;//headnew是头节点为空,head为第一个节点 int k=0;while(scanf("%c",&a)==1){//接收数据 if(a=='\n')break;if(a=='['){//如果是home回到头节点 k=1;headnew=realhead;//如果出现这种情况   [  [   [ ]  ]  ] 括号包围括号情况 //上条语句就是把节点指向头节点 continue;       }else if(a==']'){//如果是end回到尾节点k=0;continue;} if(k==1){ //前面插入数据 CH *h=(CH*)malloc(sizeof(struct ch));h->c=a;h->next=headnew->next;headnew->next=h;headnew=h;   }if(k==0){//后面插入数据 head->c=a;head->next=(CH*)malloc(sizeof(struct ch));head=head->next;}}while(realhead->next!=head){//输出数据,只有节点和 printf("%c",realhead->next->c);realhead=realhead->next;}printf("\n");
}
int main(){while(1){fun();}
}

C语言解题:破损的键盘相关推荐

  1. 例题6-4 破损的键盘(又名:悲剧文本)(Broken Keyboard(a.k.a. Beiju Text), UVa 11988)

    例题6-4 破损的键盘(又名:悲剧文本)(Broken Keyboard(a.k.a. Beiju Text), UVa 11988) 链表的应用 #include<iostream> # ...

  2. C语言学习之从键盘输入任意一个字母,输出它的对应大(小)写

    C语言学习之从键盘输入任意一个字母,输出它的对应大(小)写 通过键盘随意输入一个大写或小写字母,输出它对应的小写或大写字母,若不是字母则提示"输入有误!" #include < ...

  3. (链表,插入元素)破损的键盘

    题目: 你有一个破损的键盘.键盘上的所有键都可以正常工作,但有时Home键或者End键会自 动按下.你并不知道键盘存在这一问题,而是专心地打稿子,甚至连显示器都没打开.当你 打开显示器之后,展现在你面 ...

  4. 输入两个数、用python求他们的和_从键盘上输入俩个实型数,编程求它们的和差积商,要求输出时,保留两位小数C语言编程题:从键盘上输入两个...

    从键盘上输入俩个实型数,编程求它们的和差积商,要求输出时,保留两位小数 C语言编程题:从键盘上输入两个 www.zhiqu.org     时间: 2020-11-23 参考代码: #includev ...

  5. c语言程序设计对角矩阵,从键盘输入一个4*4矩阵,并求这个4*4矩阵主对角线元素之和,并输出.球C语言程式设计...

    从键盘输入一个4*4矩阵,并求这个4*4矩阵主对角线元素之和,并输出.球C语言程式设计以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起 ...

  6. c语言求三个数最值非函数,C语言编程:从键盘任意输入三个数,编写求其最大值、最小值的函数,用指针作函数参数实现。...

    www.shufadashi.com防采集. C语言编程:从键盘任意输入三个数,编写求其最大值.最小值的函数,用指针作函数参数实现.. #includevoid maxfunction(int*);v ...

  7. C语言:任意从键盘输入一个三位整数,要求正确分离它的个位,十位和百位数,并分别在屏幕上输出。

    C语言:任意从键盘输入一个三位整数,要求正确分离它的个位,十位和百位数,并分别在屏幕上输出. #include <stdio.h> #include <math.h> void ...

  8. java 驱动级模拟键盘,易语言开源驱动级模拟键盘工具(可绕过wegame屏蔽)

    易语言开源驱动级模拟键盘工具目前一个可以绕过腾讯检测的模拟键盘工具,使用易语言开发,内含开源模块,支持调式修改,有需要模拟键盘的同学可以下载这个驱动模拟键盘来无视腾讯的wegame屏蔽! 相关阅读 手 ...

  9. c语言清除键盘缓冲区函数,C语言程序中清除键盘缓冲区的方法

    第四期2006年12月益阳职业技术学院学报 JournalofYiyangVocationalandTechnicalCollegeNO.4Dec.2006 C语言程序中清除键盘缓冲区的方法 杨长虹 ...

  10. 搜狗输入法android德语,搜狗输入法安卓多语言升级:小语种键盘数增至90+ 日语假名九键上线...

    原标题:搜狗输入法安卓多语言升级:小语种键盘数增至90+ 日语假名九键上线 在全球沟通往来日益频繁紧密的今天,多语言使用和学习者在日常交流场景中经常遇到外语输入需要频繁切换输入法.输入太慢等问题.近日 ...

最新文章

  1. Android Q适配
  2. vb.net2019-Accord.Net机器学习库安装与SVM简单分类
  3. vue+element-ui大文件的分片上传和断点续传js-spark-md5和browser-md5-file
  4. linux virt java_Linux下Java环境安装
  5. win7(64位)php5.5-Apache2.4-环境安装
  6. 自学Android到什么程度才能找到工作?
  7. 应用窗口置顶工具 DeskPins
  8. 大学计算机专业用ipad pro够用吗,苹果iPad Pro上很合适学生党的几个专业App
  9. nodeJS中express+busboy实现文件上传
  10. 动态代理实例——增强Waiter接口
  11. 与华为SIP硬终端(TE40)对接注意事项
  12. 【2019-2020春学期】数据库 教学 期末总结
  13. python算法动画_这可能是史上最全的Python算法集!
  14. 闸门机制(Gate Mechanism)
  15. 手风琴jQuery案例
  16. Stimulsoft Dashboards.JS JavaScript 2203.1.0仪表板
  17. 在HTML网页中书写JavaScript
  18. 如何才能够有效长高?避免走弯路
  19. datagrip mysql 驱动_Datagrip2020下载MySQL驱动失败的问题
  20. IPV6地址-格式和讲解

热门文章

  1. 全网最详细解释Keil-MDK中Code、RO-data、RW-data、ZI-data的含义
  2. 批量为Word2010尾注加方括号[]的方法
  3. 绩效考核的五大原则,你知道吗?
  4. java图片缩放工具类_JAVA操作图片裁切与缩放的一个工具类(个人收藏)
  5. 一文看懂YOLO v3
  6. js 计算个人所得税
  7. 开源分布式任务工作流调度系统Easy Scheduler Release 1.0.2
  8. 寻找发帖水王java_SWUST_OJ 水王发帖排序
  9. apple tv 开发_如何在Apple TV上播放计算机中的视频文件
  10. Word写作 | 如何在Word中把图片铺满整个页面