JavaScript Count Duplicate Letter Рекурсивно - PullRequest
0 голосов
/ 26 января 2019

У меня проблема при кодировании.Я хочу посчитать, сколько букв в слове повторяются рекурсивно.Мой код выглядит так:

var check = words[0]

  if(!words){
     return 0
  } else {
     for(var i = 0; i < words.length; i++){
        if(words[i] == check){
           return 1 //+ countDuplicate (words.slice(1))
        }
     }
     return countDuplicate (words.slice(1))
  }

пример для теста:

countDuplicate ('greatestme') // 2, ==> which are 'e' 3 times and 't' 2 times

Ответы [ 3 ]

0 голосов
/ 26 января 2019

Эта проблема на самом деле не является хорошим кандидатом для рекурсии, но один из способов сделать это - сохранить два набора:

  • набор символов, которые встречались только один раз
  • набор символов, которые встречались более одного раза

При обработке следующего символа вам необходимо решить, как эти два набора нужно изменить.Когда все символы обработаны, вы возвращаете размер второго набора.

Оба набора инициализируются как пустые наборы:

function countDuplicate(word, once = new Set, more = new Set) {
    var check = word[0];
    if (!check) return more.size;
    if (once.delete(check)) { // If successful, it was present
        more.add(check);
    } else {
        once.add(check);
    }
    return countDuplicate(word.slice(1), once, more);
}

const result = countDuplicate ('greatestme');

console.log(result);
0 голосов
/ 27 января 2019

const freqDist = ([first, ...rest], counts = {}) => (result => (
  rest.length ? freqDist(rest, result) : result
))({ ...counts, [first]: ((counts[first] || 0) + 1) })

/* More readable alternative with mutable `counts` */
// const freqDist = ([first, ...rest], counts = {}) => {
//   counts[first] = (counts[first] || 0) + 1
//   return (rest.length > 0) ? freqDist(rest, counts) : counts
// }

const stripSingles = obj => Object.keys(obj).reduce((acc, curr) => (
  (obj[curr] > 1) ? { ...acc, [curr]: obj[curr] } : acc
), {})

console.log(stripSingles(freqDist('greatestme')))
0 голосов
/ 26 января 2019

/* Method 1 */
function countDuplicate1(word) {
  var arr = word.split("").reduce((acc, cv) => {
    if(!acc[cv]) {
      acc[cv] = 1;
    } else {
      acc[cv]++;
    }
    return acc;
  }, {});
  return Object.values(arr).filter(val => val >1).length;
}

/* Method 2 */
function countDuplicate2(word) {
  var arr = [];
  for(var i=0; i< word.length; i++) {
    var chr = word[i];
    for(var j=i+1; j< word.length; j++) {
      if((word[j] == chr) && !arr.includes(word[j])) {
        arr.push(word[j]);
      }
    }
  }
  return arr.length;
}
var count1 = countDuplicate1('greatestme');
var count2 = countDuplicate2('greatestme');
console.log(count1);
console.log(count2);

Посмотрите, поможет ли это.

...