Write a function "runCustomerSimulation" that takes following two inputs
- An integer 'n': total number of computers in a cafe and a string:
- A sequence of uppercase letters 'seq': Letters in the sequence occur in pairs. The first occurrence indicates the arrival of a customer; the second indicates the departure of that same customer.
A customer will be serviced if there is an unoccupied computer. No letter will occur more than two times.
Customers who leave without using a computer always depart before customers who are currently using the computers. There are at most 20 computers per cafe.
For each set of input the function should output a number telling how many customers, if any walked away without using a computer. Return 0 if all the customers were able to use a computer.
runCustomerSimulation (2, "ABBAJJKZKZ") should return 0
runCustomerSimulation (3, "GACCBDDBAGEE") should return 1 as 'D' was not able to get any computer
runCustomerSimulation (3, "GACCBGDDBAEE") should return 0
runCustomerSimulation (1, "ABCBCA") should return 2 as 'B' and 'C' were not able to get any computer.
runCustomerSimulation(1, "ABCBCADEED") should return 3 as 'B', 'C' and 'E' were not able to get any computer.
Source: Fiberlink (maas360) Interview
We strongly recommend to minimize your browser and try this yourself first.
Below are simple steps to find number of customers who could not get any computer.
- Initialize result as 0.
- Traverse the given sequence. While traversing, keep track of occupied computers (this can be done by keeping track of characters which have appeared only once and a computer was available when they appeared). At any point, if count of occupied computers is equal to 'n', and there is a new customer, increment result by 1.
The important thing is to keep track of existing customers in cafe in a way that can indicate whether the customer has got a computer or not. Note that in sequence "ABCBCADEED", customer 'B' did not get a seat, but still in cafe as a new customer 'C' is next in sequence.
Below are implementations of above idea.
// C++ program to find number of customers who couldn't get a resource.
#include<iostream>
#include<cstring>
using namespace std;
#define MAX_CHAR 26
// n is number of computers in cafe.
// 'seq' is given sequence of customer entry, exit events
int runCustomerSimulation(int n, const char *seq)
{
// seen[i] = 0, indicates that customer 'i' is not in cafe
// seen[1] = 1, indicates that customer 'i' is in cafe but
// computer is not assigned yet.
// seen[2] = 2, indicates that customer 'i' is in cafe and
// has occupied a computer.
char seen[MAX_CHAR] = {0};
// Initialize result which is number of customers who could
// not get any computer.
int res = 0;
int occupied = 0; // To keep track of occupied computers
// Traverse the input sequence
for (int i=0; seq[i]; i++)
{
// Find index of current character in seen[0...25]
int ind = seq[i] - 'A';
// If First occurrence of 'seq[i]'
if (seen[ind] == 0)
{
// set the current character as seen
seen[ind] = 1;
// If number of occupied computers is less than
// n, then assign a computer to new customer
if (occupied < n)
{
occupied++;
// Set the current character as occupying a computer
seen[ind] = 2;
}
// Else this customer cannot get a computer,
// increment result
else
res++;
}
// If this is second occurrence of 'seq[i]'
else
{
// Decrement occupied only if this customer
// was using a computer
if (seen[ind] == 2)
occupied--;
seen[ind] = 0;
}
}
return res;
}
// Driver program
int main()
{
cout << runCustomerSimulation(2, "ABBAJJKZKZ") << endl;
cout << runCustomerSimulation(3, "GACCBDDBAGEE") << endl;
cout << runCustomerSimulation(3, "GACCBGDDBAEE") << endl;
cout << runCustomerSimulation(1, "ABCBCA") << endl;
cout << runCustomerSimulation(1, "ABCBCADEED") << endl;
return 0;
}
// JAVA program to find number of
//customers who couldn't get a resource.
class GFG
{
static int MAX_CHAR = 26;
// n is number of computers in cafe.
// 'seq' is given sequence of customer entry, exit events
static int runCustomerSimulation(int n, char []seq)
{
// seen[i] = 0, indicates that customer 'i' is not in cafe
// seen[1] = 1, indicates that customer 'i' is in cafe but
// computer is not assigned yet.
// seen[2] = 2, indicates that customer 'i' is in cafe and
// has occupied a computer.
char []seen = new char[MAX_CHAR];
// Initialize result which is number of customers who could
// not get any computer.
int res = 0;
int occupied = 0; // To keep track of occupied computers
// Traverse the input sequence
for (int i=0; i< seq.length; i++)
{
// Find index of current character in seen[0...25]
int ind = seq[i] - 'A';
// If First occurrence of 'seq[i]'
if (seen[ind] == 0)
{
// set the current character as seen
seen[ind] = 1;
// If number of occupied computers is less than
// n, then assign a computer to new customer
if (occupied < n)
{
occupied++;
// Set the current character as occupying a computer
seen[ind] = 2;
}
// Else this customer cannot get a computer,
// increment result
else
res++;
}
// If this is second occurrence of 'seq[i]'
else
{
// Decrement occupied only if this customer
// was using a computer
if (seen[ind] == 2)
occupied--;
seen[ind] = 0;
}
}
return res;
}
// Driver program
public static void main(String[] args)
{
System.out.println(runCustomerSimulation(2, "ABBAJJKZKZ".toCharArray()));
System.out.println(runCustomerSimulation(3, "GACCBDDBAGEE".toCharArray()));
System.out.println(runCustomerSimulation(3, "GACCBGDDBAEE".toCharArray()));
System.out.println(runCustomerSimulation(1, "ABCBCA".toCharArray()));
System.out.println(runCustomerSimulation(1, "ABCBCADEED".toCharArray()));
}
}
// This code is contributed by Princi Singh
# Python program function to find Number of customers who
# could not get a computer
MAX_CHAR = 26
# n is number of computers in cafe.
# 'seq' is given sequence of customer entry, exit events
def runCustomerSimulation(n, seq):
# seen[i] = 0, indicates that customer 'i' is not in cafe
# seen[1] = 1, indicates that customer 'i' is in cafe but
# computer is not assigned yet.
# seen[2] = 2, indicates that customer 'i' is in cafe and
# has occupied a computer.
seen = [0] * MAX_CHAR
# Initialize result which is number of customers who could
# not get any computer.
res = 0
occupied = 0 # To keep track of occupied
# Traverse the input sequence
for i in range(len(seq)):
# Find index of current character in seen[0...25]
ind = ord(seq[i]) - ord('A')
# If first occurrence of 'seq[i]'
if seen[ind] == 0:
# set the current character as seen
seen[ind] = 1
# If number of occupied computers is less than
# n, then assign a computer to new customer
if occupied < n:
occupied+=1
# Set the current character as occupying a computer
seen[ind] = 2
# Else this customer cannot get a computer,
# increment
else:
res+=1
# If this is second occurrence of 'seq[i]'
else:
# Decrement occupied only if this customer
# was using a computer
if seen[ind] == 2:
occupied-=1
seen[ind] = 0
return res
# Driver program
print (runCustomerSimulation(2, "ABBAJJKZKZ"))
print (runCustomerSimulation(3, "GACCBDDBAGEE"))
print (runCustomerSimulation(3, "GACCBGDDBAEE"))
print (runCustomerSimulation(1, "ABCBCA"))
print (runCustomerSimulation(1, "ABCBCADEED"))
# This code is contributed BHAVYA JAIN
// C# program to find number of
// customers who couldn't get a resource.
using System;
class GFG
{
static int MAX_CHAR = 26;
// n is number of computers in cafe.
// 'seq' is given sequence of customer entry,
// exit events
static int runCustomerSimulation(int n, char []seq)
{
// seen[i] = 0, indicates that customer 'i' is not in cafe
// seen[1] = 1, indicates that customer 'i' is in cafe but
// computer is not assigned yet.
// seen[2] = 2, indicates that customer 'i' is in cafe and
// has occupied a computer.
char []seen = new char[MAX_CHAR];
// Initialize result which is number of customers
// who could not get any computer.
int res = 0;
int occupied = 0; // To keep track of occupied computers
// Traverse the input sequence
for (int i = 0; i < seq.Length; i++)
{
// Find index of current character in seen[0...25]
int ind = seq[i] - 'A';
// If First occurrence of 'seq[i]'
if (seen[ind] == 0)
{
// set the current character as seen
seen[ind] = (char)1;
// If number of occupied computers is less than
// n, then assign a computer to new customer
if (occupied < n)
{
occupied++;
// Set the current character as
// occupying a computer
seen[ind] = (char)2;
}
// Else this customer cannot get a computer,
// increment result
else
res++;
}
// If this is second occurrence of 'seq[i]'
else
{
// Decrement occupied only if this customer
// was using a computer
if (seen[ind] == 2)
occupied--;
seen[ind] = (char)0;
}
}
return res;
}
// Driver Code
public static void Main(String[] args)
{
Console.WriteLine(runCustomerSimulation(2,
"ABBAJJKZKZ".ToCharArray()));
Console.WriteLine(runCustomerSimulation(3,
"GACCBDDBAGEE".ToCharArray()));
Console.WriteLine(runCustomerSimulation(3,
"GACCBGDDBAEE".ToCharArray()));
Console.WriteLine(runCustomerSimulation(1,
"ABCBCA".ToCharArray()));
Console.WriteLine(runCustomerSimulation(1,
"ABCBCADEED".ToCharArray()));
}
}
// This code is contributed by Rajput-Ji
<script>
// JavaScript Program for the above approach
let MAX_CHAR = 26;
// n is number of computers in cafe.
// 'seq' is given sequence of customer entry, exit events
function runCustomerSimulation(n, seq) {
// seen[i] = 0, indicates that customer 'i' is not in cafe
// seen[1] = 1, indicates that customer 'i' is in cafe but
// computer is not assigned yet.
// seen[2] = 2, indicates that customer 'i' is in cafe and
// has occupied a computer.
let seen = new Array(MAX_CHAR).fill(0);
// Initialize result which is number of customers who could
// not get any computer.
let res = 0;
let occupied = 0; // To keep track of occupied computers
// Traverse the input sequence
for (let i = 0; i < seq.length; i++) {
// Find index of current character in seen[0...25]
let ind = seq[i].charCodeAt(0) - 'A'.charCodeAt(0);
// If First occurrence of 'seq[i]'
if (seen[ind] == 0) {
// set the current character as seen
seen[ind] = 1;
// If number of occupied computers is less than
// n, then assign a computer to new customer
if (occupied < n) {
occupied++;
// Set the current character as occupying a computer
seen[ind] = 2;
}
// Else this customer cannot get a computer,
// increment result
else
res++;
}
// If this is second occurrence of 'seq[i]'
else {
// Decrement occupied only if this customer
// was using a computer
if (seen[ind] == 2) {
occupied--;
}
seen[ind] = 0;
}
}
return res;
}
// Driver program
document.write(runCustomerSimulation(2, "ABBAJJKZKZ") + "<br>");
document.write(runCustomerSimulation(3, "GACCBDDBAGEE") + "<br>");
document.write(runCustomerSimulation(3, "GACCBGDDBAEE") + "<br>");
document.write(runCustomerSimulation(1, "ABCBCA") + "<br>");
document.write(runCustomerSimulation(1, "ABCBCADEED") + "<br>");
// This code is contributed by Potta Lokesh
</script>
Output
0 1 0 2 3
Time complexity of above solution is O(n) and extra space required is O(CHAR_MAX) where CHAR_MAX is total number of possible characters in given sequence.