zoukankan      html  css  js  c++  java
  • 【PAT甲级】1112 Stucked Keyboard (20分)(字符串)

    题意:

    输入一个正整数K(1<K<=100),接着输入一行字符串由小写字母,数字和下划线组成。如果一个字符它每次出现必定连续出现K个,它可能是坏键,找到坏键按照它们出现的顺序输出(相同坏键仅输出一次,数据保证必定存在坏键),接着输出将坏键修好后原本的字符串(K个连续坏键只输出一次)。

    trick:

    测试点1答案错误原因:出现次数为K的倍数而不是大于等于K

    测试点2,3错误原因:输出原字符串时没有检验最后一段连续相同字符是否为坏键(循环当中没有检验这一段)

    AAAAAccepted code:

     1 #define HAVE_STRUCT_TIMESPEC
     2 #include<bits/stdc++.h>
     3 using namespace std;
     4 char ans[1007];
     5 int vis[1007];
     6 int main(){
     7     ios::sync_with_stdio(false);
     8     cin.tie(NULL);
     9     cout.tie(NULL);
    10     int k;
    11     cin>>k;
    12     cin.ignore();
    13     string s;
    14     getline(cin,s);
    15     int num=0;
    16     int cnt=1;
    17     for(int i=1;i<s.size();++i){
    18         if(s[i]==s[i-1])
    19             ++cnt;
    20         else{
    21             if(cnt%k==0&&!vis[s[i-1]-NULL])
    22                 ans[++num]=s[i-1],vis[s[i-1]-NULL]=2;
    23             else if(cnt%k)
    24                 vis[s[i-1]-NULL]=1;
    25             cnt=1;
    26         }
    27     }
    28     if(cnt%k==0&&!vis[s[s.size()-1]-NULL])
    29         ans[++num]=s[s.size()-1],vis[s[s.size()-1]-NULL]=2;
    30     else if(cnt%k)
    31         vis[s[s.size()-1]-NULL]=1;
    32     cnt=1;
    33     for(int i=1;i<=num;++i)
    34         if(vis[ans[i]-NULL]==2)
    35             cout<<ans[i];
    36     cout<<"
    ";
    37     for(int i=1;i<s.size();++i){
    38         if(s[i]==s[i-1])
    39             ++cnt;
    40         else{
    41             if(cnt%k==0&&vis[s[i-1]-NULL]==2){
    42                 int flag=0;
    43                 while(cnt>=k){
    44                     cnt-=k;
    45                     for(int j=i-1-flag*k;j>i-k-flag*k;--j)
    46                         s[j]='A';
    47                     ++flag;
    48                 }
    49             }
    50             cnt=1;
    51         }
    52     }
    53     if(cnt%k==0&&vis[s[s.size()-1]-NULL]==2){
    54         int flag=0;
    55         while(cnt>=k){
    56             cnt-=k;
    57             for(int j=s.size()-1-flag*k;j>s.size()-k-flag*k;--j)
    58                 s[j]='A';
    59             ++flag;
    60         }
    61     }
    62     for(int i=0;i<s.size();++i)
    63         if(s[i]!='A')
    64             cout<<s[i];
    65     return 0;
    66 }
    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    力扣(LeetCode)605. 种花问题
    力扣(LeetCode)463. 岛屿的周长
    力扣(LeetCode)561. 数组拆分 I
    力扣(LeetCode) 263. 丑数
    区块链历史
    力扣(LeetCode) 821. 字符的最短距离
    力扣(LeetCode)804. 唯一摩尔斯密码词
    cmd 查看端口
    nginx windows版 下载和启动
    luogu P1270 “访问”美术馆
  • 原文地址:https://www.cnblogs.com/ldudxy/p/12293601.html
Copyright © 2011-2022 走看看