[英]What is the best approach to solve this sorting problem?
為了參加抽獎,每個人都給出了他/她的名字。
名字的每個字母都有一個值,即它在英文字母表中的排名。 A 和 a 的等級為 1,B 和 b 的等級為 2,依此類推。
名字的長度被添加到這些等級的總和中,因此是一個數字 som。
一組隨機權重與名字相關聯,每個 som 乘以其相應的權重得到他們所謂的中獎號碼。
例子:
names: "COLIN,AMANDBA,AMANDAB,CAROL,PauL,JOSEPH"
weights: [1, 4, 4, 5, 2, 1]
PauL -> som = length of firstname + 16 + 1 + 21 + 12 = 4 + 50 -> 54
The *weight* associated with PauL is 2 so PauL's *winning number* is 54 * 2 = 108.
Now one can sort the firstnames in decreasing order of the winning numbers. When two people have the same winning number sort them alphabetically by their firstnames.
任務:參數:st 一串名字,we 一個權重數組,na rank
返回:排名為n的參與者的名字(排名從1開始編號)
現在可以按中獎號碼的降序對名字進行排序。 當兩個人的中獎號碼相同時,按名字的字母順序對他們進行排序。
這是我的解決方案,但它沒有考慮名稱的數值相同的情況(我使用第一個值)。
function charToNumber (s, i) {
return parseInt(s.charAt(i), 36) - 9;
}
function sumChars (s, weight) {
var i = s.length, r = 0;
while (--i >= 0) r += charToNumber(s, i);
return r + s.length;
}
function rank(st, we, n) {
let result, arr
const hashTable = {};
let resultsArr = [];
arr = st.split(',')
if (st.length === 0) {
return "No participants";
} else if (n > arr.length) {
return "Not enough participants";
}
arr.forEach((name, i) => {
const total = sumChars(name) * we[i];
hashTable[name] = total;
nameMap.set(name, total);
resultsArr.push(total);
});
resultsArr.sort((a, b) => a - b).reverse();
const correctSum = resultsArr[n-1];
for (const prop in hashTable) {
if (hashTable[prop] === correctSum) {
result = prop;
break;
}
}
return result;
}
//rank('Grace,Jacob,Jayden,Daniel,Lily,Samantha,Aubrey,David,Liam,Willaim,Addison,Robert,Alexander,Avery,Isabella,Mia,Noah,James,Olivai,Emily,Ella,Sophia,Natalie,Benjamin,Lyli,Madison', [2,4,1,1,3,6,6,4,4,5,4,6,3,6,6,6,6,6,5,6,5,1,4,1,5,5], 7);
// should return 'Isabella'
//rank('Emily,Benjamin,Ava,Joshua,Isabella,Michael,Matthew,Olivai,William,Willaim,David,Lyli', [3,3,3,6,6,4,6,6,3,3,6,4], 6);
// should return 'Willaim', not 'William'
您只需要一個多維排序,首先按等級排序名稱,然后按字母順序排序(忽略大小寫):
var names = ["COLIN","AMANDBA","AMANDAB","CAROL","PauL","JOSEPH"];
var weights = [1, 4, 4, 5, 2, 1];
function compute_score(name, weight) {
// XXX: code for computing the actual score goes her
return weight;
}
function winner(names, weights) {
var scores = {};
for (var ii=0; ii < names.length; ii++) {
scores[names[ii]] = compute_score(name, weight);
}
return names.sort(
function (a,b) {
if (scores[a] > scores[b]) return -1;
if (scores[a] < scores[b]) return +1;
if (a.toLowerCase() < b.toLowerCase()) return -1;
if (a.toLowerCase() > b.toLowerCase()) return +1;
return 0; // equal
}
)[0];
}
console.log(winner(names, weights));
頌歌
注意我不檢查錯誤(空列表等),要小心。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.