zoukankan      html  css  js  c++  java
  • 破损的键盘(链表)

    codevs 4650 破损的键盘

    题目描述 Description 
    有一天,你需要打一份文件,但是你的键盘坏了,上面的”home”键和”end”键会时不时地按下,而你却毫不知情,甚至你都懒得打开显示器,当你打开显示器之后,出现在你的面前的是一段悲剧的文本。

    输入描述 Input Description 
    输入只有一行,即这份文件,这份文件只包含小写字母和’[‘以及’]’,用’[‘代替”home”键,用’]’代替”end”键。

    输出描述 Output Description 
    你的任务是在打开显示器之前,计算出这份悲剧的文档。

    样例输入 Sample Input 
    kdg[gek]h[itj

    de[co]vs

    样例输出 Sample Output 
    itjgekkdgh

    codevs

    数据范围及提示 Data Size & Hint 
    包含多组测试数据,直到文件结束。

    字符串长度小于10000个字符。

    不包含空格。


    用数组进行模拟链表

    next[0]即是链表的头指针。

    #include<stdio.h>
    #include<string>
    #include<iostream>
    #include<string.h>
    #include<cmath>
    char s[100005];
    int next[10005];
    int main()
    {
        int i,j,k,tmp,len;
        while(scanf("%s",s+1)!=EOF)
        {
            len=strlen(s+1);
    
            int cur=0,last=0;
            next[0]=0;
            for(i=1; i<=len; i++)
            {
                if(s[i]=='[')
                    cur=0;
                else if(s[i]==']')cur=last;
                else
                {
                    next[i]=next[cur];
                    next[cur]=i;
                       //在遇到'['时,从链表头插入数据,先开一个新的“指针”,、
                    //然后将新指针指向原来“cur”指针指向的位置,然后将cur指针指向新的这个指针
                    if(last==cur)last=i;//及时更新尾指针
                    cur=i;//现在将光标移到新指针的位置
                }
            }
            for(i=next[0]; i!=0; i=next[i])
                printf("%c",s[i]);
    
            printf("
    ");
    
        }
        return 0;
    }
    



    也可以用vector进行模拟;

    #include<iostream>
    #include<cstdio>
    #include<vector>
    #include<cstring>
    using namespace std;
    char a[100000+10];
    vector<char>v;
    vector<char>::iterator it;
    int main()
    {
        while(scanf("%s",a+1)!=EOF)
        {
            bool flag=0;
            int n=strlen(a+1);
            int tot=0;
            for(int i=1;i<=n;i++)
            {
                if(a[i]!='['&&a[i]!=']')
                {
                    if(flag==0)
                    {
                        v.push_back(a[i]);
                    }
                    else
                    {
                        v.insert(v.begin()+tot,a[i]);
                        tot++;
                    }
                }
                else if(a[i]=='[')
                {
                    flag=1;
                    tot=0;
                }
                else if(a[i]==']')
                {
                    flag=0;
                }
            }
            for(it=v.begin();it!=v.end();it++)
            {
                printf("%c",*it);
            }
            printf("
    ");
            v.clear();
        }
        return 0;
    }


    另外一个网友的解法

    原文地址http://www.cnblogs.com/shenben/p/5785494.html

    从后向前输出,都不用模拟

    #include<cstdio>  
    #include<cstring>  
    #define N 10001  
    using namespace std;  
    int n,l,x;  
    char s[N],a[N];  
    int main(){  
        while(scanf("%s",s+1)!=EOF){  
            x=0;  
            l=strlen(s+1);int len=l+1;  
            while(len>=1){  
                len--;  
                while(len>=1&&s[len]!='[') len--;  
                for(int i=len+1;s[i]!=']'&&i<=l;i++) if(s[i]&&s[i]!='[') a[++x]=s[i],s[i]=0;      
            }  
            for(int i=1;i<=x;i++) printf("%c",a[i]);      
            for(int i=1;i<=l;i++) if(s[i]&&s[i]!='['&&s[i]!=']') printf("%c",s[i]);              
            printf("
    ");  
        }  
        return 0;  
    }  


  • 相关阅读:
    【hive】时间段为五分钟的统计
    【git】提交到github不显示贡献小绿点问题的解决
    【hive】关于用户留存率的计算
    【hive】求日期是星期几
    【hive】数据仓库层次设计
    【hive】count() count(if) count(distinct if) sum(if)的区别
    转载:几种 hive join 类型简介
    丑小鸭和白天鹅没有区别
    好好照顾自己,就像照顾你爱的人那样;
    灵光一闪(最近更新于2020/8/23)
  • 原文地址:https://www.cnblogs.com/hjch0708/p/7554841.html
Copyright © 2011-2022 走看看