统计单词次数
题目链接:https://ac.nowcoder.com/acm/contest/19306/1045只能想到大小写转换跟find统计出现次数跟首位置,不知道怎么写了,代码有注释,不然菜菜看不懂 这道题可以使用哈希表来统计单词出现的次数。具体步骤如下:
1. 遍历字符串,将每个单词转换为小写,并统计每个单词出现的次数。
2. 将统计结果按照出现次数从大到小排序,如果出现次数相同,则按照单词在原字符串中出现的位置从小到大排序。
下面是代码实现及注释:
# -*- coding:utf-8 -*-
import re
# 定义一个哈希表来保存单词出现的次数
word_count = {}
# 读入字符串
s = input().strip()
# 将字符串中的单词转换为小写,并统计出现次数
for word in re.findall(r'\b\w+\b', s):
word = word.lower()
if word in word_count:
word_count += 1
else:
word_count = 1
# 将统计结果按照出现次数从大到小排序,如果出现次数相同,则按照单词在原字符串中出现的位置从小到大排序
word_count = sorted(word_count.items(), key=lambda x: (-x, s.find(x)))
# 输出结果
for word, count in word_count:
print(word, count)
希望能帮到你! 问题分析:
题目要求统计给定字符串中某个单词出现的次数以及首次出现的位置。我们可以通过以下步骤来解决这个问题:
1. 将字符串中的所有字母转换为小写,以便进行大小写不敏感的匹配。
2. 使用find函数找到第一个匹配单词的位置,并记录下来。
3. 使用find函数查找下一个匹配单词的位置,直到找不到为止,同时累加匹配次数。
4. 输出匹配次数和首次出现的位置。
代码实现:
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
getline(cin, str); // 读取输入的一行字符串
string word;
cin >> word; // 读取单词
// 将字符串和单词都转换为小写
transform(str.begin(), str.end(), str.begin(), ::tolower);
transform(word.begin(), word.end(), word.begin(), ::tolower);
int count = 0; // 单词出现次数
int pos = -1; // 单词首次出现的位置
while ((pos = str.find(word, pos + 1)) != string::npos) {
if (count == 0) {
pos++; // 调整位置索引,从1开始计数
}
count++;
}
cout << count << " " << pos << endl;
return 0;
}
代码说明:
1. 首先通过getline函数读取一行输入的字符串。
2. 然后使用cin读取要统计的单词。
3. 使用transform函数将字符串和单词都转换为小写。
4. 初始化单词出现次数count为0,首次出现位置pos为-1。
5. 在循环中使用find函数查找下一个匹配单词的位置,并更新pos。
6. 如果是首次匹配,将pos加1调整索引位置。
7. 统计次数count++。
8. 输出最终的次数和位置。
示例输入:
This is a test string for testing purposes!
test
示例输出:
2 11
在给定的字符串中,单词"test"出现了两次,第一次出现在位置11。
球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页:
[1]