EPAM Systems follows a structured recruitment process designed to assess both technical and soft skills. While exact steps may vary by role and location, here is the typical EPAM recruitment process:
You apply through the EPAM careers portal or via referral.
Submit your resume/CV and any required documents.
A recruiter contacts you to discuss:
Your background and experience.
Role fit and expectations.
Notice period and salary expectations.
Basic communication skills.
Format: Virtual or in-person.
Focus: Depends on the role but typically includes:
Data Structures and Algorithms.
System Design (for senior roles).
Programming language knowledge (Java, Python, etc.).
Problem-solving and coding challenges.
May involve a live coding round or an assignment.
Conducted by a project or delivery manager.
Assesses:
Real-world problem-solving.
Decision-making.
Collaboration and communication.
Cultural and team fit.
Required for client-facing roles.
May involve technical and domain-related discussions.
Sometimes includes behavioral questions.
Background check by a third-party vendor.
Onboarding process begins upon clearance.
Quicksort | Mergesort |
---|---|
In Quicksort, each element of the array is compared with a pivot element. | Mergesort repeatedly divides the array into two subarrays (n/2) until only one element remains. |
Quicksort is ideal for small arrays. | Merge sort is suitable for any array size, whether small or large. |
The worst time complexity of Quicksort is O(n^2). | The worst time complexity of Mergesort is O(n log n). |
It doesn't take up any more space to perform the quick sort. | To merge two subarrays takes additional space as a temporary array. |
For small data sets, it will be faster than other sorting algorithms. | With this algorithm, all data sets are sorted at the same speed. |
Push()
function, but before we do so, we have to check if the stack is full. The push operation cannot be performed if the stack is full, a condition that is sometimes called stack overflow. But, if there is space, the push()
function inserts the element and increments the top pointer.//Program to implement stack using Array
//x is element to be added and n is size of the stack
void push (int x, int n)
{
if (top == n )
printf("Overflow");
else
{
top = top +1;
stack[top] = x;
}
}
Pop()
function, but before we do so, we have to check if the stack is empty. If the stack is empty, the push()
operation cannot be performed; otherwise, the pop()
function decrements the value at the top of the stack.//Program to implement stack using Array
int pop ()
{
if(top == -1)
{
printf("Underflow");
return 0;
}
else
{
return stack[top - - ];
}
}
class Scaler
{
Scaler() {
// constructor body
}
}
// Binary Search in Java
import java.util.Scanner;
public class Main
{
int binarySearch(int array[], int x, int low, int high)
{
// Repeat until the pointers low and high meet each other
while (low <= high)
{
int mid = low + (high - low) / 2;
if (array[mid] == x)
return mid;
if (array[mid] < x)
low = mid + 1;
else
high = mid - 1;
}
return -1;
}
public static void main(String args[])
{
Main obj = new Main();
int array[] = { 1, 2, 3, 4, 5, 6, 7 };
int n = array.length;
Scanner s= new Scanner(System.in);
System.out.print("Enter a target element: ");
int x=s.nextInt();
int result = obj.binarySearch(array, x, 0, n - 1);
if (result == -1)
System.out.println("Not found");
else
System.out.println("Element found at index " + result);
}
}
Enter a target element: 7
Element found at index 6
public class Main
{
public static void main(String[] args)
{
//Original value of 'x' will remain unchanged
// in case of call-by-value
int x = 5;
System.out.println( "Value of x before call-by-value: " + x);
processData(x);
System.out.println("Value of x after call-by-value: " + x);
}
public static void processData(int x)
{
x=x+10;
}
}
Value of x before call-by-value: 5
Value of x after call-by-value: 5
ArrayList | Vector |
---|---|
By default, ArrayList is not synchronized. This means that ArrayList can be used by multiple threads simultaneously. | It is synchronized. This means that Vector can be used by only one thread at a time. |
ArrayList increases its size by 50% if the number of elements exceeds its maximum capacity. | Vector increases its size by 100% if the number of elements exceeds its maximum capacity. |
Since ArrayLists are unsynchronized, they are faster as compared to vectors. | Since Vectors are unsynchronized, they are slower as compared to ArrayLists. |
The iterator interface can be used to traverse the elements of the ArrayList. | Both the Enumeration interface and Iterator interface can be used to traverse the elements of Vector. |
// Abstract class
abstract class FreeTimeLearning
{
// Abstract method (does not have a body)
abstract void Products();
// regular method
void method();
{
...
}
}
HashMap | HashTable |
---|---|
It is non-synchronized. As a result, two or more threads can access the HashMap data at the same time. | It is synchronized. As a result, only one thread can access the Hashtable data at a time. |
This is not thread-safe, so it cannot be shared among many threads without proper synchronization. | It is thread-safe, so it can be shared among many threads. |
In a hashmap, there can be one null key and any number of null values. | Hashtables do not allow null keys or null values. |
HashMap values are iterated by using an iterator. | A HashTable, however, also includes an Enumerator along with Iterator for traversing/iterating the value stored in it. |
Since HashMaps are unsynchronized, they are faster and use less memory than Hashtables. | Since Hashtables are synchronized, they are slow and use more memory than HashMaps. But, it eliminates the need to write extra code for synchronization. |
try { // code that may throw an exception } catch(Exception e) { // handle exception } finally { // cleanup code that will always be executed }