Вопрос о реальной жизни, найдите ближайший номер комнатыJavascript

Форум по Javascript
Ответить
Anonymous
 Вопрос о реальной жизни, найдите ближайший номер комнаты

Сообщение Anonymous »

Образец < /p>
const roomsByFloor = {
"5": [
{ "floor": 5, "room": 2, "type": "A" },
{ "floor": 5, "room": 3, "type": "A" },
{ "floor": 5, "room": 4, "type": "A" },
{ "floor": 5, "room": 5, "type": "B" },
{ "floor": 5, "room": 6, "type": "B" },
{ "floor": 5, "room": 43, "type": "B" },
{ "floor": 5, "room": 57, "type": "B" },
{ "floor": 5, "room": 58, "type": "A" },
{ "floor": 5, "room": 70, "type": "C" },
{ "floor": 5, "room": 72, "type": "C" }
]
};
< /code>
dise
console.log(getNearestRooms("2A,2B,2C")); // the expect answer is 4 43 57 58 70 72< /code>
это означает выбрать 2 комнаты из категории A, 2 комнат из категории B и 2 комнат из категории c. < /p>
Ограничение: < /p>

[*] Выбранные комнаты должны быть ближе всего к комнатам из разных категорий < /li>
< /ol>

Пример, 2a может быть 2 3 4 58 Но кратчайшее расстояние до B и C составляет 4 и 58 < /li>
< /ul>

Количество выбранных комнат Необходимо соответствовать: Для тестирования можно добавить больше комнат. Запрос может быть отредактирован как «2a, 1b, 2c»
[*] Для ввода «2a, 2b», результат должен быть 3, 4, 5, 6
Для ввода "2b, 2c", результат должен быть 43, 57, 70, 72 < /code> < /li>
< /ol>
console.log(getNearestRooms("2A,2B,2C")); // Expected output: [4, 43, 57, 58, 70, 72]
console.log(getNearestRooms("2A,2B")); // Expected output: [3, 4, 5, 6]
console.log(getNearestRooms("2B,2C")); // Expected output: [43, 57, 70, 72]
console.log(getNearestRooms("1A,1B,1C")); // Expected output: [58, 57, 70]
console.log(getNearestRooms("3A,3B,3C")); // Expected output: [3, 4, 5, 6, 70, 72]
< /code>
Первоначально, я думал, что это можно решить с помощью техники скользящего окна, но это оказалось сложнее, чем ожидалось, и я не смог его решить. Какой другой метод может быть применен?const roomsByFloor = {
"5": [
{ "floor": 5, "room": 2, "type": "A" },
{ "floor": 5, "room": 3, "type": "A" },
{ "floor": 5, "room": 4, "type": "A" },
{ "floor": 5, "room": 5, "type": "B" },
{ "floor": 5, "room": 6, "type": "B" },
{ "floor": 5, "room": 43, "type": "B" },
{ "floor": 5, "room": 57, "type": "B" },
{ "floor": 5, "room": 58, "type": "A" },
{ "floor": 5, "room": 70, "type": "C" },
{ "floor": 5, "room": 72, "type": "C" }
]
};

function getNearestRooms(request) {
// Parse request: Extract number & type of each required room
let roomRequests = request.split(',').map(category => ({
count: parseInt(category.match(/\d+/)[0]), // "2A" → 2
type: category.match(/[a-zA-Z]+/)[0].toUpperCase() // "2A" → "A"
}));

let result = [];

for (let floor in roomsByFloor) {
let floorRooms = roomsByFloor[floor]; // Get all rooms on this floor
let counts = {}; // Frequency map for room types in the current window
let left = 0, right = 0;
let closestDistance = Infinity;
let floorResult = [];

// Expand the window with right pointer
while (right < floorRooms.length) {
let rightRoom = floorRooms[right];
counts[rightRoom.type] = (counts[rightRoom.type] || 0) + 1;
right++;

// Try to shrink the window while still satisfying conditions
while (roomRequests.every(req => counts[req.type] >= req.count)) {
let currentDistance = floorRooms[right - 1].room - floorRooms[left].room;

// Update the best result if this subset is smaller
if (currentDistance < closestDistance) {
closestDistance = currentDistance;
floorResult = floorRooms.slice(left, right).map(r => r.floor * 100 + r.room);
}

// Remove leftmost room from window and shift `left`
let leftRoom = floorRooms[left];
counts[leftRoom.type]--;
if (counts[leftRoom.type] === 0) delete counts[leftRoom.type];
left++;
}
}

if (floorResult.length) {
result = floorResult;
}
}

return result;
}

console.log(getNearestRooms("2A,2B,2C"));



Подробнее здесь: https://stackoverflow.com/questions/794 ... oom-number
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»