关于acm程序设计书中题目 #B第二题

来源:互联网 发布:37蓝月翅膀升级数据 编辑:程序博客网 时间:2024/04/29 11:43
 这次的题都是英文题,读的时候依然生涩难懂,尤其是刚上来从第一题开始看,连谷歌翻译都用上了就是觉得迷迷糊糊,干脆就把这题扔下了,找起简单点的先做。
 #B 第二题:
 第二题要求编出一个字典,一个字符串与另一个字符串要刚好对应。
 做题时不熟悉map容器的用法,我最开始的想法  一是建一个string数组,用getline存入一整行,将字典存储。在调用时用find()函数循环查找。二是建立两个string数组,
使他们的每个元素对应,将字典存储。调用时用compare()函数循环比较筛选出来。
 写出来代码如下:
 #include<iostream>
#include<string>
using namespace std;
#include<cstdio>
int main()
{
 
 string a[10005];
 string b[100],c[100];
 int i=0,j=0,k,m;
 while(getline(cin,a[i]))
 {
  if(a[i].size()==0) break;
  i++;
 }
 while(getline(cin,b[j]))
 {
  if(b[j].size()==0) break;
  for(k=0;k<i;k++)
  {
   if(a[k].find(b[j])!=string::npos)
   {
    m=a[k].find(b[j]);
    c[j]=a[k].substr(0,m);
   }
   else c[j]="eh";
  }
  j++;
 }
 for(i=0;i<j;i++)
  cout<<c[i]<<endl; 
 return 0;
}
 我认为这两个思路并没有什么错误,但是从算法的角度来讲,这肯定不好的,无论哪一个循环起来都太费时了,远不如map来的简单。
 在一个我误解了题意,当成了先输入n行在输出n行。
 使用map就简单了许多,至于要将map定义为两个string类型的映射,分别存储两种语言就好,调用时也省去了循环,更加快捷。
 代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
 map<string,string>m;
 string a,ai,bi;
 int ii,n;
 
 while(getline(cin,a))
 {
  if(a=="") break;
  n=a.size();
  ii=a.find(" ");
  ai=a.substr(0,ii);
  bi=a.substr(ii+1,n-ii);
  m[bi]=ai;
 }
 while(getline(cin,ai))
 {
  if(m.count(ai))
  cout<<m[ai]<<endl;
  else cout<<"eh"<<endl;
 }
 return 0;
}







2 0
原创粉丝点击