プログラマ-ランキング検索
21437 ワード
1.質問
質問リンク
説明:
コカソは下半期にベテラン開発者を公開募集しており、応募とコードテストは終了している.今回の募集では、応募者は申請書に記入する際に以下の4つを選択しなければなりません.
たとえば、開発チームが知りたい問題は次のとおりです.
Javaでコードテストに参加し、バックグラウンドの職業を選び、初級経験を持ち、SoulFoodピザを選んだ人のうち、50点以上のコードテスト点数を獲得した人は何人いますか?
もちろん、各開発チームの状況によっては、次のような問題が発生する可能性があります.
サポート担当者がサポート書に入力した4つの情報と、得られた符号化テスト点数を1つの文字列に構成する場合、配列情報および開発チームが好奇心を持っているクエリー条件が文字列形式で提供される配列クエリーをパラメータとする場合.
解答関数を完了し、各ドアの条件に合致する人数を順番に並べて返してください.
せいげんじょうけん
2.解答
この問題は
info
アレイのみで、完全なナビゲーションを行うとタイムアウトします.ブラウズに適した最適なテーブルを作成し、Xポイント以上の数を検索することができます.
「low boundを使うのがちょうどいい」
計画1-ナビゲーション可能な最適なテーブルの作成
const map = info.reduce((m, v) => {
v = v.split(' ');
const score = Number(v[4]);
(function f(depth, key) {
if (depth == 4) {
m[key] = m[key] || [];
m[key].push(score);
return;
}
f(depth + 1, key + '-'); // 포함시키지 않거나
f(depth + 1, key + v[depth]); // 포함시키거나
})(0, '');
return m;
}, {});
info
の周りに配置され、各参加者に対する情報すべての場合、結合キー(含むか含まないか)を作成します.
対応するスコアを配列にプッシュします.
計画2-計画1で作成したテーブルのすべての配列を整列
Object.values(map).forEach((scores) => scores.sort((a, b) => a - b));
lower_bound
を使用するには、まずソートする必要があります.計画3-
lower_bound
を使用してクエリーを実行return query.map((q) => {
const key = q.replace(/ and |\s\d+$/g, ''); // 정규식으로 키 추출
const scores = map[key]; // 키에 해당하는 array
if (!scores) return 0; // array가 undefined, 즉 존재 안함
const score = Number(q.match(/\d+$/)[0]); // 정규식으로 점수 추출
let s = 0;
let e = scores.length;
while (e > s) { // lower_bound 수행
const mid = Math.floor((s + e) / 2);
if (scores[mid] < score) {
s = mid + 1;
}
else {
e = mid;
}
}
return scores.length - e;
});
このようにして行うと,タイムアウトせずに問題を通過することができる.3.完全なコード
function solution(info, query) {
const map = info.reduce((m, v) => {
v = v.split(' ');
const score = Number(v[4]);
(function f(depth, key) {
if (depth == 4) {
m[key] = m[key] || [];
m[key].push(score);
return;
}
f(depth + 1, key + '-');
f(depth + 1, key + v[depth]);
})(0, '');
return m;
}, {});
Object.values(map).forEach((scores) => scores.sort((a, b) => a - b));
return query.map((q) => {
const key = q.replace(/ and |\s\d+$/g, '');
const scores = map[key];
if (!scores) return 0;
const score = Number(q.match(/\d+$/)[0]);
let s = 0;
let e = scores.length;
while (e > s) {
const mid = Math.floor((s + e) / 2);
if (scores[mid] < score) {
s = mid + 1;
}
else {
e = mid;
}
}
return scores.length - e;
});
}
Reference
この問題について(プログラマ-ランキング検索), 我々は、より多くの情報をここで見つけました https://velog.io/@front/프로그래머스-순위-검색テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol