Expedia Coding Round Experience – Intern 2021
Last Updated :
24 Jun, 2021
Coding problems for Expedia Inten 2021: There were 2 coding questions and 6 MCQ’s for the coding round of the Expedia 2021 Intern Round.
Question 1: A number of ways to divide objects into groups, such that no group will have fewer objects than previously formed groups?
Example:
objects=8, groups=4 Answer: 5
[1,1,1,5], [1,1,2,4], [1,1,3,3], [1,2,2,3], [2,2,2,2]
Input:
8 4
Output:
5
Solution:
Simple Approach: This problem can be solved by using recursion.
C++
#include <bits/stdc++.h>
using namespace std;
int count( int pos, int prev, int objects, int groups)
{
if (pos == groups) {
if (objects == 0)
return 1;
else
return 0;
}
if (objects == 0)
return 0;
int solution = 0;
for ( int i = prev; i <= objects; i++) {
solution += count(pos + 1, i, objects - i, groups);
}
return solution;
}
int WaysToGo( int objects, int groups)
{
return count(0, 1, objects, groups);
}
int main()
{
int objects, groups;
objects = 8;
groups = 4;
cout << WaysToGo(objects, groups);
return 0;
}
|
Time complexity: O(ObjectGroups)
Dynamic Approach: The above approach will fail as time complexity will exceed, so we will apply Dynamic Programming.
C++
#include <bits/stdc++.h>
using namespace std;
int dp[500][500][500];
int count( int pos, int prev, int objects, int groups)
{
if (pos == groups) {
if (left == 0)
return 1;
else
return 0;
}
if (objects == 0)
return 0;
if (dp[pos][prev][objects] != -1)
return dp[pos][prev][objects];
int solution = 0;
for ( int i = prev; i <= objects; i++) {
solution += count(pos + 1, i, objects - i, groups);
}
return dp[pos][prev][objects] = solution;
}
int WaystoDivide( int objects, int groups)
{
memset (dp, -1, sizeof (dp));
return count(0, 1, objects, groups);
}
int main()
{
int objects, groups;
objects = 8;
groups = 4;
cout << WaystoDivide(objects, groups);
return 0;
}
|
Question 2: Minimum number of distinct elements after removing m items
Given an array of items, and i-th index element denotes the item id’s and given a number m, the task is to remove m elements such that there should be minimum distinct id’s left. Print the number of distinct IDs.
Examples:
Input : arr[] = { 2, 2, 1, 3, 3, 3}
m = 3
Output : 1
Remove 1 and both 2's.So, only 3 will be
left that's why distinct id is 1.
Input : arr[] = { 2, 4, 1, 5, 3, 5, 1, 3}
m = 2
Output : 3
Remove 2 and 4 completely. So, remaining ids
are 1, 3 and 5 i.e. 3
C++
#include <bits/stdc++.h>
using namespace std;
int distIds( int a[], int n, int m)
{
unordered_map< int , int > mi;
vector<pair< int , int > > v;
int count = 0;
for ( int i = 0; i < n; i++)
mi[a[i]]++;
for ( auto it = mi.begin(); it != mi.end(); it++)
v.push_back(make_pair(it->second, it->first));
sort(v.begin(), v.end());
int size = v.size();
for ( int i = 0; i < size; i++) {
if (v[i].first <= m) {
m -= v[i].first;
count++;
}
else
return size - count;
}
return size - count;
}
int main()
{
int arr[] = { 2, 3, 1, 2, 3, 3 };
int n = sizeof (arr) / sizeof (arr[0]);
int m = 3;
cout << distIds(arr, n, m);
return 0;
}
|
Time Complexity: O(n log n)
Share your thoughts in the comments
Please Login to comment...