【问题标题】:count duplicate value in recursion递归计算重复值
【发布时间】:2019-06-21 11:48:03
【问题描述】:

如何通过递归计算字符串/数组中的重复值,我知道如何通过对象的循环找到重复值和唯一值,但在这种情况下,我尝试递归它来学习我的逻辑, 这是我尝试过的

function duplicate(word) {
  let [obj, arr, count ] = [{},[],0]
  for (i of word) {
    obj[i] = (obj[i] || 0) + 1

    if (obj[i] == 2) {
      arr.push(i);
    }
  }

  // console.log(arr);
  let words = [...word];
  words = [...new Set(words)];
  // // return word
  if (words.length === 0) {
    return count
  } else if (arr.includes(words[0])) {
    count++
  }
    return count + duplicate(words.slice(1))

}


console.log(duplicate('xmikemk')) // 2

如果找到的值 2 次,我尝试创建对象拳头并推送到 newArr, 然后我尝试在下面再次设置单词以显示唯一值,然后我递归它,当我控制台记录它时,下面的切片方法递归并且不起作用,这就是为什么我得到的输出是0,我的代码有什么问题?我对那个条件有错吗?

那个变量词有 = ('xmikemk') which has 2 duplicate words, m and k , so the output i want is2`

【问题讨论】:

    标签: javascript arrays loops recursion


    【解决方案1】:

    您可以扩展给定的字符串并仅使用第一个字符进行计数,方法是采用另一个参数来传递最后计数的值。

    如果没有更多可展开的项目,则进行计数并返回。否则继续递归调用。

    function duplicate([w, ...rest], counter = {}) {
        counter[w] = (counter[w] || 0) + 1;
        if (!rest.length) {
            return Object.values(counter).reduce((s, c) => s + (c > 1), 0);
        }
        return duplicate(rest, counter);
    }
    
    console.log(duplicate('xmikemk')) // 2

    【讨论】:

    • 我们不能只使用一个参数而不编辑参数吗??
    • 你喜欢如何计算数值?
    • 就像我做的那样循环它然后在下面递归:D,这不可能吗?
    • 您没有真正的递归,因为您获取所有字符(而不是单词)并只计算实际字符(就递归解决方案而言,这有点作弊。)
    • 嗯好的,我会明白的,为什么 rest 变量切片??
    【解决方案2】:

    你让这变得比现在更复杂。只需创建一个内部累加器方法来填充地图并增加频率。

    function duplicate(word) {
      return duplicateInternal(word, {});
    }
    
    function duplicateInternal(word, mapping) {
      if (word == null || word.length === 0) {
        return mapping;
      }
      var c = word.charAt(0);
      mapping[c] = (mapping[c] || 0) + 1;
      return duplicateInternal(word.substr(1), mapping);
    }
    
    var mapping = duplicate('xmikemk');
    var frequency = Object.keys(mapping)
      .map(key => [key, mapping[key]])
      .sort((a, b) => {
        let diff = -1 * (a[1] - b[1]);
        return diff === 0 ? a[0].localeCompare(b[0]) : diff;
      });
    
    console.log(frequency.map(x => x.join(' x')).join('\n'))
    .as-console-wrapper {
      top: 0;
      max-height: 100% !important;
    }

    【讨论】:

    • 我只想学习如何递归:D。我对您的回答表示赞赏,在这里学习大师的不同回答很有用:D
    猜你喜欢
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2021-11-01
    相关资源
    最近更新 更多