C++程序:检查客人入住记录后查找房间状态


假设我们有一个字符串 S,其中包含 'L'、'R' 和数字 0 到 9。假设有一家酒店有 10 个房间,从左到右编号为 0 到 9。酒店有两个入口——一个在左侧,另一个在右侧。当顾客从左侧入口进入酒店时,他们会得到最靠近左侧入口的空房间。类似地,当顾客从右侧入口进入酒店时,他们会得到最靠近右侧入口的空房间。但我们丢失了房间分配列表。但我们记得所有顾客:顾客何时到达、从哪个入口到达以及何时离开酒店。最初酒店是空的。我们必须从记忆中恢复房间分配列表。在 S 中,'L' 表示顾客从左侧入口进入,如果为 'R',则表示他/她从右侧入口进入,数字 d 表示顾客离开房间 d。我们必须返回房间状态。一个长度为 10 的字符串,其中 0 表示房间为空,否则表示房间已占用。

因此,如果输入类似于 S = "LLRL1RL1",则输出将为 "1010000011",因为

首先,所有房间都是空的。状态 0000000000。

  • L - 顾客从左侧入口进入酒店。状态 1000000000。
  • L - 来自左侧入口的顾客。状态 1100000000。
  • R - 来自右侧入口的顾客。状态 1100000001。
  • L - 来自左侧入口的顾客。状态 1110000001。
  • 1 - 房间 1 的顾客离开。状态 1010000001。
  • R - 来自右侧入口的顾客。状态 1010000011。
  • L - 来自左侧入口的顾客。状态 1110000011。
  • 1 - 房间 1 的顾客离开。状态 1010000011。

步骤

为了解决这个问题,我们将遵循以下步骤:

n := size of S
a := "0000000000"
for initialize i := 0, when i < n, update (increase i by 1), do:
   if S[i] is same as 'L', then:
      set left most 0 in a to 1
   if S[i] is same as 'R', then:
      set right most 0 in a to 1
   Otherwise
      set S[i]th place in a to 0
return a

示例

让我们看看以下实现以更好地理解:

#include <bits/stdc++.h>
using namespace std;

string solve(string S) {
   int n = S.size();
   string a = "0000000000";
   for (int i = 0; i < n; i++) {
      if (S[i] == 'L')
         a[a.find('0')] = '1';
      if (S[i] == 'R')
         a[a.rfind('0')] = '1';
      else
         a[S[i] - '0'] = '0';
   }
   return a;
}
int main() {
   string S = "LLRL1RL1";
   cout << solve(S) << endl;
}

输入

"LLRL1RL1"

输出

1010000011

更新于: 2022年3月4日

279 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.