Comments (13)
function setOfUsersWithSimillarSkills(userToSkill) {
const userToSkillEntries = Object.entries(userToSkill);
return userToSkillEntries.reduce((prevSkillToUser, [user, skills]) => {
skills.forEach((skill) => {
if (prevSkillToUser.hasOwnProperty(skill)) {
prevSkillToUser[skill].push(user);
} else {
prevSkillToUser[skill] = [user];
}
});
return prevSkillToUser;
}, {});
}
from fe-interview.
参考答案:
function transform(userToSkill) {
const skillToUser = {};
for (const k in userToSkill) {
userToSkill[k].forEach(skill => {
if (skillToUser[skill] === void 0) {
skillToUser[skill] = [k];
} else {
skillToUser[skill].push(k);
}
});
}
return skillToUser;
}
扩展:
function backtrack(list, tempList, nums, start) {
list.push(intersect(...tempList));
for(let i = start; i < nums.length; i++) {
tempList.push(nums[i]);
backtrack(list, tempList, nums, i + 1);
tempList.pop();
}
}
/**
* @param {number[]} nums
* @return {number[][]}
*/
function subsets(nums) {
const list = [];
backtrack(list, [], nums, 0);
return list;
};
function intersect(arr1, ...rest) {
const set = new Set();
if (rest.length === 0) return set;
const s1 = new Set(arr1);
const restSet = rest.map(a => new Set(a));
for (const x of s1) {
if (restSet.every(s => s.has(x))) {
set.add(x);
}
}
return set;
}
function maxByLength(list) {
let max = 0;
let maxIndex = 0;
for(let i = 0; i < list.length; i++) {
if (list.length > max) {
max = list.length;
maxIndex = i;
}
}
return list[maxIndex];
}
function setOfUsersWithSimillarSkills(userToSkill) {
const mapper = transform(userToSkill);
const sets = subsets(Object.values(mapper).filter(q => q.length > 1));
const list = sets.map(set => Array.from(set)).filter(q => q.length);
return maxByLength(list)
}
from fe-interview.
function demo(userToSkill) {
let obj = {}
for(let item in userToSkill) {
userToSkill[item].forEach(i => {
if(obj[i]) {
obj[i].push(item)
}else {
obj[i] = [item]
}
})
}
return obj
}
from fe-interview.
function demo(userToSkill) { let obj = {} for(let item in userToSkill) { userToSkill[item].forEach(i => { if(obj[i]) { obj[i].push(item) }else { obj[i] = [item] } }) } return obj }
- 注意命名
- 虽然技能不大可能出现falsy的值。但是最好还是可以严谨一点
from fe-interview.
function setOfUsersWithSimillarSkills(userToSkill) {
const skillToUser ={};
const keylist = Object.entries(userToSkill);
keylist.foreach(item=>{
let [key,value] = item;
value.foreach(obj=>{
skillToUser[obj]?skillToUser[obj].push(key):skillToUser[obj]=[key]
})
})
return skillToUser
}
from fe-interview.
function setUserToSkill(userToSkill){
let skillToUser = {};
for (let [key,value] of Object.entries(userToSkill)) {
value.forEach(skill=>{
skill in skillToUser ? skillToUser[skill].push(key) : skillToUser[skill] = Array.of(key);
});
}
return skillToUser;
}
from fe-interview.
function setUserToSkill(userToSkill){ let skillToUser = {}; for (let [key,value] of Object.entries(userToSkill)) { value.forEach(skill=>{ skill in skillToUser ? skillToUser[skill].push(key) : skillToUser[skill] = Array.of(key); }); } return skillToUser; }
里面的let都是没有必要的。
from fe-interview.
function setOfUsersWithSimillarSkills(userToSkill) { var skillToUser ={}; var keylist = Object.entries(userToSkill); keylist.map(item=>{ let [key,value] = item; value.map(obj=>{ skillToUser[obj]?skillToUser[obj].push(key):skillToUser[obj]=[key] }) }) return skillToUser }
- 注意格式化
- 尽量使用const,而不是var,
- 这里的map是没有必要的
from fe-interview.
const transform = userToSkill =>
Object.entries(userToSkill).reduce((skillToUser, [user, skills]) =>
skills.reduce((skillToUser, skill) =>({
...skillToUser,
[skill]: skillToUser[skill] ? skillToUser[skill].concat(user) : [skill]
}), skillToUser), {})
from fe-interview.
@azl397985856 backtrack 那个没看懂。能不能讲一讲?
from fe-interview.
@azl397985856 backtrack 那个没看懂。能不能讲一讲?
仓库里面很多这种回溯法解题的,你可以参考一下。 比如 subsets问题
from fe-interview.
closed by #6
from fe-interview.
参考答案:
function transform(userToSkill) { const skillToUser = {}; for (const k in userToSkill) { userToSkill[k].forEach(skill => { if (skillToUser[skill] === void 0) { skillToUser[skill] = [k]; } else { skillToUser[skill].push(k); } }); } return skillToUser; }扩展:
function backtrack(list, tempList, nums, start) { list.push(intersect(...tempList)); for(let i = start; i < nums.length; i++) { tempList.push(nums[i]); backtrack(list, tempList, nums, i + 1); tempList.pop(); } } /** * @param {number[]} nums * @return {number[][]} */ function subsets(nums) { const list = []; backtrack(list, [], nums, 0); return list; }; function intersect(arr1, ...rest) { const set = new Set(); if (rest.length === 0) return set; const s1 = new Set(arr1); const restSet = rest.map(a => new Set(a)); for (const x of s1) { if (restSet.every(s => s.has(x))) { set.add(x); } } return set; } function maxByLength(list) { let max = 0; let maxIndex = 0; for(let i = 0; i < list.length; i++) { if (list.length > max) { max = list.length; maxIndex = i; } } return list[maxIndex]; } function setOfUsersWithSimillarSkills(userToSkill) { const mapper = transform(userToSkill); const sets = subsets(Object.values(mapper).filter(q => q.length > 1)); const list = sets.map(set => Array.from(set)).filter(q => q.length); return maxByLength(list) }
function maxByLength(list) {
let max = 0;
let maxIndex = 0;
for(let i = 0; i < list.length; i++) {
if (list[i].length > max) {
max = list[i].length;
maxIndex = i;
}
}
return list[maxIndex];
}
from fe-interview.
Related Issues (20)
- 【每日一题】- 2020-07-28 - Promise.all VS Promise. allSettled Promise.any VS Promise.race HOT 4
- 【每日一题】- 2020-08-03 - 多线程打印 HOT 5
- 【每日一题】- 2020-08-04 - 浏览器是如何解析 CSS rule 的? HOT 3
- 【每日一题】- 2020-08-05 - 运营商劫持 HOT 2
- 【每日一题】- 2020-08-06 - 讨厌的 Y HOT 3
- 【每日一题】- 2020-08-07 - 寻找祖先 HOT 5
- 【每日一题】- 2020-08-10 - JS 编程题 HOT 4
- 【节流防抖的概念弄混了】
- 【每日一题】- 2020-08-21 HOT 3
- 【每日一题】- 2020-08-25 - 编程范式 HOT 1
- 【每日一题】- 2020-09-02 - type A<T> = (x:T) => T; type B = <T>(x:T) => T; 的区别 HOT 3
- 【每日一题】- 2020-09-04 - 多个进程如何监听同一个端口 HOT 2
- 【每日一题】- 2020-09-15 - 响应头 content-type 的奇幻之旅 HOT 2
- 【每日一题】- 2020-10-09 - 以下 shell 的作用是什么? HOT 3
- 【每日一题】- 2020-10-16 - 分割数组 HOT 1
- 【每日一题】- 2020-10-21 - 字典分割 HOT 2
- 【每日一题】- 2020-04-19 - !!~A.indexOf(edge._label) 是什么意思? HOT 3
- 【每日一题】- 2021-07-12 数组的索引为什么从 0 开始?而不是从 1 开始? HOT 3
- 【开源自荐】推荐一个每日更新的前端面试题库
- 【开源自荐】SolidUI 一句话生成任何图形
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from fe-interview.