看力扣的题目中有这么一题,想拿出来分享一下。
题目是:假设 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,希望大家都能拥有可以坚持下去的爱情。








网友评论