1、统计字符
题目:给定一个英文字符串,请写一段代码找出这个字符串中首先出现的那个英文字符。
我编写的程序如下:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1;
getline(cin, s1); //不能使用cin,因为 cin遇到空格就停止了,比如s1是Have。而getline()是读取一行,遇到回车才停止,s1 是整行字符串,相当于字符串数组。
int num[127] = { 0 }; // 统计某个字符的个数,这种方法不失为好方法
for (decltype(s1.size()) i = 0; i != s1.size(); i++)
{
num[s1[i]]++;
if (((s1[i] >= 'a'&& s1[i] <= 'z') || (s1[i] >= 'A'&& s1[i] <= 'Z')) && (num[s1[i]] == 3))
{
cout << s1[i] << endl;
break;
}
}
return 0;
}
一点说明:定义一个整形数组,初始值全部为。,数组里面的索引是字符表示的 ASCll 码。当出现一次这个字符时,比如说 出现a ,那么num[97]就 +1
2、反转句子
题目:给定一个句子(只包含字母和空格),将句子中的单词位置反转,单词用空格分割,单词之间只有一个空格,前后没有空格,比如:hello xiao mi ->mi xiao hello
代码如下:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
//cout << "请输入几行句子,每行有很多单词组成,单词之间由一个空格组成 :" << endl;
string s1;
vector<string> svec; //输入的是未知数量时,使用 vector
int num = 0;
while (cin >> s1)
{
svec.push_back(s1);
num++;
}
for (int i = num - 1; i != 0; i--) // vector 的下标使用
{
cout << svec[i] << " ";
}
cout << svec[0]<< endl;
return 0;
}
这道题让我很无语,为啥呢?因为我想让输入界面友好一点,在main()函数的开头,写了这么一句:
//cout << "请输入几行句子,每行有很多单词组成,单词之间由一个空格组成 :" << endl;
然后牛客网的编译器识别不出来,判定是错误的。所以说啊,千万不要画蛇添足啊!
3、删除公共字符
输入两个字符串,从第一个字符串中删除第二个字符串中所有的字符,例如,输入They are students“” 和“aeiou”,则删除之后的第一个字符串变成“They r stdnts”
程序如下:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string s1, s2, s3;
getline(cin, s1);
getline(cin, s2);
int num[1000] = { 0 };
for (decltype(s2.size()) i = 0; i < s2.size(); ++i)
{
num[s2[i]]++;
}
for (decltype(s1.size()) j = 0; j < s1.size(); ++j)
{
if (num[s1[j]] != 1)
s3 += s1[j];
}
cout << s3 << endl;
return 0;
}
一点说明:删除公共字符,和第一题统计字符套路类似。你要删除字符,肯定要把那么字符找出来。此外,这一题还利用到了string 类型的加法。s3 虽然是空串,但是是 String 类型,而s1[j] 是char类型的,两者是可以直接相加的。比如下面程序
int main()
{
string s1 = "hello";
char s = 's';
cout << s1 + s << endl;
return 0;
}
输出结果为: