zoukankan      html  css  js  c++  java
  • Leetcode 884. 两句话中的不常见单词

    题目:

      给定两个句子 A 和 B 。 (句子是一串由空格分隔的单词。每个单词仅由小写字母组成。)

      如果一个单词在其中一个句子中只出现一次,在另一个句子中却没有出现,那么这个单词就是不常见的。

      返回所有不常用单词的列表。

      您可以按任何顺序返回列表。

      示例 1:

      输入:A = "this apple is sweet", B = "this apple is sour"
      输出:["sweet","sour"]

    理解:

      这是一道简单题目,但是很多地方需要巩固,故记录!

      思路很简单:

        1.将句子分割成一个一个的单词;

        2.统计A和B句子中的各单词数量;

        3.寻找其不常见单词。

      主要的问题是,如何分割,想到的是split函数,但是C++中如何分割?另外,通缉单次的数量,我们常用的是map结构,如何做?

    strtok函数

      strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针 

      该函数包含在"string.h"头文件中
      函数原型:

    1. char* strtok (char* str,constchar* delimiters );

       函数功能:

        切割字符串,将str切分成一个个子串
      函数参数:
        str:在第一次被调用的时间str是传入需要被切割字符串的首地址;在后面调用的时间传入NULL。
        delimiters:表示切割字符串(字符串中每个字符都会 当作分割符)。
      函数返回值:
        当s中的字符查找到末尾时,返回NULL;
        如果查不到delimiter所标示的字符,则返回当前strtok的字符串的指针。


      插曲:

        string和char数组的相互转换:

          而char数组转换成string类型,可以直接复制

         类似于  A = A1;


          使用的时候,处理的字符必须是一个char数组类型,并且不能是指针;

           统计的时候,只许设计两个map,分别为map<string,int>,注意,map中是不可以定义指针类型的,因此,map<char*,int>是不对的!

        最后在计算的时候,遍历A和B的map中是否符合,用一个vector进行记录结果即可!

        具体代码如下: 

     1 #include<iostream>
     2 #include<string>
     3 #include <map>
     4 #include <vector>
     5 using namespace std;
     6 int main()
     7 {
     8     string A,B;
     9     //cin >> A >> B;
    10     A = "this apple is sweet";
    11     B = "this apple is sour";
    12     //分割
    13     vector<string> res;
    14 
    15     char A1[210];
    16     strcpy(A1, A.c_str()); //将string A转化为char* A1[];
    17 
    18     char B1[210];
    19     strcpy(B1, B.c_str());
    20     map<string, int> ma;
    21     map<string, int> mb;
    22     string tmp;
    23     //统计
    24     char *tokenPtr = strtok(A1, " ");//sentence必须是一个char数组,不能是定义成指针形式
    25     while (tokenPtr != NULL) {
    26         ma[tokenPtr]++;
    27         tokenPtr = strtok(NULL, " ");
    28     }
    29     tokenPtr = strtok(B1, " ");//sentence必须是一个char数组,不能是定义成指针形式
    30     while (tokenPtr != NULL) {
    31         mb[tokenPtr]++;
    32         tokenPtr = strtok(NULL, " ");
    33     }
    34     //对比
    35     //map<string> ma和mb中的不常用单词
    36     map<string, int>::iterator it;
    37     for (it = ma.begin(); it != ma.end(); it++)
    38     {
    39         if (it->second == 1 && mb[it->first] == 0)
    40             res.push_back(it->first);
    41     }
    42 
    43     for (it = mb.begin(); it != mb.end(); it++)
    44     {
    45         if (it->second == 1 && ma[it->first] == 0)
    46             res.push_back(it->first);
    47     }
    48 
    49     //输出结果
    50     for (int i = 0; i < res.size(); i++)
    51     {
    52         cout << res[i] << endl;
    53     }
    54 }

      记录,以供学习~~~

  • 相关阅读:
    coredump分析
    Sword LRU算法
    C++ STL迭代器失效问题
    Sword DB主从一致性的解决方法
    Sword CRC算法原理
    C语言 按位异或实现加法
    Linux 等待信号(sigsuspend)
    C语言 宏定义之可变参数
    Linux shell字符串操作
    C++ *和&
  • 原文地址:https://www.cnblogs.com/cnyulei/p/11934098.html
Copyright © 2011-2022 走看看