Hackerrank Array manipulation and comparison question 我被要求担任初级软件工程师职位
Hackerrank Array manipulation and comparison question I was asked for Junior software engineer position
我最近申请了一家大银行的初级软件工程师职位,我得到了这个问题作为一个挑战,另一个问题的时间限制为两个小时,这个问题被标记为简单问题。我做不到,但我很好奇是否有人可以为我提供一个解决方案,说明如何最好使用 javascript 来解决这个特定问题。如果有人能给我这个问题的答案,我将不胜感激,因为我渴望学习并成为一名更好的程序员。
提前感谢您的帮助。
问题描述:
给定两个 random 数组 s 和 t,必须使用函数 对它们进行比较checker 到 return 'YES' 如果它们相似或 return 'NO' 如果它们不相似。
数组相似与不相似的判断标准如下:
1)数组相似的场景:
s = [10,20,10,20,-10,10,10,-40,-20]
t = [20,10,-30,30,20,20,-10,-20,-30]
s 和 t 必须是两个数组,它们在 length 和 difference 中 equal ] 某些公共元素在每个数组中出现的次数必须等于或小于 3。在这种特定情况下,元素 10 出现在 s 4 次,在数组 t 中出现 1 次,因此,它在两个数组中的出现次数之差为 4-1= 3,类似地 20在s中出现了2次,在t中出现了3次,因此20的出现次数与两个数组是 3-2 = 1,其中 1 < 3.
此外,两个数组的长度相同,在本例中为 8(数组从索引 0 开始),因此数组 s 和 t 在这种情况下是相似的,因此,'YES' 必须由函数 return 编辑。
2)数组不相同的场景:
s = [10,20,10,20,-10,10,10,30,-20, 10, 20, 10]
t = [20,10,30,30,20,20,-10,-20,30,30,30]
在这种情况下,10 在 s 中出现 6 次,在 t 中出现 1 次,因此 6-1 = 5,所以 5> 3、同理30在t中出现5次,在s中出现1次,因此,5-1 = 4, 4>3和长度数组不一样,因此这些数组不相似,'NO' 必须 returned。
这道题的答题时间是 1 小时。
function checker(s,t)
{
// Write your code here
}
我解决这个问题的方法是首先按递增顺序对数组进行排序,然后使用 if 条件检查它们的长度是否相似,然后尝试检查哪些数字多次出现等数组本身。
你可以先检查长度,如果不相等就早点退出。
然后计算每个值,向上 s
,向下 t
。
Return每个值的检查。
function checker(s, t) {
if (s.length !== t.length) return 'NO';
const
count = o => d => v => o[v] = (o[v] || 0) + d,
counts = {},
add = count(counts);
s.forEach(add(1));
t.forEach(add(-1));
return Object
.values(counts)
.every(v => Math.abs(v) <= 3)
? 'YES'
: 'NO';
}
console.log(checker([10, 20, 10, 20, -10, 10, 10, -40, -20], [20, 10, -30, 30, 20, 20, -10, -20, -30]));
console.log(checker([10, 20, 10, 20, -10, 10, 10, 30, -20, 10, 20, 10], [20, 10, 30, 30, 20, 20, -10, -20, 30, 30, 30]));
- 检查长度是否相等
- 构造一个空的 hashmap
- 遍历第一个列表,每次涉及每个值时加 1
- 遍历第二个列表,如上减1
- 遍历 hashmap 的每个值,如果任何数字 > 3 或 < -3,return false
- return 如果还没有超出函数则为真
true/false可以代替YES/NO
这个解决方案是在 O(n) 时间和 O(n) space.
function checker(s, t) {
if (s.length !== t.length) return 'NO';
const occurances = {};
for (const val of s) {
if (!occurances[val]) occurances[val] = 1;
else occurances[val]++;
}
for (const val of t) {
if (!occurances[val]) occurances[val] = -1;
else occurances[val]--;
}
for (const val of Object.values(occurances)) {
if (val > 3 || val < -3) return 'NO';
}
return 'YES';
}
console.log(checker([10, 20, 10, 20, -10, 10, 10, -40, -20], [20, 10, -30, 30, 20, 20, -10, -20, -30]));
console.log(checker([10, 20, 10, 20, -10, 10, 10, 30, -20, 10, 20, 10], [20, 10, 30, 30, 20, 20, -10, -20, 30, 30, 30]));
创建一个映射来跟踪每个数组的计数,然后查看哪些偏离 > 3。
function checker(s, t) {
if (s.length !== t.length) return 'NO';
function makeCountMap(arr) {
return arr.reduce((p, c) => {
if (!p[c]) {
p[c] = 0;
}
p[c]++;
return p;
}, {});
}
const sCountMap = makeCountMap(s);
const tCountMap = makeCountMap(t);
return Object
.entries(sCountMap)
.every(entry => Math.abs(entry[1] - tCountMap[entry[0]] || 0) <= 3)
? 'YES'
: 'NO';
}
console.log(checker([10, 20, 10, 20, -10, 10, 10, -40, -20], [20, 10, -30, 30, 20, 20, -10, -20, -30]));
console.log(checker([10, 20, 10, 20, -10, 10, 10, 30, -20, 10, 20, 10], [20, 10, 30, 30, 20, 20, -10, -20, 30, 30, 30]));
我最近申请了一家大银行的初级软件工程师职位,我得到了这个问题作为一个挑战,另一个问题的时间限制为两个小时,这个问题被标记为简单问题。我做不到,但我很好奇是否有人可以为我提供一个解决方案,说明如何最好使用 javascript 来解决这个特定问题。如果有人能给我这个问题的答案,我将不胜感激,因为我渴望学习并成为一名更好的程序员。
提前感谢您的帮助。
问题描述:
给定两个 random 数组 s 和 t,必须使用函数 对它们进行比较checker 到 return 'YES' 如果它们相似或 return 'NO' 如果它们不相似。
数组相似与不相似的判断标准如下:
1)数组相似的场景:
s = [10,20,10,20,-10,10,10,-40,-20] t = [20,10,-30,30,20,20,-10,-20,-30]
s 和 t 必须是两个数组,它们在 length 和 difference 中 equal ] 某些公共元素在每个数组中出现的次数必须等于或小于 3。在这种特定情况下,元素 10 出现在 s 4 次,在数组 t 中出现 1 次,因此,它在两个数组中的出现次数之差为 4-1= 3,类似地 20在s中出现了2次,在t中出现了3次,因此20的出现次数与两个数组是 3-2 = 1,其中 1 < 3.
此外,两个数组的长度相同,在本例中为 8(数组从索引 0 开始),因此数组 s 和 t 在这种情况下是相似的,因此,'YES' 必须由函数 return 编辑。
2)数组不相同的场景:
s = [10,20,10,20,-10,10,10,30,-20, 10, 20, 10] t = [20,10,30,30,20,20,-10,-20,30,30,30]
在这种情况下,10 在 s 中出现 6 次,在 t 中出现 1 次,因此 6-1 = 5,所以 5> 3、同理30在t中出现5次,在s中出现1次,因此,5-1 = 4, 4>3和长度数组不一样,因此这些数组不相似,'NO' 必须 returned。
这道题的答题时间是 1 小时。
function checker(s,t)
{
// Write your code here
}
我解决这个问题的方法是首先按递增顺序对数组进行排序,然后使用 if 条件检查它们的长度是否相似,然后尝试检查哪些数字多次出现等数组本身。
你可以先检查长度,如果不相等就早点退出。
然后计算每个值,向上 s
,向下 t
。
Return每个值的检查。
function checker(s, t) {
if (s.length !== t.length) return 'NO';
const
count = o => d => v => o[v] = (o[v] || 0) + d,
counts = {},
add = count(counts);
s.forEach(add(1));
t.forEach(add(-1));
return Object
.values(counts)
.every(v => Math.abs(v) <= 3)
? 'YES'
: 'NO';
}
console.log(checker([10, 20, 10, 20, -10, 10, 10, -40, -20], [20, 10, -30, 30, 20, 20, -10, -20, -30]));
console.log(checker([10, 20, 10, 20, -10, 10, 10, 30, -20, 10, 20, 10], [20, 10, 30, 30, 20, 20, -10, -20, 30, 30, 30]));
- 检查长度是否相等
- 构造一个空的 hashmap
- 遍历第一个列表,每次涉及每个值时加 1
- 遍历第二个列表,如上减1
- 遍历 hashmap 的每个值,如果任何数字 > 3 或 < -3,return false
- return 如果还没有超出函数则为真
true/false可以代替YES/NO
这个解决方案是在 O(n) 时间和 O(n) space.
function checker(s, t) {
if (s.length !== t.length) return 'NO';
const occurances = {};
for (const val of s) {
if (!occurances[val]) occurances[val] = 1;
else occurances[val]++;
}
for (const val of t) {
if (!occurances[val]) occurances[val] = -1;
else occurances[val]--;
}
for (const val of Object.values(occurances)) {
if (val > 3 || val < -3) return 'NO';
}
return 'YES';
}
console.log(checker([10, 20, 10, 20, -10, 10, 10, -40, -20], [20, 10, -30, 30, 20, 20, -10, -20, -30]));
console.log(checker([10, 20, 10, 20, -10, 10, 10, 30, -20, 10, 20, 10], [20, 10, 30, 30, 20, 20, -10, -20, 30, 30, 30]));
创建一个映射来跟踪每个数组的计数,然后查看哪些偏离 > 3。
function checker(s, t) {
if (s.length !== t.length) return 'NO';
function makeCountMap(arr) {
return arr.reduce((p, c) => {
if (!p[c]) {
p[c] = 0;
}
p[c]++;
return p;
}, {});
}
const sCountMap = makeCountMap(s);
const tCountMap = makeCountMap(t);
return Object
.entries(sCountMap)
.every(entry => Math.abs(entry[1] - tCountMap[entry[0]] || 0) <= 3)
? 'YES'
: 'NO';
}
console.log(checker([10, 20, 10, 20, -10, 10, 10, -40, -20], [20, 10, -30, 30, 20, 20, -10, -20, -30]));
console.log(checker([10, 20, 10, 20, -10, 10, 10, 30, -20, 10, 20, 10], [20, 10, 30, 30, 20, 20, -10, -20, 30, 30, 30]));