我试图做一个非常常见的面试问题“在字符串中找到最大重复的单词”并且在c / c ++实现中找不到很多网络资源。所以我自己在这里编码。 我试图从头开始编写大部分代码以便更好地理解。 你能查看我的代码并提供我的算法评论。有些人建议使用哈希表来存储计数,但这里没有使用哈希表。
#include<stdafx.h>
#include<stdlib.h>
#include<stdio.h>
#include<string>
#include<iostream>
using namespace std;
string word[10];
//splitting string into words
int parsestr(string str)
{
int index = 0;
int i = 0;
int maxlength = str.length();
int wordcnt = 0;
while(i < maxlength)
{
if(str[i]!= ' ')
{
word[index] = word[index]+str[i];
}
else
{
index++;//new word
wordcnt = index;
}
i++;
}
return wordcnt;
}
//find the max word count out of the array and return the word corresponding to that index.
string maxrepeatedWord(int wordcntArr[],int count)
{
int max = 0;
int index = 0;
for(int i=0;i<=count;i++)
{
if(wordcntArr[i] > max)
{
max = wordcntArr[i];
index = i;
}
}
return word[index];
}
void countwords(int count)
{
int wordcnt = 0;
int wordcntArr[10];
string maxrepeatedword;
for(int i=0;i<=count ;i++)
{
for(int j=0;j<=count;j++)
{
if(word[i]==word[j])
{
wordcnt++;
//word[j] = "";
}
else
{}
}
cout<<" word "<< word[i] <<" occurs "<< wordcnt <<" times "<<endl;
wordcntArr[i] = wordcnt;
wordcnt = 0;
}
maxrepeatedword = maxrepeatedWord(wordcntArr,count);
cout<< " Max Repeated Word is " << maxrepeatedword;
}
int main()
{
string str = "I am am am good good";
int wordcount = 0;
wordcount = parsestr(str);
countwords(wordcount);
}
答案 0 :(得分:4)
仅仅为了比较,最明显的方法是C ++:
#include <map>
#include <string>
#include <iostream>
#include <sstream>
int main()
{
std::istringstream input("I am am am good good");
std::map<std::string, int> count;
std::string word;
decltype(count)::const_iterator most_common;
while (input >> word)
{
auto iterator = count.emplace(word, 0).first;
++iterator->second;
if (count.size() == 1 ||
iterator->second > most_common->second)
most_common = iterator;
}
std::cout << '\"' << most_common->first << "' repeated "
<< most_common->second << " times\n";
}
看到它运行here。
注意:
map::emplace
返回pair<iterator,bool>
,表示单词&amp;它的数量在map
,以及是否新插入。我们只关心 where 所以捕获emplace(...).first
。
当我们更新计数时,我们会检查是否使该单词成为目前为止看到的最常见单词。如果是这样,我们将迭代器复制到局部变量most_common
,因此我们记录了目前最常见的单词及其计数。
你正在做的一些值得思考的事情:
word
是一个全局变量 - 将事物作为函数参数传递是一个好习惯,除非它非常不方便,这意味着代码可以更容易地从异步信号处理程序或其他线程中重用,并且在查找中更为明显在函数调用站点,输入和输出可能是什么。按原样,通话countwords(wordcount)
使其看起来像countwords'唯一的输入是int wordcount
。std::string::operator+=(char)
更简洁地追加char
ala my_string += my_char;
一般来说,你的代码非常合理,并且对迭代和解决问题有很好的理解,所有这些都是非常低级的,但这是一个非常实用的理解的好东西。
答案 1 :(得分:0)
void mostRepeat(string words[], int n)
{
int hash[n]={0};
for(int j=0; j<n; j++)
{
for(int i=0; i<n; i++)
{
if(words[j]==words[i]) hash[j]++;
}
}
int maxi = hash[0];
int index = 0;
for(int i=0; i<n; i++)
{
if(maxi<hash[i])
{
maxi=hash[i];
index = i;
}
}
cout<<words[index]<<endl;
}
完整计划:Link
答案 2 :(得分:0)
import java.util.*;
public class StringWordDuplicates {
static void duplicate(String inputString){
HashMap<String, Integer> wordCount = new HashMap<String,Integer>();
String[] words = inputString.split(" ");
for(String word : words){
if(wordCount.containsKey(word)){
wordCount.put(word, wordCount.get(word)+1);
}
else{
wordCount.put(word, 1);
}
}
//Extracting of all keys of word count
Set<String> wordsInString = wordCount.keySet();
for(String word : wordsInString){
if(wordCount.get(word)>1){
System.out.println(word+":"+wordCount.get(word));
}
}
}
public static void main(String args[]){
duplicate("I am Java Programmer and IT Server Programmer with Java as Best Java lover");
}
}