c# - C# 中的房间管理程序
问题描述
以下程序旨在重现基本的酒店房间预订方案。创建酒店号实例后,通过调用该checkIn()
方法,程序会检查是否有可用房间,如果有则保留房间。
checkOut()
但是,如果在分配完所有房间后,有人从一个房间(通过方法)退房,例如房间号 1,然后尝试入住该房间,则它不起作用。checkIn()
调用方法时会出现此问题hasRoomsAvailable()
,在这种情况下返回 false 而不是 true,因为事实currentRoomNumber
是 5。
在不改变每种方法的时间复杂度的情况下,有人可以建议如何解决这个问题,理想情况下如何改进设计?
using System;
namespace HotelManagement
{
//Hotel class
public class Hotel
{
private bool[] available;
private int totalNumberOfRooms;
private int currentRoomNumber;
// constructor to set number of rooms
private Hotel(int totalNumberOfRooms)
{
this.totalNumberOfRooms = totalNumberOfRooms;
available = new bool[totalNumberOfRooms];
for (int i = 0; i < totalNumberOfRooms; i++)
available[i] = true;
}
//Returns true if room is available
private bool hasRoomsAvailable()
{
if (currentRoomNumber < totalNumberOfRooms &&
available[currentRoomNumber])
return available[currentRoomNumber];
else
return false;
}
//Time Complexity: O(1)
//Checks if there's at least one room available and it reserves it
private int checkIn()
{
if (hasRoomsAvailable())
{
available[currentRoomNumber] = false;
return ++currentRoomNumber;
}
else
return -1;
}
//Time Complexity: O(1)
//Check out method
private void checkOut(int roomNumber)
{
if (roomNumber <= totalNumberOfRooms && roomNumber != -1)
{
if (available[roomNumber - 1] == false)
{
available[roomNumber - 1] = true;
Console.WriteLine("Check out room : {0}", roomNumber);
}
else
Console.WriteLine("Invalid Check Out : {0}", roomNumber);
}
else
Console.WriteLine("Incorrect room number : {0}", roomNumber);
}
//Time Complexity: O(1)
public static void Main(string[] args)
{
//Create an instance of Hotel with 5 rooms
Hotel hotel = new Hotel(5);
int roomNum = -1;
if (hotel.hasRoomsAvailable())
{
roomNum = hotel.checkIn();
Console.WriteLine("Room Allocated is: {0}", roomNum);
roomNum = hotel.checkIn();
Console.WriteLine("Room Allocated is: {0}", roomNum);
roomNum = hotel.checkIn();
Console.WriteLine("Room Allocated is: {0}", roomNum);
roomNum = hotel.checkIn();
Console.WriteLine("Room Allocated is: {0}", roomNum);
roomNum = hotel.checkIn();
Console.WriteLine("Room Allocated is: {0}", roomNum);
}
hotel.checkOut(1);
roomNum = hotel.checkIn();
Console.WriteLine("Room Allocated is: {0}", roomNum);
//pause program output on console
Console.ReadLine();
}
}
}
解决方案
bool[] available
找个可以入住的房间就够了。维护currentRoomNumber
带来的困难多于其价值。
public class Hotel
{
private bool[] available;
private int totalNumberOfRooms;
// constructor to set number of rooms
public Hotel(int totalNumberOfRooms)
{
this.totalNumberOfRooms = totalNumberOfRooms;
available = new bool[totalNumberOfRooms];
for (int i = 0; i < totalNumberOfRooms; i++)
available[i] = true;
}
//Returns true if room is available
public bool hasRoomsAvailable()
{
return available.Any(room => room);
}
//Time Complexity: O(1)
//Checks if there's at least one room available and it reserves it
public int checkIn()
{
for(int room = 0; room < totalNumberOfRooms; room++)
{
if (available[room])
{
available[room] = false;
return room + 1;
}
}
return -1;
}
//Time Complexity: O(1)
//Check out method
public void checkOut(int roomNumber)
{
if (roomNumber <= totalNumberOfRooms && roomNumber > 0)
{
if (available[roomNumber - 1] == false)
{
available[roomNumber - 1] = true;
Console.WriteLine("Check out room : {0}", roomNumber);
}
else
Console.WriteLine("Invalid Check Out : {0}", roomNumber);
}
else
Console.WriteLine("Incorrect room number : {0}", roomNumber);
}
}
public static void Main(string[] args)
{
//Create an instance of Hotel with 5 rooms
Hotel hotel = new Hotel(5);
int roomNum = -1;
if (hotel.hasRoomsAvailable())
{
roomNum = hotel.checkIn();
Console.WriteLine("Room Allocated is: {0}", roomNum);
roomNum = hotel.checkIn();
Console.WriteLine("Room Allocated is: {0}", roomNum);
roomNum = hotel.checkIn();
Console.WriteLine("Room Allocated is: {0}", roomNum);
roomNum = hotel.checkIn();
Console.WriteLine("Room Allocated is: {0}", roomNum);
roomNum = hotel.checkIn();
Console.WriteLine("Room Allocated is: {0}", roomNum);
}
hotel.checkOut(1);
roomNum = hotel.checkIn();
Console.WriteLine("Room Allocated is: {0}", roomNum);
Console.ReadLine();
}
使用 Queue 存储可用房间的 O(1) 复杂度的解决方案:
public class Hotel
{
private Queue<int> rooms;
private int totalNumberOfRooms;
// constructor to set number of rooms
public Hotel(int totalNumberOfRooms)
{
this.totalNumberOfRooms = totalNumberOfRooms;
rooms = new Queue<int>();
for (int i = 1; i <= totalNumberOfRooms; i++)
rooms.Enqueue(i);
}
//Returns true if room is available
public bool hasRoomsAvailable()
{
return rooms.Count > 0;
}
//Time Complexity: O(1)
//Checks if there's at least one room available and it reserves it
public int checkIn()
{
if (rooms.Count > 0)
return rooms.Dequeue();
return -1;
}
//Time Complexity: O(1)
//Check out method
public void checkOut(int roomNumber)
{
if (roomNumber <= totalNumberOfRooms && roomNumber > 0)
{
Console.WriteLine("Check out room : {0}", roomNumber);
rooms.Enqueue(roomNumber);
}
else
Console.WriteLine("Incorrect room number : {0}", roomNumber);
}
}
public static void Main(string[] args)
{
//Create an instance of Hotel with 5 rooms
Hotel hotel = new Hotel(5);
int roomNum = -1;
if (hotel.hasRoomsAvailable())
{
roomNum = hotel.checkIn();
Console.WriteLine("Room Allocated is: {0}", roomNum);
roomNum = hotel.checkIn();
Console.WriteLine("Room Allocated is: {0}", roomNum);
roomNum = hotel.checkIn();
Console.WriteLine("Room Allocated is: {0}", roomNum);
roomNum = hotel.checkIn();
Console.WriteLine("Room Allocated is: {0}", roomNum);
roomNum = hotel.checkIn();
Console.WriteLine("Room Allocated is: {0}", roomNum);
}
hotel.checkOut(4);
hotel.checkOut(2);
roomNum = hotel.checkIn();
Console.WriteLine("Room Allocated is: {0}", roomNum);
roomNum = hotel.checkIn();
Console.WriteLine("Room Allocated is: {0}", roomNum);
//pause program output on console
Console.ReadLine();
}
推荐阅读
- javascript - 为什么在此之后使用逗号?
- r - 宽到长面板数据
- javascript - 如何使用 reactjs 使用 axios 添加分页
- c# - 无法获取具有 CLSID {A9E69610-B80D-11D0-B9B9-00A0C922E750} 错误的组件的类工厂 de COM 错误:80040154 未注册类
- c# - c# 使用 Google.Apis.Calendar.v3 创建下个月每个工作日的会议 30 分钟事件
- html - 如何将此引用块放在此图像上
- python - 访问字典列表中给定键的值
- reactjs - 如何在 React JS 中构建重置按钮?
- mysql - 无法使用 ORDER BY 对数据进行排序
- amazon-web-services - 精细取消阶跃功能