Каков наилучший подход к решению этой проблемы сортировки? - PullRequest
0 голосов
/ 18 января 2020

Для участия в розыгрыше призов каждый из них дает свое имя.

Каждая буква имени имеет значение, равное ее рангу в алфавите sh на английском языке. A и a имеют ранг 1, B и b - ранг 2 и т. Д.

Длина имени добавляется к сумме этих рангов, следовательно, число сом.

Массив случайных чисел weights связан с именами, и каждый сом умножается на соответствующий вес, чтобы получить то, что они называют выигрышным числом.

Пример:

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 строка имен , мы массив весов, на ранг

return: имя участника, чей ранг 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'

1 Ответ

2 голосов
/ 18 января 2020

Вам просто нужна многомерная сортировка, сначала сортируйте имена по рангу, а затем по алфавиту (игнорируя регистр):

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));

CAROL

Примечание: я не t проверка ошибок (пустые списки и т. д. c), будьте осторожны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...