599. 两个列表的最小索引总和
js
;(function () {
/**
* 599. 两个列表的最小索引总和
* 假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。
* 你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺序。 你可以假设答案总是存在。
*
* 输入: list1 = ["Shogun", "Tapioca Express", "Burger King", "KFC"],list2 = ["Piatti", "The Grill at Torrey Pines", "Hungry Hunter Steakhouse", "Shogun"]
* 输出: ["Shogun"]
* 解释: 他们唯一共同喜爱的餐厅是“Shogun”。
*
* 输入:list1 = ["Shogun", "Tapioca Express", "Burger King", "KFC"],list2 = ["KFC", "Shogun", "Burger King"]
* 输出: ["Shogun"]
* 解释: 他们共同喜爱且具有最小索引和的餐厅是“Shogun”,它有最小的索引和1(0+1)。
*
*/
function findRestaurant(list1: string[], list2: string[]): string[] {
// // 方法一:
// let arr: number[] = [];
// let strs: string[] = [];
// for(let i = 0; i < list1.length; i++) {
// let cur = list1[i];
// if (list2.includes(cur)) {
// arr.push(list2.indexOf(cur) + i);
// strs.push(cur)
// }
// }
// if(strs.length === 1) {
// return strs
// }
// let min = Math.min(...arr);
// let indexs: number[] = [];
// arr.map((i, index) => {
// i === min && indexs.push(index)
// });
// let ans = strs.filter((item,index) => {
// return indexs.includes(index)
// })
// return ans
// 方法二:(官网提供)
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
}
const list1 = ['Shogun', 'Tapioca Express', 'Burger King', 'KFC'],
list2 = [
'Piatti',
'The Grill at Torrey Pines',
'Hungry Hunter Steakhouse',
'Shogun'
]
console.log(findRestaurant(list1, list2))
})()