【Leetcode819】最常见的单词

Leetcode819 最常见的单词

1.题目

给定一个段落 (paragraph) 和一个禁用单词列表 (banned)。返回出现次数最多,同时不在禁用列表中的单词。

题目保证至少有一个词不在禁用列表中,而且答案唯一。

禁用列表中的单词用小写字母表示,不含标点符号。段落中的单词不区分大小写。答案都是小写字母。

2.解题思路

首先分析题目,得出输入和输出:输入一个字符串段落和一个字符串数组。输出字符串段落中出现次数最多, 并且不在字符串数组里的单词字符串。从题目可知这是一道分析词频的题目。

因为要输出字符串段落中的单词字符串,所以需要字符串拆分(strtok)

因为要采集字符串次数,因此需要使用到字典(dict)和排序(qsort)

因为要确认每个拆分出来的字符串不属于banned列表中,因此每次要进行比较(strcmp)

综上分析,核心解法可以分成:

step1. 拆分字符串(strtok)

step2. 遍历比较当前拆下来的字符串是否在banned中 (strcmp)

step3.1 若在banned中,跳过处理。 step3.2 若不在banned中,则遍历判断是否已经记录在字典中(dict = {word : count})

step4.2.1 若不在字典中,则字典中新增一个({word, count=1})

step4.2.2 若在字典中, 则对应word的count + 1

step5. 按照上述循环完成整个字符串段落的搜索

step6. 对字典的词频进行从大到小排序,并取出词频最大值 count_max所对应的单词。(也可以再遍历一遍字典,筛选出最大值)

再考虑预处理,

pre1. 由于字符串分割时,只能对特定某一种符号进行分割,因此需要将标点符号全转化为空格符号。

pre2. 题目提到banned都是小写字符,因此需要遍历一次数组,将所有大写字母化为小写。

pre3. 题目已经定死段落长度为1000单词以内,单词长度小于10,对于C语言解题时,可以直接写死数组长度。

3.数据结构与算法

数据结构:字典

算法:字符串拆分算法、排序算法

4.字符串拆分 + 定长字典排序

typedef struct {char val[11];int time;
} WordDict;int Cmp (const void* a, const void* b)
{return ((WordDict*)b)->time - ((WordDict*)a)->time;
}char * mostCommonWord(char * paragraph, char ** banned, int bannedSize) {int i;int j;int is_in_banned = 0;   //  是否在banned名单里int is_in_dict = 0;  //     是否已经存在dict里// 预处理while (paragraph[i] != 0) {if (paragraph[i] >= 'A' && paragraph[i] <= 'Z') {// paragraph[i] += ('a' - 'A');paragraph[i] = tolower(paragraph[i]);}if ((paragraph[i] < 'A' || paragraph[i] > 'Z') && ((paragraph[i] < 'a' || paragraph[i] > 'z'))) {paragraph[i] = ' ';}i++;}// 创建词频字典 word,count// 因为不知道多少单词,所以定位为段落的最大值。WordDict para_word_dict[1000];memset(para_word_dict, 0, sizeof(WordDict) * 1000);// 主功能,提取字符串char* temp = strtok(paragraph, " ");// 每次获得新单词时候,int is_in_banned, is_in_dict标记清零while (temp != NULL) {is_in_banned = 0;is_in_word = 0;// 判断是否在banned中for (i = 0; i < bannedSize; i++) {if (strcmp(banned[i], temp) == 0) {is_in_banned = 1;break;}}// 若在banned中,下面if不执行,直接分割下个字符串// 若不在banned中,判断是否在字典中。if (!is_in_banned) {j = 0;is_in_word = 0;// 判断是否在字典中->遍历有序字典到当前字典末端,time = 0 等价于 !valwhile (para_word_dict[j].time != 0 && j < 1000) {if (strcmp(para_word_dict[j].val, temp) == 0) {para_word_dict[j].time++;is_in_word = 1;break;}j++;}// 不在,则新增一个val,timeif (!is_in_word) {strcpy(para_word_dict[j].val, temp);para_word_dict[j].time++;}}// 获取新字符串temp = strtok(NULL, " ");}qsort(para_word_dict, 1000, sizeof(para_word_dict[0]), Cmp);// 输出char* res = (char*)malloc(11);memset(res, 0, 11);strcpy(res, para_word_dict[0].val);return res;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526584.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[LCP28] 采购方案

LCP 28 采购方案 1.题目 小力将 N 个零件的报价存于数组 nums。小力预算为 target&#xff0c;假定小力仅购买两个零件&#xff0c;要求购买零件的花费不超过预算&#xff0c;请问他有多少种采购方案。 注意&#xff1a;答案需要以 1e9 7 (1000000007) 为底取模&#xff0c…

搜索引擎排序DEMO

搜索引擎排序DEMO #include<stdio.h>int lookarr(int* arr, int arrSize) {for (int i 0; i < arrSize; i) {printf("%d, ", arr[i]);}printf("\n"); }int lookarr2(int** arr, int arrSize) {printf("\n");for (int i 0; i < 6;…

[Leetcode16]最接近的三数之和

[Leetcode16]最接近的三数之和 转载自leetcode https://leetcode-cn.com/problems/3sum-closest/ 1.题目 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数&#xff0c;使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在…

高压特种作业考试易错总结

高压上岗证考试&#xff0c;2021年6月考过啦&#xff0c;发出来与大家共勉。 安全&#xff1a; 安全责任 —— 横向到边、纵向到底电工作业人员根据实际情况遵守法规&#xff08;错&#xff0c;&#xff09;应该严格遵守。脱离电源 —— 单手操作&#xff0c;绝缘工具防止电气…

DEEPIN教程 - 本地安装Typora

本地安装Typora 一. 下载Typora安装包 访问https://www.typora.io/#linux路径进行下载。 二. 解压下载的tar.gz文件 tar -xvf Typora-linux-x64.tar.gz三. 将解压后的可执行文件添加到dash路径 1. 首先在解压路径下需要关注如下路径文件。 可执行文件Typora 和 2. 文件夹i…

函数指针史上最全的介绍

函数指针 一. 函数指针的概念 如果在程序中定义了一个函数&#xff0c;那么在编译时系统就会为这个函数代码分配一段存储空间&#xff0c;这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放&#xff0c;这…

C语言调试技巧:stdin,stdout,stderr

stdin,stdout,stderr流 介绍 stdin&#xff0c;stdout&#xff0c;stderr是标准的输入输出流。其中&#xff0c;stdin是访问键盘输入&#xff0c;stdout和stderr分别是向终端输出数据。 关键函数 fscanf/fprintf /* 所在头文件 */ #include <stdio.h>int fscanf(FILE…

C语言调试技巧:main函数输入参数

带入参的main函数 介绍 带入参的main函数主要用于一些基本调试&#xff0c;main函数的入参在main函数里被解析为字符串&#xff0c;因此根据具体的调试业务可以需要将字符串转为相应的int类型或double类型进行其他的操作。 函数实现 // test_mainin.c #include <stdio.h…

[Leetcode456]132模式 - 单调栈

[Leetcode456]132模式 - 单调栈 给你一个整数数组 nums &#xff0c;数组中共有 n 个整数。132 模式的子序列 由三个整数 nums[i]、nums[j] 和 nums[k] 组成&#xff0c;并同时满足&#xff1a;i < j < k 和 nums[i] < nums[k] < nums[j] 。 暴力遍历&#xff0c;…

[Deepin - Pycharm] PyQT5安装配置

[Deepin - Pycharm] PyQT5安装配置 1.环境依赖 python3基础环境&#xff0c; pip下载器 pycharm编辑器 2. 从系统环境中安装pyqt5, qtdesigner >>> pip install pyqt5 >>> sudo apt-get install pyqt5* >>> sudo apt-get install qt5-default …

[Deepin - Pycharm调试记录] Pyinstaller索引系统库问题

Deepin - Pycharm调试记录 - Pyinstaller索引不到系统库 现象 在Pycharm的Terminal中执行Pyinstaller指令时候遇到如下报错提示 OSError: Python library not found: libpython3.7mu.so.1.0, libpython3.7.so.1.0, libpython3.7.so, libpython3.7m.so.1.0, libpython3.7m.so…

Python学习笔记(5):Python如何忽略warning的输出

告警现象 形如下图文的告警信息都可以使用告警屏蔽 添加代码 源代码添加 import warnings warnings.filterwarnings("ignore")命令行执行 python -W ignore file.py可以避免warnings输出影响我们调试&#xff0c;但是不要盲目设置取消输出。因为告警内容可能包…

[Deepin - Pycharm调试记录] Matplot3D动态画图报错问题

Deepin - Pycharm调试记录 - Matplot3D动态画图报错问题 写在开头的话 应该不会有人傻到看这个wiki吧&#xff0c;我花了1个小时才发现问题&#xff0c;是我自己方法调错了。 这个wiki不会细致的教大家如何使用matplotlib进行动态画图&#xff0c;或者动态画图的几种办法&…

【C语言基础】C语言异常捕获机制 - setjmp

C语言异常捕获机制 - setjmp 快速入门 想快速入门该模块请访问&#xff1a;介绍&#xff0c;数据接口&#xff0c;示例代码 介绍 C语言没有C或Java的异常捕获机制&#xff0c;但可以通过setjmp/longjmp实现类似的效果&#xff1a; 使用setjmp保存当前执行环境到jmp_buf&am…

【C语言基础】C语言异常捕获机制 - assert

C语言异常捕获机制 - assert 快速入门 想快速入门该模块请访问&#xff1a;介绍&#xff0c;数据接口&#xff0c;示例代码 介绍 通常一个良好的代码功能运行环境都有功能运行前检查和运行后检查两个方面。&#xff23;语言中提供了assert机制来做这件事情 assert 的作用是…

【c语言数据结构】二叉树

c语言数据结构完全二叉树 快速开始 直接参考示例代码即可 介绍 概念 二叉树&#xff08;Binary tree&#xff09;是树形结构的一个重要类型。 许多实际问题抽象出来的数据结构往往是二叉树形式&#xff0c;即使是一般的树也能简单地转换为二叉树&#xff0c; 二叉树的存…

git 指令全集

git 指令全集 指令集参考这里&#xff0c;后续会继续整理 https://www.runoob.com/git/git-tutorial.html 基本使用流程 场景&#xff11;&#xff1a;建立新仓 首先在本地新建一个仓 ~$ mkdir git_workspace ~$ git init与远程仓建立连接 # 查看所有的远端分支 -$ git rem…

UTHash使用教程

UTHash使用教程 快速入门 想快速入门该模块请访问&#xff1a;介绍&#xff0c;数据接口&#xff0c;示例代码 介绍 Hash &#xff1a;散列&#xff0c;通过关于键值(key)的函数&#xff0c;将数据映射到内存存储中一个位置来访问。这个过程叫做Hash&#xff0c;这个映射函…

【C语言基础】gdb调试工具的使用

gdb调试教程 快速入门 要想快速入门gdb调试&#xff0c;可以直接翻阅基本案例&#xff1a;采内存 介绍 GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。 对于一名Linux下工作的c/c程序员&#xff0c;gdb是必不可少的工具 …

C/C++队列与循环队列

C/C数据结构 - 队列 循环队列 快速入门 介绍 1. 队列的定义 队列是一种线性存储结构&#xff0c;每次对队列的增删操作如下 增&#xff1a;在队列尾部添加元素 删&#xff08;取出&#xff09;&#xff1a;在队列头部删除元素 这种数据存储方式遵循“先进先出”&#xff0…