音乐DJ和回响贝斯

【问题描述】
维亚是一家音乐俱乐部里的音乐DJ,在工作中经常使用Dubstep(回响贝斯)音乐。最近,他决定拿出几首老歌进行混音处理。
假定一首歌的歌词是一句英文句子,为了将Dubstep混录到歌曲里,维亚将一定数量(可以为0)的“WUB”插入到歌词的第一个单词之前、最后一个单词之后(可以为0)、以及两个单词之间(在相邻的一对单词之间至少一个),然后他将所有的单词包括“WUB”合并在一起形成一个混音字符串,在俱乐部里播放。
例如,歌词"I AM X"可以转换为回响贝斯混音“WUBWUBIWUBAMWUBWUBX”,但不能转换为“WUBWUBIAMWUBX”。
有人突发奇想,在听过维亚播放过的混音之后,尝试恢复原始的歌曲,请你帮助他。
【输入形式】
输入为一行非空字符串,由英文字母组成,长度不超过200个字符。表示这是经过混音之后的歌词,输入保证在混入“WUB”之前,原始歌词中不包括“WUB”,且歌词至少包含一个单词。

【输出形式】
输出为一行一个字符串,表示原始的歌词。

【样例输入】
WUBWEWUBAREWUBWUBTHEWUBCHAMPIONSWUBMYWUBFRIENDWUB

【样例输出】
WE ARE THE CHAMPIONS MY FRIEND

解题思路:
先将指定字符串换成空格,在处理空格
处理空格的方式有两种
1、将字符串前移
2、复制带空格的字符串,保证单词之间只有一个空格

注意:
1、空格的ASCII为32
2、了解append()函数

第一种方法:

#include <iostream>
#include <string>
#include <cstring>
#include <stdio.h>
using namespace std;

void space(char* str)
{
	int i, j, k;
	for (i = 0; str[i] != EOF; i++)
	{
		if (str[i] == 32 && str[i + 1] == 32)
		{
			k = i;
			for (j = i; str[j] != EOF; j++)  //连续两个空格后第一个不为空格的字符的位置j
				if (str[j] != 32)
					break;
			for (; str[j] != EOF; j++)  //将j和j以后的字符往前移到第一个空格后
			{
				str[k + 1] = str[j];
				k++;
			}
		}
	}
	if (str[0] == 32)
	{
		for (i = 0; str[i] != EOF; i++)
		{
			str[i] = str[i + 1];
		}
	}
	//puts(str);
	printf("%s", str);
}

int main()
{
	char song[1000];
	cin.get(song, 1000);
	int len = strlen(song);
	for (int i = 0; i < len - 2; i++)  //将WUB换成空格
	{
		if (song[i] == 'W' && song[i + 1] == 'U' && song[i + 2] == 'B')   //空格ASCII为32
		{
			song[i] = 32;
			song[i + 1] = 32;
			song[i + 2] = 32;
			i += 2;
		}
	}
	space(song);
}

第二种方法:

#include <iostream>
#include <string>
using namespace std;

void copy(string str)
{
	string result = "";
	for (int i = 0; str[i] != '\0'; i++)  //如果有两个以上的空格,就不复制
	{
		if (str[i] != 32)
			result.append(1, str[i]);
		else
			if (str[i + 1] != 32)
				result.append(1, str[i]);
	}
	//第一个字符为空格,将字符串前移
	if (result[0] == 32)
	{
		for (int i = 0; result[i] != '\0'; i++)
		{
			result[i] = result[i + 1];
		}	
	}
	cout << result;
}

int main()
{
	string str;
	getline(cin, str);
	for (int i = 0; str[i] != '\0'; i++)
	{
		if (str[i] == 'W' && str[i + 1] == 'U' && str[i + 2] == 'B')   //空格ASCII为32
		{
			str[i] = 32;
			str[i + 1] = 32;
			str[i + 2] = 32;
			i += 2;
		}
	}
	copy(str);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值