牛客网三道编程题(三 之华为机试在线训练(二)字符串反转、统计不同字符个数、删除字符串中出现最少的字符
程序员文章站
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)就好了
上一篇: jquery怎么判断对象是否存在
下一篇: jquery怎么判断input是否为空