【问题标题】:Finding duplicates from multiple number of arguments从多个参数中查找重复项
【发布时间】:2020-03-30 21:32:31
【问题描述】:

所以基本上我有这个功能:

function areThereDuplicates(a,b,c,d) {
  if (typeof d === 'undefined') { d = 'default'; }
  let arr = new Array(a,b,c,d)
  if(arr.length == 0){
      return false
  }

  let counter = {};

  for (let i =0; i < arr.length; i++){
      let digit = arr[i];
      counter[digit] ? counter[digit] += 1 : counter[digit] = 1
  }

   let values = Object.values(counter)
   for (let i = 0 ; i < values.length; i++){
     if(values[i] != 1){
       return true
     }
   }
  return false

}

该函数最多可使用 4 个参数。如何创建另一个变量或其他东西来假设参数的数量可以达到 n 并同时将确切的元素添加到新数组“arr”中。

或者更好的是,如何避免使用创建新数组来获取参数?

谢谢!

【问题讨论】:

    标签: javascript duplicates


    【解决方案1】:

    每个函数都包含一个名为arguments 的类数组变量,其中包含所有参数。你可以把它展开来得到你的数组。

    function areThereDuplicates() {
        arr = [...arguments];
        // ...etc...
    }
    

    【讨论】:

      【解决方案2】:
       function areThereDuplicates() {
        let arr = [...arguments]
        if(arr.length == 0){
            return false
        }
      
        let counter = {};
      
        for (let i =0; i < arr.length; i++){
            let digit = arr[i];
            counter[digit] ? counter[digit] += 1 : counter[digit] = 1
        }
      
         let values = Object.values(counter)
         for (let i = 0 ; i < values.length; i++){
           if(values[i] != 1){
             return true
           }
         }
        return false
      
      }
      

      【讨论】:

        【解决方案3】:

        除了您可以使用arguments,正如另一个答案所建议的那样(但与建议相反,您可以直接将它与您的代码一起使用,它有[]length),您可以使用Set.

        那么函数就可以变成

        function areThereDuplicates() {
          return arguments.length !== new Set(arguments).size;
        }
        

        但是,谈到复杂性:对于是/否的答案,您的循环可以在遇到重复项时立即return。找到更多重复项不会产生“更强”的true

        function areThereDuplicates() {
          for(let i=0; i<arguments.length-1; i++) {
            let current=arguments[i];
              for(let j=i+1; j<arguments.length; j++)
                if(current===arguments[j])
                  return true;
          }
          return false;
        }
        

        然后你可以将两者结合起来(Set 和早期的return - 也可以运行 sn-p,其他的都是通过电话发送的):

        function areThereDuplicates() {
          console.log(arguments);
          let set=new Set();
          for(let item of arguments){
            if(set.has(item))
              return true;
            set.add(item);
          }
          return false;
        }
        
        function doThing(event) {
          result.innerText=areThereDuplicates(...event.target.value.split(","));
        }
        
        doThing({target:document.getElementsByTagName("input")[0]});
        <input type="text" value="a,b,b" oninput="doThing(event)">
        <div id="result"></div>

        【讨论】:

        • 是的,我也在考虑这个问题。 set 方法的 O() 是多少?
        • @octaviandd 最坏情况的复杂性类似于您的循环。只是Sets 通常是哈希集(平均查找性能更好),Set() 是本机代码,不等待 JIT。
        猜你喜欢
        • 2021-07-30
        • 2018-03-11
        • 1970-01-01
        • 1970-01-01
        • 2023-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-18
        相关资源
        最近更新 更多