我最近申請了一家大銀行的初級軟體工程師職位,我收到了這個問題作為一個挑戰,另一個問題的時間限制為兩個小時,這個問題被標記為簡單問題。我無法做到這一點,但我很好奇是否有人可以為我提供一個解決方案,讓我更好地使用 javascript 來解決這個特定問題。我將非常感謝任何能給我這個問題答案的人,因為我渴望學習并成為一個更好的程式員。
提前謝謝你的幫助。
問題描述:
給定兩個隨機陣列s和t,必須使用函式檢查器對它們進行比較,如果它們相似則回傳“YES”,如果它們不相似則回傳“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 必須是長度相等的兩個陣列,并且每個陣列中某些公共元素出現的次數之差必須等于或小于 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' 必須由函式回傳。
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”。
解決這個問題的時間限制是 1 小時。
function checker(s,t)
{
// Write your code here
}
我解決這個問題的方法是首先按遞增順序對陣列進行排序,然后使用 if 條件檢查它們的長度是否相似,然后嘗試檢查陣列本身中哪些數字多次出現等。
uj5u.com熱心網友回復:
- 檢查長度相等
- 構造一個空的 hashmap<T, int>
- 遍歷第一個串列,每次涉及每個值時加 1
- 遍歷第二個串列,如上所述減去 1
- 遍歷 hashmap 的每個值,如果任何數字 > 3 或 < -3,則回傳 false
- 如果不在函式之外,則回傳 true
true/false 可以代替 YES/NO
該解決方案在 O(n) 時間和 O(n) 空間中。
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]));
uj5u.com熱心網友回復:
創建一個跟蹤每個陣列計數的映射,然后查看哪些陣列偏離 > 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]));
uj5u.com熱心網友回復:
您可以先檢查長度,如果不相等則提前退出。
然后計算每個值,向上s和向下計算t。
回傳每個值的檢查。
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]));
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/430618.html
標籤:javascript 数组 排序
下一篇:專案問題-java新手
