题解 | #万万没想到之聪明的编辑#

万万没想到之聪明的编辑

https://www.nowcoder.com/practice/42852fd7045c442192fa89404ab42e92

其实就是对连续出现的字符数进行统计的一个问题
假设A字符连续出现了m个,A字符后面紧接的字符B出现了n个
然后就是状态判断了
如果 m > 2,(也就是先判断了 AAA类型,然后再判断AABB类型)
一定输出两个A字符
接下来判断n的个数是否大于1,如果大于1,再输出一个B字符
然后循环的i的结果要挪到连续B字符最后的一个位置
如果不满足上面的任何一种情况,直接输出结果当前循环的字符即可

#include<bits/stdc++.h>
using namespace std;

string getAns(string s)
{
    // 优先从到右判断
    string ans = "";
    int len = s.length();
    for(int i = 0; i < len; ++i){
        int pre_count  = 0;
        int last_count = 0;
        int mid        = i;
        int temp       = i;
        if(mid < len - 1 && s[mid] == s[mid + 1]){
            ++mid;
            pre_count += 1;
            while(mid < len && s[mid] == s[i]){
                ++pre_count;
                ++mid;
                //printf("s[%d] = %c, s[%d] = %c \n",mid,s[mid],i,s[i]);
                if( mid < len-1 && s[mid] != s[i] && s[mid] == s[mid+1]){
                    // 连续的第一个不相同的字符
                    temp = mid;
                    last_count = 1;
                    while(mid < len && s[mid] == s[temp]){
                        ++mid;
                        ++last_count;
                    }
                    break;
                }
            }
            ans = ans + s[i] + s[i];
            if(last_count > 0){
                ans = ans + s[temp];
            }
            i = mid - 1;
        }else{
            ans = ans + s[i];
        }
    }
    return ans;
}

signed main(void)
{
    int t;
    cin>>t;
    while(t--)
    {
        string s;
        cin>>s;
        if(s.length() < 3){
            cout<<s<<endl;
            continue;
        }
        cout<<getAns(s)<<endl;
    }
}



#字节面试笔试手撕算法#
全部评论

相关推荐

02-05 08:49
已编辑
武汉大学 Java
野猪不是猪🐗:36k和36k之间亦有差距,ms的36k和pdd的36k不是一个概念
点赞 评论 收藏
分享
野猪不是猪🐗:现在的环境就是这样,供远大于求。 以前卡学历,现在最高学历不够卡了,还要卡第一学历。 还是不够筛,于是还要求得有实习、不能有gap等等... 可能这个岗位总共就一个hc,筛到最后还是有十几个人满足这些要求。他们都非常优秀,各方面都很棒。 那没办法了,看那个顺眼选哪个呗。 很残酷,也很现实
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客企业服务