【问题标题】:Find lowest value present in exactly one array查找恰好存在于一个数组中的最小值
【发布时间】:2020-08-15 15:14:21
【问题描述】:

如何编写一个函数来找到不是 1 并且恰好存在于一个数组中的最小值?

例如:

const x = [1, 8, 7, 3, 4, 1, 8];
const y = [6, 4, 1, 8, 5, 1, 7];

应该返回 3,因为它是仅在一个数组 (x) 中的最小数字。如果没有唯一值,那么它应该返回一个大于 1 且小于第二小的数字的数字。比如

const x = [5, 5, 5, 7 ,7 ,7];
const y = [3, 4, 5, 1, 3, 7];

上面应该返回 2,因为 3 多次出现,并且最小的唯一值是 1,所以应该返回的数字是 2。

我已经尝试了以下方法。

function lowUniwueValue(x, y) {

  const uniqueVal = parseInt(x.filter((obj) => y.indexOf(obj) == -1).toString());

  return uniqueVal;
}

上述函数返回唯一值,但我不能保证它是最低的。

我也尝试过创建一个新集合,它只有唯一的值,但问题是我们看不到低数字是否有重复。

【问题讨论】:

  • 到目前为止你有什么尝试?
  • python 代码适合你吗?
  • @YashShah 它被标记为 JavaScript。
  • @Julia 请查看更新后的答案
  • @hev1 是的,我知道,但这种方法对作者来说可能就足够了。

标签: javascript arrays algorithm


【解决方案1】:

您可以找到每个数字的频率,还可以找到大于一的最小数字(从两个数组中)。如果它的频率正好是一,那就是答案;否则,答案是两个。

const getMin = (arr, arr2) => {
  let freq = {},
    min = Infinity;
  [...arr, ...arr2].forEach(x => {
    freq[x] = (freq[x] || 0) + 1;
    if (x > 1 && x < min) min = x;
  });
  return freq[min] === 1 ? min : 2;
};
console.log(getMin([1, 8, 7, 3, 4, 1, 8], [6, 4, 1, 8, 5, 1, 7]));
console.log(getMin([5, 5, 5, 7, 7, 7], [3, 4, 5, 1, 3, 7]));

【讨论】:

    【解决方案2】:

    使用数组索引

    const x = [1, 8, 7, 3, 4, 1, 8];

    const y = [6, 4, 1, 8, 5, 1, 7];

    第 1 步: 遍历数组 x 并通过将 Indexing 数组的索引标记为 1 来将该元素标记为已访问。

    第 2 步: 遍历数组 y,并通过将 Indexing 数组的索引标记为 1(初始值为 0)和 2(初始值为 1)来将该元素标记为已访问。

    第三步:索引数组变为arr = [0,2,0,1,2,1,1,2,2]

    答案将是标记为 1 且不等于 1 的索引的最小值,即 3。

    【讨论】:

      【解决方案3】:

      Ciao,绝对无法与其他答案的优雅相提并论,但我试过了。

      function findMin(x, y) {
         let array = [Math.min(...x.filter(el => el !== 1)), Math.min(...y.filter(el => el !== 1))];          
         if (array[0] !== array[1]) {
        let occx = x.reduce((a, v) => (v === array[0] ? a + 1 : a), 0);
        let occy = y.reduce((a, v) => (v === array[1] ? a + 1 : a), 0);
        if (occx === 1 && occy === 1) return Math.min(...array);
        else {
           let min = Math.min(...array) - 1;
           if (min !== 1) return min;
           else {
              // if min value -1 === 1 remove min elements found and continue to find 
              let indexa = x.indexOf(array[0]);
              let indexb = y.indexOf(array[1]);
              x.splice(indexa, 1);
              y.splice(indexb, 1);
              findMin(x, y);
           }
         }
      }
      else {
         // if min values found are equal, remove them and continue to find
         let indexa = x.indexOf(array[0]);
         let indexb = y.indexOf(array[1]);
         x.splice(indexa, 1);
         y.splice(indexb, 1);
         findMin(x, y);
      }
      }
      
      console.log(findMin([1, 8, 7, 3, 4, 1, 8], [6, 4, 1, 8, 5, 1, 7]))
      console.log(findMin([5, 5, 5, 7 ,7 ,7], [3, 4, 5, 1, 3, 7]))

      我找到了两个数组的最小值,如果它们不同,则返回最小值。否则,计算两个数组中找到的最小值的出现次数,如果出现超过 1 次,则将结果减 1,如果它不同于 1,则返回它,否则继续查找最小值(删除找到的 previuos 元素)。

      【讨论】:

        猜你喜欢
        • 2021-12-16
        • 2012-03-04
        • 1970-01-01
        • 2013-01-24
        • 2017-05-10
        • 1970-01-01
        • 1970-01-01
        • 2018-09-24
        相关资源
        最近更新 更多