Tech Mahindra is a leading Indian multinational IT services and consulting company, headquartered in Pune, Maharashtra. Established in 1986 as a joint venture between Mahindra & Mahindra and British Telecom, it has evolved into a global technology powerhouse.
Founded: October 24, 1986
Headquarters: Pune, India
Chairman: Anand Mahindra
CEO & MD: Mohit Joshi (since December 2023)
Employees: Approximately 154,000 (as of March 2025)
Global Presence: Operations in over 90 countries, serving more than 1,100 clients
Parent Company: Mahindra Group
Tech Mahindra offers a wide range of services, including IT consulting, enterprise applications, business process services, engineering services, network services, customer experience & design, AI & analytics, and cloud & infrastructure services.
Revenue (2023): Approximately USD 6.3 billion
Market Capitalization: Around USD 16.1 billion
Stock Listings: Listed on NSE (TECHM) and BSE
Tech Mahindra is recognized as one of India's top five IT firms and is a constituent of major stock indices like BSE SENSEX and NSE NIFTY 50.
With operations spanning over 90 countries, Tech Mahindra has established a significant presence across North America, Europe, Asia-Pacific, and the Middle East. Its client portfolio includes industry giants like AT&T, BMW, and HSBC. The company also partners with leading technology providers such as Microsoft, AWS, and Google Cloud to enhance its service delivery capabilities.
Tech Mahindra has expanded its capabilities and market reach through several strategic acquisitions:
Satyam Computer Services (2009): This acquisition significantly bolstered Tech Mahindra's IT services portfolio and global presence.
Lightbridge Communications Corporation (2014): Enhanced network services capabilities, providing end-to-end services for mobile and fixed-line telecom networks globally.
DigitalOnUs (2021): Strengthened hybrid-cloud offerings and cloud-native development capabilities.
The Tech Mahindra Foundation, established in 2006, focuses on education, employability, and inclusion. It has trained over 156,000 youth, supported 48,000 teachers, and benefited 166,000 children. The foundation aligns its initiatives with the United Nations Sustainable Development Goals (SDGs).
Additionally, the company's 3-4-3 Initiative encourages employees to plant 3 trees, take 4 carpools, and dedicate 3 hours to volunteering, promoting sustainability and community engagement.
Under the leadership of CEO Mohit Joshi, Tech Mahindra aims to increase its focus on the banking, financial services, and insurance (BFSI) sector. The company plans to boost its revenue share in this segment to up to 25% by March 2027 from the current 16%. Joshi emphasizes the importance of aggressively participating in the BFSI sector, where large banks spend substantially on technology.
Tech Mahindra's recruitment process for freshers in 2025 is structured to evaluate candidates across multiple competencies, ensuring a comprehensive assessment of both technical and interpersonal skills. Here's a detailed breakdown:
Education: B.E./B.Tech (any discipline), M.Sc (CS/IT), or MCA.
Academic Performance: Minimum 60% in 10th, 12th, and graduation.
Backlogs: No active backlogs at the time of application.
Gap Years: Maximum of one year allowed between academic milestones.
Graduation Year: 2023 or 2024.
The selection process typically comprises the following stages:
Online Assessment Test:
Aptitude Section: Evaluates quantitative, logical, and verbal reasoning skills.
English Essay Writing: Assesses written communication and coherence.
Technical Test: Covers programming concepts, data structures, and algorithms.
Psychometric Test (Optional):
A non-elimination round with approximately 80 questions to be completed in 20–30 minutes, focusing on work behavior and personality traits.
Technical Written Test:
Involves code optimization tasks and questions on data structures, algorithms, SQL, and puzzles.
Technical Interview:
Assesses understanding of computer science fundamentals, including operating systems, networking, object-oriented programming, and preferred programming languages like Java or Python.
HR Interview:
Evaluates communication skills, cultural fit, and situational responses.
Offer and Onboarding:
Successful candidates receive offer letters and onboarding details via email.
Associate Software Engineer: CTC of ₹3.25 LPA.
Supercoder Role: Candidates excelling in the Supercoder challenge may receive a CTC of ₹5.5 LPA.
Visit the Tech Mahindra Careers Portal.
Explore job listings and select roles aligning with your skills.
Apply online by submitting your updated resume and necessary details.
Monitor your application status through the portal.
|
Call by Reference |
Call by Value |
|
The addresses of the real variables of the calling function are transferred into the fake variables of the caller function. |
The value of every variable in the calling function is moved into the corresponding dummy variables of the called function. |
|
Because the addresses of the real variables of the calling function are supplied to the called function, any modifications done to the variables in the call function are mirrored in the calling function's variables. |
Modifications to the called function's dummy variables have no effect on the actual variables' values in the calling function when using Call by Value. |
|
We may modify the real values of variables by using function calls. |
We cannot modify the values of real variables using function calls. |
An inline function is a function where the function call is replaced with the function code itself during compile time.
Instead of performing a regular function call (which involves overhead like pushing arguments onto the stack), the compiler inserts the actual code at the place where the function is called.
Purpose: To reduce the overhead of function calls, making execution faster, especially for small, frequently called functions.
In C++, you explicitly use the inline keyword when defining a function:
#include <iostream>
using namespace std;
// Inline function
inline int add(int a, int b) {
return a + b;
}
int main() {
cout << "Sum = " << add(5, 10) << endl;
return 0;
}
* Explanation:
When you call add(5, 10), the compiler replaces it directly with 5 + 10 during compilation.
In C, inline functions were introduced in C99 standard.
Before C99, C didn't officially support inline, but now you can use it like this:
#include <stdio.h>
// Inline function
inline int multiply(int a, int b) {
return a * b;
}
int main() {
int result = multiply(4, 5);
printf("Product = %d\n", result);
return 0;
}
* Explanation:
Here, multiply(4, 5) will be replaced at compile time with the multiplication logic 4 * 5, avoiding a real function call.
| Feature | C++ | C |
|---|---|---|
| Introduced | Always available | Introduced in C99 |
| Syntax | inline keyword |
inline keyword |
| Function Definition | Typically in header files | Sometimes needs static inline for cross-file usage |
| Objective | Reduce function call overhead | Same |
Inline is just a request to the compiler; the compiler may ignore it if it thinks it's not efficient to inline.
Large functions are usually not inlined because it would increase the size of the binary (code bloat).
The world of object lifecycle in C++! Destructors are special member functions in C++ classes that play a crucial role in cleaning up resources when an object is no longer needed. Think of constructors as the "birth" of an object, and destructors as its "farewell."
Here's a breakdown of what makes destructors important:
Purpose of C++ Destructors:
new).delete operator.Key Characteristics of Destructors:
~). For a class named MyClass, the destructor would be named ~MyClass().void.virtual. This ensures that the correct destructor (the derived class's destructor) is called, preventing potential resource leaks and undefined behavior.C++ Syntax for a Destructor:
class MyClass {
public:
// Constructor (optional)
MyClass() {
// Initialization code
}
// ... other member variables and functions ...
// Destructor
~MyClass() {
// Cleanup code goes here
// For example:
// delete somePointer;
// close(fileDescriptor);
// ...
}
};
Example Illustrating Destructor Usage:
#include <iostream>
class MyResource {
private:
int* data;
public:
MyResource() {
std::cout << "Constructor called for MyResource." << std::endl;
data = new int[10]; // Allocate some dynamic memory
}
~MyResource() {
std::cout << "Destructor called for MyResource." << std::endl;
delete[] data; // Release the dynamically allocated memory
data = nullptr;
}
void setValue(int index, int value) {
if (index >= 0 && index < 10) {
data[index] = value;
}
}
int getValue(int index) const {
if (index >= 0 && index < 10) {
return data[index];
}
return -1; // Indicate an error
}
};
int main() {
{
std::cout << "Entering inner scope." << std::endl;
MyResource obj1; // Constructor is called when obj1 is created
obj1.setValue(0, 100);
std::cout << "Value in obj1: " << obj1.getValue(0) << std::endl;
} // Destructor for obj1 is automatically called when it goes out of scope
std::cout << "Exiting inner scope." << std::endl;
MyResource* obj2 = new MyResource(); // Constructor is called
obj2->setValue(1, 200);
std::cout << "Value in obj2: " << obj2->getValue(1) << std::endl;
delete obj2; // Destructor for obj2 is explicitly called using delete
obj2 = nullptr;
return 0;
}
Output of the Example:
Entering inner scope.
Constructor called for MyResource.
Value in obj1: 100
Destructor called for MyResource.
Exiting inner scope.
Constructor called for MyResource.
Value in obj2: 200
Destructor called for MyResource.
As you can see from the output, the destructors are automatically invoked when the MyResource objects go out of scope or are explicitly deleted using delete. This ensures that the dynamically allocated memory is properly released, preventing memory leaks.
void memoryLeak() {
int* ptr = new int(10); // Allocating memory
// No delete statement, leading to a memory leak
}
#include<bits/stdc++.h>
using namespace std;
int evenOddDiff(int n, vector<int> &a)
{
int oddSum = 0,evenSum = 0;
for(int i: a)
{
if(i & 1)
oddSum += i;
else
evenSum += i;
}
return evenSum - oddSum;
}
int main()
{
int n;
cin>>n;
vector<int> a(n);
for(int j = 0; j < n; j ++)cin >> a[j];
cout << evenOddDiff(n, a) << endl;
return 0;
}
| SWAPPING | PAGING |
|---|---|
| When the entire process is shifted to secondary memory, it is referred to as swapping. | Paging takes place in the event of some part of a process being transferred to secondary memory. |
| Swapping involves the temporary transfer of a process from the main memory to secondary memory. | In Paging, the contiguous block of memory is made non-contiguous but of fixed size called frame or pages. |
| No memory management is required for swapping. | Paging requires non-contiguous Memory Management. |
| Swapping provides the direction regarding the solution in it. | Paging does not give any direction regarding the solution in it. |
ServletRequest request, ServletResponse response) throws ServletException, java.io.IOException: The forward() method is used to redirect a client's request to a different resource (HTML file, servlet, jsp etc). The control is passed to the next resource called when this method is invoked. The include() method, on the other hand, inserts the content of the calling file into the called file. The control remains with the calling resource after calling this method, but the processed output is included in the called resource. ServletRequest request, ServletResponse response) throws ServletException, java.io.IOException: The include() method is used to pass the contents of the caller resource to the called resource. Control remains with the caller resource when this method is called. It merely incorporates the calling resource's processed output into the called one. javax.servlet.RequestDispatcherjavax.servlet.http.HttpServletResponse#include <bits/stdc++.h>
using namespace std;
void foo(int n) {
cout << " Integer Value: " << n << endl;
}
void foo(double n) {
cout << " Decimal Value " << n << endl;
}
void foo(char n) {
cout << " Character Value" << nc << endl;
}
int main() {
foo(40);
foo(452.144);
foo("A");
return 0;
} protected void finalize throws Throwable{}
public class FinalizeMethodExample {
public static void main(String[] args)
{
FinalizeMethodExample o = new FinalizeMethodExample ();
System.out.println(o.hashCode());
o = null;
// a call to the garbage collector of Java
System.gc();
System.out.println("The end of garbage collection!");
}
@Override
protected void finalize()
{
System.out.println("The finalize method is being called now!");
}
}
3202429534
The end of garbage collection!
The finalize method is being called now! #include<bits/stdc++.h>
using namespace std;
int evenOddDiff(int n, vector<int> &a)
{
int oddSum = 0,evenSum = 0;
for(int i: a)
{
if(i & 1)
oddSum += i;
else
evenSum += i;
}
return evenSum - oddSum;
}
int main()
{
int n;
cin>>n;
vector<int> a(n);
for(int j = 0; j < n; j ++)cin >> a[j];
cout << evenOddDiff(n, a) << endl;
return 0;
}