2016-06-07 6 views
2

Ich war mit der ersten Frage hier herumspielen: Reduce duplicate characters to a desired minimum und bin auf der Suche nach eleganter Antworten als das, was ich gefunden habe. Er besteht den Test, ist aber neugierig auf andere Lösungen. Die Probentests sind:Reduzieren Sie doppelte Zeichen in einer Zeichenfolge auf ein bestimmtes Minimum

reduceString('aaaabbbb', 2) 'aabb' 
reduceString('xaaabbbb', 2) 'xaabb' 
reduceString('aaaabbbb', 1) 'ab'  
reduceString('aaxxxaabbbb', 2) 'aaxxaabb' 

und meine Lösung (das übergibt diese Tests):

reduceString = function(str, amount) { 
    var count = 0; 
    var result = ''; 
    for (var i = 0; i < str.length; i++) { 
    if (str[i] === str[i+1]) { 
     count++; 
     if (count < amount) { 
     result += str[i]; 
     } 
    } else { 
     count = 0; 
     result += str[i]; 
    } 
    }; 
    return result; 
} 
+0

Vermutlich Sie wollen sequentielle wiederholte Zeichen, nicht nur wiederholt? – RobG

+0

@RobG Yup basierend auf den Proben sieht es aus wie das ist, was sie getestet haben. – Rk220

Antwort

5

nur reguläre Ausdrücke verwenden .

var reduceString = function (str, amount) { 
    var re = new RegExp("(.)(?=\\1{" + amount + "})","g"); 
    return str.replace(re, ""); 
} 
+0

Regexp macht Magie – iomv

+0

@MarcoValente es ist sicher! – wot

+0

Ich muss deine Antwort niederschreiben;) – iomv

0

Ich habe versucht, es so kurz wie möglich zu machen:

reduceString = function(str, amount) { 
    var finalString = '', cL = '', counter; 
    str.split('').forEach(function(i){ 
     if (i !== cL) counter = 0; 
     counter++; 
     cL = i; 
     if (counter <= amount) finalString = finalString + i; 
    }); 
    return finalString; 
} 
0

Sie können stattdessen reg-Ausdruck verwenden. in Javascript getestet.

, wie es funktioniert:

(.) //match any character 
\1 //if it follow by the same character 
+{2 //more than 1 times 
/g //global 
$1 //is 1 time by $1$1 is 2 times 

    reduceString('aaaabbbb', 2) 
    reduceString('xaaabbbb', 2) 
      reduceString('aaaabbbb', 1)  
      reduceString('aaxxxaabbbb', 2) 

      function reduceString(txt,num) 
      { 
       var canRepeat=['$1']; 
       for (i=1;i<num;i++) 
       { 
        canRepeat.push('$1') 
       } 
       canRepeat = canRepeat.join(''); 

       console.log(txt.replace(/(.)\1{2,}/g, canRepeat)) 

      }  
+0

schau @ e4en, es ist noch sauberer. :) – chungtinhlakho

0

Mit regex:

var reduceString = function(str, amount) { 
var x = [ ...new Set(str) ]; 
for (var c of x){ 
    var rex = new RegExp(c + '{'+amount+',}','g'); 
    str = str.replace(rex,string(c,amount)); 
    } 
    return str; 
}; 

var string = function(c,amount){ 
    for(var i=0,s="";i<amount;i++)s+=c; 
    return s; 
}; 
0

Ich denke, meine beste Lösung wäre, wie

var str = "axxxaabbbbcaaxxxaab", 
 
redStr = (s,n) => s.replace(/(\w)\1+/g,"$1".repeat(n)); 
 
console.log(redStr(str,2));

Verwandte Themen