欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

牛客网三道编程题(三 之华为机试在线训练(二)字符串反转、统计不同字符个数、删除字符串中出现最少的字符

程序员文章站 2022-04-04 20:06:13
...

1、字符串反转

        这道题目非常简单,但是有一个地方需要强调一下:对于string 类型,它的size()返回值并不是 int 类型,而是string::size_type 类型,它是一个无符号类型的值。因此不能使它出现负值,不然可能会出现未知错误。切记:在C++ Primer 书中强调了,如果在表达式中出现了带符号数和无符号数混合使用,会产生意想不到的后果。比如,假设 n 是一个带有负值的 int ,则表达式 s.size() < n 几乎就是 True, 这是因为负数 n 会自动转换成一个非常大的无符号数。

牛客网三道编程题(三 之华为机试在线训练(二)字符串反转、统计不同字符个数、删除字符串中出现最少的字符

程序如下:
int main()
{
	string s;
	getline(cin, s);
	for (auto i = s.size() - 1; i > 0; i--)
	{
		cout << s[i];
	}
	cout << s[0];
	return 0;
}
如果使用了auto 关键字,那么对于首字符最好单独输出。我第一次没有把首字符单独输出,就发生了一个非常奇怪的错误。于是,把auto 改成 int 以后,就没有那种问题。如果用迭代器程序还可以这么写,效率更高:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
    {
    string s;
    getline(cin,s);
    reverse(s.begin(),s.end());
    cout<<s<<endl;
    return 0;
}

2、统计不同字符的个数

        这道题目也很简单,它的套路和之前几题很相似。先定义一个整型数组,数组的下标索引是字符(实际是 ASCLL 码)
牛客网三道编程题(三 之华为机试在线训练(二)字符串反转、统计不同字符个数、删除字符串中出现最少的字符

3、删除字符串中出现次数最少的字符(可能不止一个)
牛客网三道编程题(三 之华为机试在线训练(二)字符串反转、统计不同字符个数、删除字符串中出现最少的字符
代码如下:
#include <iostream>
using namespace std;
 
int main()
{
    string s;
 while(cin>>s)
 { 
    int a[26]={0};
    int i=0,min;
    while(s[i])
    {  a[s[i]-'a']++;
       i++;
    }
    min=a[s[0]-'a'];
    for(i=1;i<s.size();i++)
    {
        if(a[s[i]-'a']<min)
         {
            min=a[s[i]-'a'];
         }
          
       
    }
    for(i=0;i<s.size();i++)
        if(a[s[i]-'a']>min)
            cout<<s[i];
    cout<<endl;
 } 
}
一点说明:刚开始我写的是 getline(cin,s)。但是提示错误,后来改成 while(cin >> s)就好了