@Pinetrie
2019-01-25T20:06:53.000000Z
字数 1879
阅读 945
题意:对一组整数进行排序,排序后找出给定数字在数组中的位置。
题解:对数据进行排序然后再查找。查找可以用二分也可以不用二分。
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int i,n,m,x,cas = 0;
while(scanf("%d %d",&n,&m) && n && m)
{
vector<int>num;
printf("CASE# %d:\n",++cas);
for(i = 1; i <= n; i++)
{
int a;
scanf("%d",&a);
num.push_back(a);
}
sort(num.begin(),num.end());
while(m--)
{
scanf("%d",&x);
int p = lower_bound(num.begin(),num.end(),x) - num.begin();
if(num[p] == x)
{
printf("%d found at %d\n",x,p + 1);
}
else
printf("%d not found\n",x);
}
}
return 0;
}
题意:将一个文本中的所有单词找出来排序后输出,不能重复。
题解:用set的去重加排序功能很轻松,难的地方的如何把单词从文本中提取出来。可以用2个string类,s1和s2,s2开始为空,对输入的s1中的字符一个一个判断,如果是小写字母则直接加入s2中,如果是大写字母则转化成小写字母后再加入s2中,其他类型的字符则不管。
#include <cstdio>
#include <cstring>
#include <set>
#include <iostream>
using namespace std;
set<string>words;
int main()
{
string s1,s2;
while(cin>>s1)
{
s2 = "";
for(int i = 0; i <= s1.size(); i++)
{
if(s1[i] >= 'A' && s1[i] <= 'Z')
s2 += s1[i] + 32;
else if(s1[i] >= 'a' && s1[i] <= 'z')
s2 += s1[i];
else if(s2.size() > 0)
{
words.insert(s2);
s2 = "";
}
}
}
set<string>::iterator it;
for(it = words.begin();it != words.end();it++)
{
cout<<*it<<"\n";
}
return 0;
}
题意:给出一系列单词,找出其中的特殊单词(将该单词的字母重排后无法在给出的单词 中找到相同的单词,不区分大小写),然后按字典序输出。
题解:用一个string到string的映射表示标准化后的字符串(字符串中不存在小写字母且 字母按字典序排列),一个字符到数字的映射表示该标准化后的字符串出现的次数 ,最好把标准化后出现一次的字符串加入vector中排序后输出。
#include <bits/stdc++.h>
using namespace std;
vector<string>words; //存原单词
vector<string>ans_words; //存要输出的单词
map<string,int>time_words; //字符串到出现次数的映射
map<string,string>change; //字符串到标准化字符串的映射
int main()
{
string s1,s2;
while(cin>>s1)
{
if(s1 == "#") break;
s2 = "";
words.push_back(s1);
for(int i = 0;i < s1.size();i++) //将s1中的字母转换成小写
{
if(s1[i] >= 'A' && s1[i] <= 'Z')
s2 += s1[i] + 32;
else
s2 += s1[i];
}
sort(s2.begin(),s2.end()); //将s2中的字符按字典序排列
change[s1] = s2;
time_words[s2]++;
}
for(int i = 0;i < words.size();i++) //找出可以输出的字符串
{
if(time_words[change[words[i]]] == 1)
ans_words.push_back(words[i]);
}
sort(ans_words.begin(),ans_words.end());
for(int i = 0;i < ans_words.size();i++)
cout<<ans_words[i]<<endl;
return 0;
}