美团研发岗笔试真题练习(编程题1)——删除单个连续重复字符串

day1:代码题第一题

题目:
将给定的字符串,按照规则删除字符,输出删除后的字符串。删除规则为:相同字符连续,则删除,如”aaaab”删除后的字符串为”b” ,若删除后为空或输入无效则输出"no"。注:仅是单个字符连续才删除,如babababa则不能删除。

输入描述:
输入数据有多组,每组一行,仅包含数字和英文字母,不包含转义等其他特殊字符,输入数据最大长度为10;
输出描述:
对于每个测试实例,要求输出按规则删除后的数据,每个测试实例的输出占一行。如果删除后有字符,直接输出删除后的字符;如果删除后为空,则输出”no”

示例1
输入
a
aaaaabbbb
输出
a
no

分析:
输入无效和输入为单个字符时特殊处理;
其他字符就是比较前一个字符与后一个字符是否一样,若一样则跳过,否则就将该字符存到结果字符串里;
对于 首字符与尾字符也要注意特殊处理
首字符特殊处理是因为主循环比较赋值是从第二个字符开始的;
如果有像aaabaab这种情况的,在重复字符串的下标自加后会多出一个1,所以要处理重复字符串处的下标,令其-1;

伪代码:

定义字符串s,r;
int main()
{
	while(输入为真)
	{
		处理输入无效字符:输出“no”;
		处理输入为单个的字符:原样输出;
		处理首字符;
		处理第1~n个字符:若有重复字符,则最后的下标j要减去1,否则继续j++存值;

		在r里从r[0]开始截取j个字符放到result里;
		如果re不为空
			则输出re;
		否则
			输出“no”;
	}
	return 0;
}

代码:
方法一:

#include
#include
using namespace std;

int main()
{
	string s;
	char r[100];
	while(getline(cin, s))
	{	
		int j=0;
		int last = j;
		int len = s.size();
		if(len == 0)
		{
			cout<<"no"<<endl;
			continue;//终止本次循环
		}
		if(len == 1)
		{
			cout<<s<<endl;
			continue;//终止本次循环
		}
		if (s[0] != s[1])//处理首字符
            r[j++] = s[0];
		for(int i=0;i<len-1;i++)//从第二个字符开始处理
		{
			if(s[i] != s[i+1])//与前一个不相同则存到结果字符串里
			{
				r[j++] = s[i+1];
				last = j-1;
			}
			else//否则不存储继续遍历
			{
				j = last;//有重复的时候这个j值就要在之前++的基础上减一了
			}
		}
		string result(r, r + j);
		if(result.size() == 0)
			cout<<"no"<<endl;
		else
			cout<<result<<endl;
	}

	return 0;
}

方法二:

//分析:左右两边都不相同,就保留,第一个和最后一个特殊处理一下就好了
while True:
    try:
        input_str = input()
        result = ""
        for i in range(len(input_str)):
            if len(input_str) == 1:
                result = input_str
                break
            if i == 0:
                if input_str[i + 1] != input_str[i]:
                    result = result + input_str[i]
            elif i == len(input_str) - 1:
                if input_str[i - 1] != input_str[i]:
                    result = result + input_str[i]
            else:
                if input_str[i - 1] != input_str[i] and input_str[i + 1] != input_str[i]:
                    result = result + input_str[i]
        if len(result) == 0:
            print("no")
        else:
            print(result)
    except:
        break

笔记:

  1. C语言中输入字符和字符串
    C语言有多个函数可以从键盘获得用户输入,它们分别是:
    scanf("%d", &str);:和 printf() 类似,scanf() 可以输入多种类型的数据。
    str = getchar();getche()getch():这三个函数都用于输入单个字符。
    gets(str);:获取一行数据,并作为字符串处理。
  2. C++中输入字符和字符串
    cin>>str;最常用、最基本的用法,输入一个数字或字符
    cin.get(str);可以用来接收字符
    cin.get(str,10);用来接收一行字符串,可以接收空格
    cin.getline(str, 10); 接受一个字符串,可以接收空格并输出
    getline(cin, str); 接受一个字符串,可以接收空格并输出,需包含“#include”。例如:string str; getline(cin,str);
    string str; cin >> str;也是输入字符串操作吧,同样需包含“#include
    同时兼容C的输入操作。
    字符串构造函数:
//定义
string str1( 5, 'c' );
string str2( "Now is the time..." );
string str3( str2, 11, 4 );
//输出
cout<<str1<<endl<<str2<<endl<<str3<<endl;
//结果
>>> ccccc
>>> Now is the time...
>>> time

你可能感兴趣的:(笔试题,C++)