今日头条笔试

【问题描述】给定一个段落,由 N 个句子组成。第 i 个句子的长度为 L[i],包含的单词个数为 W[i]。
句子不包含任何除字母和空格( ) 外的符号。
每个句子内部,含有若干个单词,由空格( ) 分隔。句子不会包含连续的空格。
随后给定 M 个查询,每个查询包含一个句子,需要在段落中寻找相同单词数量最多的句子。重复的单词只计一次,且不区分大小写。
输入数据将保证结果是存在且唯一的。
输入格式
第一行是两个整数 N 和 M。
接下来的 N+M 行,每行包含一个句子。
前 N 行代表段落中的句子,后 M 行表示查询。
输出格式
输出 M 行,每行代表查询的结果。
这题思路感觉挺简单的,就是要设计下数据结构,需要了解下C++里面的一些数据结构,所以第一次还是做不出来。

//
//  main.cpp
//  toutiao
//
//  Created by Cicie Sun on 2017/10/13.
//  Copyright © 2017年 Cicie Sun. All rights reserved.
//

#include <iostream>
#include <vector>
#include<algorithm>
#include <unordered_set>
using namespace std;

int main()
{

    int n,m;
    cin>>n>>m;
    vector<unordered_set<string>> sentence(0);// 存放句子集合
    vector<string> vec(0);//存放句子以便最后输出
    string str;
    getline(cin,str); //输出一个句子?
    for (int k=0; k<n; k++)//输入N个句子
    {
        getline(cin,str);//这可以输入一个句子
        vec.push_back(str);
        unordered_set<string> tmp;
        tmp.clear();
        string word="";
        for(int i=0;i<str.size();i++)//将句子中的每个词插入tmp 中 str[i]是单词,str整个存放的是句子
        {
            if(str[i]==' ')//?
            {
                if(word.size()>0)
                {
                    transform(word.begin(), word.end(), word.begin(), ::tolower);//word变为小写
                    tmp.insert(word);
                }
                word="";

            }
            else if(str[i]!=' ')
            {
                word+=str[i];
            }
        }
        if(word.size()>0)// 最后一个单词,可能最后一个单词后没有空格
        {
            transform(word.begin(), word.end(), word.begin(), ::tolower);
            tmp.insert(word);
        }
        sentence.push_back(tmp);
    }

    //处理需要匹配的句子
    for (int k=0; k<m; k++)
    {
        getline(cin,str);
        unordered_set<string> tmp;
        tmp.clear();
        string word ="";
        for (int i=0; i<str.size(); i++)
        {
            if(str[i]==' ')
            {
                if(word.size()>0)
                {
                    transform(word.begin(), word.end(), word.begin(), ::tolower);//word变为小写
                    tmp.insert(word);
                }
                word="";
            }
            else if(str[i]!=' ')
            {
                word+=str[i];
            }
        }

        if(word.size()>0)// 最后一个单词,可能最后一个单词后没有空格
        {
            transform(word.begin(), word.end(), word.begin(), ::tolower);
            tmp.insert(word);
        }


        word="";
        int index = 0, mx =0;
        // 在待输入的句子里找匹配
        for (int i=0 ; i<n; i++)
        {
            int count =0;
            for (auto it =tmp.begin(); it!= tmp.end(); it++)//对输入的这个句子的单词遍历
            {
                if(sentence[i].find(*it)!=sentence[i].end())// 如果找到这些词
                {
                    ++count;
                }
            }
            if(count>mx)
            {
                mx=count;
                index=i;
            }
        }
        cout<<vec[index]<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值