2017-02-12 61 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);