两个列表的最小索引总和

2022-03-24  本文已影响0人  壹贰是只猫

看力扣的题目中有这么一题,想拿出来分享一下。

题目是:假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺序。 你可以假设答案总是存在。

解析:题目是什么意思呢,我给大家解释一下,就是如果我想要A,B,和C,你想要的是C,A,E。那么此时,我们可以看出来,都想要A和C,如果只是这样,我们查重就可以了,但是我们要根据,两者的索引拿到最小的值,现在A的索引分别是0和1,C的索引是2和0,相加的话,得到的结果就是,2和1,1是最小的,所以,共同想要的就是A

了解了题目的意思,我们来看下应该如何去解答这个问题。这里我先不采用官方给出的答案,我给一个通俗易懂的。

var findRestaurant = function (list1, list2) {
  let res = []
  let min = list1.length + list2.length
  const newArr = list1.filter(i => list2.includes(i))
  for (const v of newArr) {
    const sum = list1.indexOf(v) + list2.indexOf(v)
    if (sum > min) continue;
    if (sum < min) {
      res.length = 0;
      min = sum;
    }
    res.push(v);
  }
  return res

解析:首先我们定义一个空数组,这个空数组就是到时候我们拿最短共同对象的时候,存放的容器。然后要获取第一个数组和第二个数组的长度,我们称之为最小长度,反正下标值最大就是他们两个相加了,然后我们就压开始查重了,也就是从第一个数组中,看看有没有和第二个数组一样的内容,然后重新放在一个数组里面。这里用到的循环是es6的for of循环,这里我不赘述了,循环我们的拿到数组一和数组二有重复的数组,然后我们拿这个下标总和,看看循环的数据在各自的数组里面的位置是多少,如果循环里面的累加大于最新长度,那么就结束本次的循环,继续执行下一次的循环,如果小于最小长度的话,说明,就是我们要拿到的数组。ps:数组.length = 0 意思是清空数组。

除了这个方法呢,官方也给出了相对较好的解决方案,我们一起来看看吧

var findRestaurant = function (list1, list2) {
  const index = new Map();
  for (let i = 0; i < list1.length; i++) {
    index.set(list1[i], i);
  }
  const ret = [];
  let indexSum = Number.MAX_VALUE;
  for (let i = 0; i < list2.length; i++) {
    if (index.has(list2[i])) {
      const j = index.get(list2[i]);
      if (i + j < indexSum) {
        ret.length = 0;
        ret.push(list2[i]);
        indexSum = i + j;
      } else if (i + j == indexSum) {
        ret.push(list2[i]);
      }
    }
  }
  return ret;
};

其实题目的解决方法都是一样的思路的,只不过这里用到了map方法,将list1里面的数据存入map,然后通过判断,map里面的属性和list2里面一样不一样,在进行判断index的下标值,进行push操作

片尾小彩蛋:今天给大家推荐的歌是ROSS AND RACHEL,希望大家都能拥有可以坚持下去的爱情。

上一篇 下一篇

猜你喜欢

热点阅读