【问题标题】:Same collection of digits between two integers Javascript两个整数Javascript之间的相同数字集合
【发布时间】:2017-02-01 18:07:47
【问题描述】:

我正在尝试检查两个整数是否包含相同的数字集合。

equivalent(123, 321) // -> true
equivalent(413, 1453) // -> false
equivalent(2002, 2200) // -> true
equivalent(542, 545) // -> false

我已经开始使用:

function equivalent(a,b) {
    let stringA = a.toString().match(/[1-9]/g);
    let stringB = b.toString().match(/[1-9]/g);
}

我不知道是否使用哈希映射来映射每个出现的数字并随之递增,但是我无法检查两个对象是否彼此相等。


哪种方法最优化(就空间/时间复杂度而言),哪种方法最容易阅读,或两者兼而有之?谢谢。


编辑:很抱歉没有详细说明我的问题。我想检查两个整数是否包含相同的数字和相同数量的数字。

【问题讨论】:

  • .toString().length 会更容易吗?
  • 如果我理解正确的话,除了长度相同之外,它们中的数字也应该相同,对吧?
  • 如果它总是正整数(即只有数字,没有逗号、小数点或负号),@j08691 的建议就是要走的路。
  • 哦哦。 . .我明白你在说什么,@KapilKashyap。 . .所以“123”和“124”将是false,因为数字不一样。哇 。 . .令人困惑的问题。

标签: javascript regex numbers


【解决方案1】:

使用一个简单的循环并使用String#replace 从第二个字符串中删除每个字符,然后检查第二个字符串是否为空(空意味着两者都包含相同数量的数字)。

console.log(
  equivalent(123, 321), // -> true
  equivalent(413, 1453), // -> false
  equivalent(2002, 2200) // -> true
);

function equivalent(a, b) {
  // convert into string
  a = a.toString();
  b = b.toString();
  // iterate over each character
  for (var i = 0; i < a.length; i++)
  // replace each character from second string
    b = b.replace(a[i], '');
  // finally check second string is empty 
  return b == '';
}

【讨论】:

    【解决方案2】:

    您可以对数字进行排序并比较连接的字符串。

    function equivalent(a, b) {
        return [...a.toString()].sort().join('') === [...b.toString()].sort().join('');
    }
    
    console.log(equivalent(123, 321));
    console.log(equivalent(413, 1453));
    console.log(equivalent(2002, 2200));

    使用哈希表的方法

    function equivalent(a, b) {
        var hash = Object.create(null);        
        [...a.toString()].forEach(a => hash[a] = (hash[a] || 0) + 1);
        [...b.toString()].forEach(b => hash[b] = (hash[b] || 0) - 1);
        return Object.keys(hash).every(k => !hash[k]);
    }
    
    console.log(equivalent(123, 321));
    console.log(equivalent(413, 1453));
    console.log(equivalent(2002, 2200));

    【讨论】:

    • @PranavCBalan,你为什么这么认为?
    • 问题包含let,所以这是一个ES6问题。
    • ... 点差运算符在您的方法中占什么比例?谢谢。
    • @kdizzle,它将一个字符串传播到一个单个字符的数组中。
    【解决方案3】:

    转成字符串,拆分,排序,合并,比较。

    function equivalent(a, b) {
      return a.toString().split("").sort().join("") === b.toString().split("").sort().join("");
    }
    
    console.log(equivalent(123, 321));
    console.log(equivalent(413, 1453));
    console.log(equivalent(2002, 2200));

    可以添加长度检查,因此不需要进行其他处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-25
      • 2017-10-08
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多