今日头条2019万万没想到之聪明的编辑

博客提及双指针思想,类比Leetcode392题目,指出做法不对可能超时,还展示了从网上找来并添加注释的非自己AC的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

双指针思想,就和Leetcode392差不多;

但是这个题如果做法不对的话很可能会超时;

下面这不是我AC的代码,我从网上找的别人的代码;只不过是我加了个注释;

 

#include <iostream>
using namespace std;

char s[1000010];//创建一个比最大字符串长度长的字符数组 
int main()
{
    int t;cin>>t;
    while(t--)
    {
    	//主要是用了一下双指针思想
    	
        cin>>s;
        int k=0;
        for(int i=0;s[i];i++)
        {
            s[k++]=s[i];
			//因为每次是删除一个字符,也就相当于把k向后移动一位
			//这样就相当于把第三个字符删去了;因为第二种情况下是删除aabb的最后一个b字符; 
			//也就是 比如 188899  这样的话就是把第三个8用后面的数值给覆盖了,也就相当于删除了;
			// 			  188 99 
            if(k>=3&&s[k-1]==s[k-2]&&s[k-2]==s[k-3])k--;
            /*
            我开始是这样写的
			if( s[k]==s[k+1]&&s[k+2]==s[k+3]&&k<strlen(s))
			我先说这样写的不好出为什么
			1.这样写一定会超时,因为当时我把循环结束的条件从 s[i]  改为  i<strlen(s); 这样就运行超时了
			2. 这样写很麻烦,而且还容易出错;反正到了最后我也是没有写出来;
			如果有大佬能够这样做出来,希望大佬给我这样做的代码 
			
			*/ 
            if(k>=4&&s[k-4]==s[k-3]&&s[k-2]==s[k-1])k--;
        }
        //因为我们只是覆盖了前面的内容,并不是删除了,所以得加个'\0'来作为结束条件,我不知道为啥string加个'\0',然后输出的就是一个空格,而不是结束的标志; 
		 
        s[k]='\0';
        cout<<s<<endl;
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值