题目1:反片语
思路:
由于有了上篇博客题目中的经验,遇到不区分大小写,那就在判断时用临时变量保存调用tolower()函数转变成小写形式的字符串
1.可以写一个函数对每个单词标准化:全部转化为小写字母,然后再对字母排序
2.用map统计标准化每个单词出现的次数,标准化之后题目中能通过字母重排的单词相同
3.保存单词出现次数为1的原单词
4.对保存的单词进行字典排序,然后打印出来
代码实现:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
//定义关联数组map用于统计每个单词出现的次数
map<string,int> timesOfWord;
//定义一个可变数组用于保存原单词
vector<string> words;
//标准化每个单词
/* 注意:这个函数的定义不能直接返回引用,因为题目要求最终输出要保留输入中的大小写
void standardizeWord(string &word)
*/
//所以我们可以传入引用,在函数内部进行拷贝,然后返回拷贝的string对象
string standardizeWord(const string &word)
{
//定义变量保存标准化的单词
string standardWord = word;
//遍历单词的每个字符,将每个字符转换成小写
for(unsigned int i=0;i < word.length();i++)
{
tolower(standardWord[i]);
}
//对单词内的字符进行排序
sort(standardWord.begin(),standardWord.end());
return standardWord;
}
int main() {
//定义一个变量用于保存用户输入的单词 注意:这道题目要求用户输入的是单词,所以除过结束字符'#'和字母字符没有其他字符
string inputText;
//执行一次循环cin每次读取多少字符?用什么标识来决定?
//循环结束的标志:EOF Unix和Linux:ctrl+D windows:ctrl+Z和Enter
//循环读取用户输入的单词
while(cin >> inputText)
{
//遇到用户输入的结束符‘#’就结束循环
if(inputText[0] == '#')
break;
//将单词保存在vector当中,用于最后进行输出
words.push_back(input