Shopee SG 前端面试算法题

2022-04-29 18:36:45 +08:00
 YadongZhang

一面:

Itersection of Multiple Arrays

Input: nums = [[3,1,2,4,5],[1,2,3,4],[3,4,5,6]]
Output: [3,4]

Input: nums = [[1,2,3],[4,5,6]]
Output: []

实现一个时间复杂度为 O(n) 的算法
5211 次点击
所在节点    职场话题
43 条回复
ChevalierLxc
2022-04-29 18:55:55 +08:00
[[3,1,2,4,5],[1,2,3,4],[3,4,5,6]].toString().split(',')
这样展开成一个 array?
leokino
2022-04-29 18:56:04 +08:00
子数组如果元素不重复直接计数然后刷一遍找出现三次的。如果元素重复就保持两个数组。都是 O(n) 的,很简单。然后一般面试不让泄题的,不过这种题无所谓吧。
B3C933r4qRb1HyrL
2022-04-29 18:56:17 +08:00
这么简单?
leokino
2022-04-29 18:56:31 +08:00
@leokino 三次 -> 对应次数
neilyoone
2022-04-29 19:03:04 +08:00
不知道前端用不用 python, python 很好解.
wd
2022-04-29 19:04:52 +08:00
循环然后建一个 map 计数就行了,最后一个数组的时候看看 map 和数组数量比较下
Wongbrah
2022-04-29 19:35:09 +08:00
nums.reduce((result, currentArray) => result.filter(num => currentArray.includes(num)))
NathanInMac
2022-04-29 19:57:27 +08:00
@Wongbrah 老哥你自己数数你这个复杂度是多少
Araell
2022-04-29 20:02:49 +08:00
怎么想都是 O(n * m) 啊
bzw875
2022-04-29 20:16:29 +08:00
```
const getItersection = (arr) => {
const result = [];
for (let i in arr[0]) {
const tmp = arr[0][i];
let has = 1;
for (let j = 1; j < arr.length; j++) {
if (arr[j].includes(tmp)) {
has++;
}
}
if (has === arr.length) {
result.push(tmp);
}
}
return result;
};
```
zhengjian
2022-04-29 20:25:15 +08:00
zhengjian
2022-04-29 20:25:57 +08:00
好吧,原来是 LeetCode 2248 ,刚提交通过了,😂

https://leetcode.com/problems/intersection-of-multiple-arrays/solution/by-nehzil-9383/
YARU
2022-04-29 20:28:23 +08:00
rioshikelong121
2022-04-29 20:37:41 +08:00
这个 N 其实指的应该是总的元素个数对吧。 说下思路吧。
循环同时维护一个数据结构 (Map. Object) 以元素为 key 进行计数不就行了。

```javascript
function interaction(arrays){

const counter = {};

for (let i = 0; i < arrays.length; i++) {
const array = arrays[i];
//avoid repeated count in one array.
const cache = {};

for (let j = 0; j < array.length; j++) {
const element = array[j];

if (!(element in counter)) {
counter[element] = 1;
} else if (!(element in cache)) {
counter[element] += 1;
cache[element] = true;
}

}
}


return Object.entries(counter).filter((v, i) => (v[1] >= arrays.length)).map((v) => v[0]);

}


```
richardwong
2022-04-30 16:00:43 +08:00
/**
*
* @param {number[][]} nums
* @return {number[]}
*/
var intersection = function (nums) {
let res = [];
// pojo {} 对象的 key 顺序默认是有序的,而 map 的 key 顺序,是按其 set 的顺序来的
// 所以这里使用 {} 而非 new Map()
const map = {};
for (let i = 0; i < nums.length; i++) {
for (let j = 0; j < nums[i].length; j++) {
// 根据题意,内层数组已经去重过
const ele = nums[i][j];
let count = map[ele];
if (count > 0) {
// 记录每个元素出现的次数
map[ele] = ++count;
} else {
map[ele] = 1;
}
}
}
// 出现次数跟外层数组长度一致,即为交集中的元素
Object.keys(map).forEach((el) => {
if (map[el] === nums.length) {
res.push(el);
}
});
return res;
};

作者:YUFENGWANG
链接: https://leetcode-cn.com/problems/intersection-of-multiple-arrays/solution/by-yufengwang-776k/
来源:力扣( LeetCode )
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
CookCoder
2022-05-01 15:23:15 +08:00
求交集么
rongchuan
2022-05-01 17:34:14 +08:00
挺简单的...碰到这个题只能说运气太好...
rongchuan
2022-05-01 17:45:28 +08:00
@rongchuan
js 在代码这里,不谢,多刷刷题吧...
/**
* @param {number[][]} nums
* @return {number[]}
*/
var intersection = function(nums) {
const m =nums.length;
const arr=nums.flat();
const map =new Map();
const result =[];
for(let i =0;i<arr.length;i++){
map.set(arr[i],map.has(arr[i])? map.get(arr[i])+1:1);
if(map.get(arr[i])===m)
result.push(arr[i])
}
result.sort((a,b)=>a-b);
return result;
};
YadongZhang
2022-05-01 18:05:58 +08:00
@rongchuan

空间换时间
jackbrother
2022-05-02 10:19:21 +08:00
你运气真好

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/850094

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX