[关闭]
@Pinetrie 2019-01-25T20:06:53.000000Z 字数 1879 阅读 945

A - vector的使用

题意:对一组整数进行排序,排序后找出给定数字在数组中的位置。
题解:对数据进行排序然后再查找。查找可以用二分也可以不用二分。

  1. #include <stdio.h>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5. int main()
  6. {
  7. int i,n,m,x,cas = 0;
  8. while(scanf("%d %d",&n,&m) && n && m)
  9. {
  10. vector<int>num;
  11. printf("CASE# %d:\n",++cas);
  12. for(i = 1; i <= n; i++)
  13. {
  14. int a;
  15. scanf("%d",&a);
  16. num.push_back(a);
  17. }
  18. sort(num.begin(),num.end());
  19. while(m--)
  20. {
  21. scanf("%d",&x);
  22. int p = lower_bound(num.begin(),num.end(),x) - num.begin();
  23. if(num[p] == x)
  24. {
  25. printf("%d found at %d\n",x,p + 1);
  26. }
  27. else
  28. printf("%d not found\n",x);
  29. }
  30. }
  31. return 0;
  32. }

B - set的使用

题意:将一个文本中的所有单词找出来排序后输出,不能重复。
题解:用set的去重加排序功能很轻松,难的地方的如何把单词从文本中提取出来。可以用2个string类,s1和s2,s2开始为空,对输入的s1中的字符一个一个判断,如果是小写字母则直接加入s2中,如果是大写字母则转化成小写字母后再加入s2中,其他类型的字符则不管。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <set>
  4. #include <iostream>
  5. using namespace std;
  6. set<string>words;
  7. int main()
  8. {
  9. string s1,s2;
  10. while(cin>>s1)
  11. {
  12. s2 = "";
  13. for(int i = 0; i <= s1.size(); i++)
  14. {
  15. if(s1[i] >= 'A' && s1[i] <= 'Z')
  16. s2 += s1[i] + 32;
  17. else if(s1[i] >= 'a' && s1[i] <= 'z')
  18. s2 += s1[i];
  19. else if(s2.size() > 0)
  20. {
  21. words.insert(s2);
  22. s2 = "";
  23. }
  24. }
  25. }
  26. set<string>::iterator it;
  27. for(it = words.begin();it != words.end();it++)
  28. {
  29. cout<<*it<<"\n";
  30. }
  31. return 0;
  32. }

C - map的使用

题意:给出一系列单词,找出其中的特殊单词(将该单词的字母重排后无法在给出的单词 中找到相同的单词,不区分大小写),然后按字典序输出。
题解:用一个string到string的映射表示标准化后的字符串(字符串中不存在小写字母且 字母按字典序排列),一个字符到数字的映射表示该标准化后的字符串出现的次数 ,最好把标准化后出现一次的字符串加入vector中排序后输出。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. vector<string>words; //存原单词
  4. vector<string>ans_words; //存要输出的单词
  5. map<string,int>time_words; //字符串到出现次数的映射
  6. map<string,string>change; //字符串到标准化字符串的映射
  7. int main()
  8. {
  9. string s1,s2;
  10. while(cin>>s1)
  11. {
  12. if(s1 == "#") break;
  13. s2 = "";
  14. words.push_back(s1);
  15. for(int i = 0;i < s1.size();i++) //将s1中的字母转换成小写
  16. {
  17. if(s1[i] >= 'A' && s1[i] <= 'Z')
  18. s2 += s1[i] + 32;
  19. else
  20. s2 += s1[i];
  21. }
  22. sort(s2.begin(),s2.end()); //将s2中的字符按字典序排列
  23. change[s1] = s2;
  24. time_words[s2]++;
  25. }
  26. for(int i = 0;i < words.size();i++) //找出可以输出的字符串
  27. {
  28. if(time_words[change[words[i]]] == 1)
  29. ans_words.push_back(words[i]);
  30. }
  31. sort(ans_words.begin(),ans_words.end());
  32. for(int i = 0;i < ans_words.size();i++)
  33. cout<<ans_words[i]<<endl;
  34. return 0;
  35. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注