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

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)就好了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值