Hackerrank Array manipulation and comparison question 我被要求担任初级软件工程师职位

Hackerrank Array manipulation and comparison question I was asked for Junior software engineer position

我最近申请了一家大银行的初级软件工程师职位,我得到了这个问题作为一个挑战,另一个问题的时间限制为两个小时,这个问题被标记为简单问题。我做不到,但我很好奇是否有人可以为我提供一个解决方案,说明如何最好使用 javascript 来解决这个特定问题。如果有人能给我这个问题的答案,我将不胜感激,因为我渴望学习并成为一名更好的程序员。

提前感谢您的帮助。

问题描述:
给定两个 random 数组 st,必须使用函数 对它们进行比较checker 到 return 'YES' 如果它们相似或 return 'NO' 如果它们不相似。

数组相似与不相似的判断标准如下:

1)数组相似的场景:

s = [10,20,10,20,-10,10,10,-40,-20] t = [20,10,-30,30,20,20,-10,-2​​0,-30]

s 和 t 必须是两个数组,它们在 lengthdifferenceequal ] 某些公共元素在每个数组中出现的次数必须等于或小于 3。在这种特定情况下,元素 10 出现在 s 4 次,在数组 t 中出现 1 次,因此,它在两个数组中的出现次数之差为 4-1= 3,类似地 20s中出现了2次,在t中出现了3次,因此20的出现次数与两个数组是 3-2 = 1,其中 1 < 3.

此外,两个数组的长度相同,在本例中为 8(数组从索引 0 开始),因此数组 st 在这种情况下是相似的,因此,'YES' 必须由函数 return 编辑。

2)数组不相同的场景:

s = [10,20,10,20,-10,10,10,30,-20, 10, 20, 10] t = [20,10,30,30,20,20,-10,-2​​0,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]));

  1. 检查长度是否相等
  2. 构造一个空的 hashmap
  3. 遍历第一个列表,每次涉及每个值时加 1
  4. 遍历第二个列表,如上减1
  5. 遍历 hashmap 的每个值,如果任何数字 > 3 或 < -3,return false
  6. 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]));