2015-08-14 44 views
0

我必須在javascript中編寫單個函數。Javascript函數將分析字符串中的單詞嗎?

  1. 發生在一個字符串(完整的句子)。
  2. 分析哪些詞有重複字母 (即兔,愉快,在那裏,等)的最高計數。
  3. 屢封不必是連續的。
  4. 返回一個(或更多,如果出現平局)字(s)表示,曾反覆最高的信計數陣列格式。

實施例:

console.log(letterRepeat("Hello there Mr. Gormoon!)); 

輸出:

{Gormoon} 

到目前爲止我已經創建了將第一分割的話,那麼字母的函數:

var wordSelector = function(str){ 
var wordArray = []; 
wordArray.push(str.split(" ").map(function(word) { 
    return word.split(""); 
})); 
return wordArray[0]; 
}; 

console.log(wordSelector("Hello there Mr. Gormoon!")); 

輸出:

[["H", "e", "l", "l", "o"], ["t", "h", "e", "r", "e"], ["M", "r", "."], ["G", "o", "r", "m", "o", "o", "n", "!"]] 

到目前爲止,我有什麼需要做一個強烈的想法,但我不知道如何計算每個單詞的每個字母然後確定最大?

但是,一旦我算來,我可以對它們進行排序,並採取在位置wordArray[0]

回答

2

這裏是我的解決方案

我使用String method split通過使用表示非單詞字符的正則表達式將單詞中的給定句子分開。我使用Array method filter來擺脫字數組中的空值。

然後,我使用Array method reduce來計算字符在單詞中重複的次數,然後在函數maxLetterRepeat中挑選最大重複字符數。之後,我再次使用Array method reduce來挑選最多重複字符的單詞。

function maxLetterRepeat(str) { 
    if (str) { 
     charCounts = str.split('').reduce(function (acc, c) { 
     acc[c] = (acc[c] || 0) + 1; 
     return acc; 
     }, {}); 

     console.log("Char counts for " + str + " => ", charCounts); 

     max = Object.keys(charCounts).reduce(function(max, c) { 
     return (max < charCounts[c]) ? charCounts[c] : max; 
     }, 0); 

     console.log('Max repeated letters in "' + str + '" ->', max); 

     return [str, max]; 
    } 
} 


wordsAndMaxRepeats = "Hello there Mr. Gormoon!".split(/\W/) 
     .filter(function (e) { return e.length > 0 }).map(maxLetterRepeat); 
console.log("Words & Max Char Repeated count => ", wordsAndMaxRepeats); 

wordWithMaxRepeat = wordsAndMaxRepeats.reduce(function (p, c) { 
    return p[1] > c[1] ? p : c; 
})[0]; 

console.log("Word with max repeated chars => " + wordWithMaxRepeat); 

輸出程序

Char counts for Hello => { H: 1, e: 1, l: 2, o: 1 } 
Max repeated letters in "Hello" -> 2 
Char counts for there => { t: 1, h: 1, e: 2, r: 1 } 
Max repeated letters in "there" -> 2 
Char counts for Mr => { M: 1, r: 1 } 
Max repeated letters in "Mr" -> 1 
Char counts for Gormoon => { G: 1, o: 3, r: 1, m: 1, n: 1 } 
Max repeated letters in "Gormoon" -> 3 
Words & Max Char Repeated count => [ [ 'Hello', 2 ], [ 'there', 2 ], [ 'Mr', 1 ], [ 'Gormoon', 3 ] ] 
Word with max repeated chars => Gormoon 
[Finished in 0.3s] 
0

的一個既然你不必返回所有的話,你只能保持最大和的話有一個數組這是最大的重複。

每個新單詞計算重複字母的數量,如果它低於最大值,則移動到下一個單詞,如果相等,則將其添加到數組中,如果更大,則更新最大值並僅使用該單詞創建一個新數組。

在您的例子那就是:

max = 2, wordArray = ["Hello"] 
max = 2, wordArray = ["Hello", "there"] 
max = 2, wordArray = ["Hello", "there"] 
max = 3, wordArray = ["Gormoon"] 
+0

雖然樂於助人作爲一種替代,您所提供的信息僅僅是替代我已經說過的舒適理解。你跳過了我在問題中實際詢問的部分。 –

2

對於步驟#1,簡單地劈在空白 - 大約爲已完成。

對於第2步做一個函數,一個字(字符串)和收益有多少重複的字母有 - 無需返回字母的排列,這是關於一個字符串是什麼了!

想象的功能有關,像這樣:

function countMaxRepeats (word) { 
    // Some logic to find maximum repeat count 
    return .. 
} 

注意這個任務現在是怎麼一個孤立的任務of which there are many related questions;這種情況有點不同,因爲同時保持理貨每個字符,你只在對任何個性「最大理貨」感興趣,就像一個「找到最大值」循環。

this answer開始,並調整它以跟蹤迄今爲止發現的「最大頻率值」。

對於第4步,取這個信息 - 現在映射爲Array.map - 包括重複的字母計數,然後根據這樣一個計數對數組進行排序。然後從陣列中取出前N個項目,直到'不是最高計數'。 (在技術上這可以通過使用相同的方法作爲countMaxRepeats來解決,但品種是..學習的調味品。)

例如:

var wordsAndRepeatCounts = words.map(function (word) { 
    return {maxRepeats: countMaxRepeats(word), word: word} 
}; 

var sortedByRepeatsDesc = wordsAndRepeatCounts.sort(orderByRepeatsFieldescending) 

然後:

var maxRepeat = sortedByRepeatsDesc[0].maxRepeats 
// then take from sortedByRepeats until repeat < maxRepeat 
相關問題