删除字符串中间的*---C++

问题描述

输入一个字符串,将串前和串后的星号保留,而将中间的星号删除。

如果整个字符串都为星号则原样输出。

输入描述:

一个含星号的字符串(长度不超过300)。

输出描述:

删除了串中星号的字符串。

输入样例:

***ABC123**123*abc**

输出样例:

***ABC123123abc**


题解

删除字符串中间的*,保留两旁的*。那么就可以先将串两旁的*忽略不计,枚举*中间的所有字符,将中间的第一个字符看做s[k1],最后一个字符看做s[k2];那么这段代码就是这样:

for (int i=0;i<len;i++) //len表示字符串的长度,下面一样
	  if (s[i]!='*') {
	  	 k1=i;
	  	 break;
	  }
	for (int i=len-1;i>=k1;i--)
	  if (s[i]!='*') {
	  	 k2=i;
	  	 break;
	  }

将中间的起始k1和结束k2找到之后,就可以直接开始缩串了。我这里的思路是:将k1~k2所有字符进行枚举,若发现一个*,就将字符串的这一个元素变成空位;那么这段代码就是这样:

for (int i=k1;i<=k2;i++) {
		if (s[i]=='*') {
			s[i]=' ';
		}
	}

最后,只要输出不为空位的字符串就可以了:

for (int i=0;i<len;i++) 
	  if (s[i]!=' ') cout<<s[i];

这样组合起来呢,其实不能拿满分,严苛的测试数据会扣个10/20分左右。

若这个字符串全部都是*,按这种思路,就只能输出len-1个*;那么可以在开头做一个假设法:

bool flag=true;
	for (int i=0;i<s.size();i++)
	 if (s[i]!='*') {
	 	flag=false;
	 	break;
	 }
	if (flag==true) {
		cout<<s;
		return 0;
	}

AC的代码就是这样:

#include <bits/stdc++.h>
using namespace std;
int k1,k2; 
string s;
int main() {
	cin>>s;
	int len=s.size();
	bool flag=true;
	for (int i=0;i<s.size();i++)
	 if (s[i]!='*') {
	 	flag=false;
	 	break;
	 }
	if (flag==true) {
		cout<<s;
		return 0;
	}
	for (int i=0;i<len;i++) 
	  if (s[i]!='*') {
	  	 k1=i;
	  	 break;
	  }
	for (int i=len-1;i>=k1;i--)
	  if (s[i]!='*') {
	  	 k2=i;
	  	 break;
	  }
	for (int i=k1;i<=k2;i++) {
		if (s[i]=='*') {
			s[i]=' ';
		}
	}
	for (int i=0;i<len;i++) 
	  if (s[i]!=' ') cout<<s[i];
	return 0;
}

好了,今天就到这里了,再见!

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值