2017-02-12 89 views
-1

我要創建一個程序,可以採取一個句子,如與第一次出現

my arms are red, my legs are red and I am red 

和輸出的句子與詞第一次出現在句子中的指針的指針替換文本中的字,所以這句話的期望輸出將是

12341634910114 

我不知道我該怎麼做。

感謝

+1

你有什麼已經嘗試過? – ppasler

回答

0

這裏是一個辦法。

  • 我假設你不想標點,所以我刪除了它們。
  • 然後我創建了一個包含key=wordvalue=first的地圖。
  • 之後,我通過句子並用索引替換每個單詞。

var text = "my arms are red, my legs are red and i am red"; 
 
// remove punctuation 
 
text = text.replace(/[.,\/#!$%\^&\*;:{}=\-_`~()]/g,""); 
 

 
// split text 
 
var words = text.split(" "); 
 

 
// create map of word and first index 
 
var m = new Map(); 
 
var i = 1; 
 
words.forEach(function(word) { 
 
    // first occurrence? 
 
    if (m.get(word) == undefined) { 
 
    m.set(word, i++); 
 
    } 
 
}); 
 

 
// replace words with index 
 
var l = []; 
 
words.forEach(function(word) { 
 
    l.push(m.get(word)); 
 
}); 
 

 
console.log(l.join(""));

有一定短的方式來做到這一點,但我覺得這是更容易閱讀和理解

1

這裏的理念是:

  1. 你必須打破一句成詞。斷點可能是SPACE,COMMA,NEW LINE等。

  2. 您可以創建2個數組。第一個包含所有的單詞,第二個包含唯一的單詞。

  3. 運行均通過環比較它們對一個詞的第一次出現的陣列,並保存其指數

+0

使用獨特的數組而不是地圖的好處:) – ppasler

0

你已經做了你的問題是錯誤的。如果重複一個詞,索引應該被填充。 因此指數應該是 12341634910114(123416349,10,11,4)

var str="my arms are red, my legs are red and i am red"; 
 
var words=str.replace(",","").split(" "); 
 
var occur=[]; 
 
var pos=[]; 
 
//console.log(words.length); 
 
for(var i=0; i< words.length; i++){ 
 
    if(occur.length==0){ 
 
    occur.push([words[i],i]); 
 
    pos.push(pos.length+1); 
 
    } 
 
    else{ 
 
    for(var j=0; j<occur.length; j++){ 
 
     if(words[i]==occur[j][0]){ 
 
     pos.push(occur[j][1]+1); 
 
     break; 
 
     } 
 
    } 
 
    if(j>=occur.length){ // the loop is not broken 
 
     occur.push([words[i],i]); 
 
     pos.push(i+1); 
 
    } 
 
    } 
 
} 
 
console.log(pos.join("")); 
 
//console.log(occur); 
 
//console.log(occur[1][0]);

0

在單詞邊界分割.match(/\b(\w+)\b/g)

使用Array.map將每個單詞映射到的數發生。

使用Array.slice查找切片數組到達當前索引的出現次數,並在該切片陣列上使用Array.filter查找出現次數。

同樣的事情可以用很多不同的方式完成,例如使用簡單的循環。

var result = "my arms are red, my legs are red and i am red?".match(/\b(\w+)\b/g).map(function(currentValue, index, array){ 
 
    return array.slice(0, index + 1).filter(x => x === currentValue).length; 
 
}).join(""); 
 

 
console.log("result", result);