0 ratings0% found this document useful (0 votes) 761 views57 pagesCracking The C C++ and Java Interview PDF
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content,
claim it here.
Available Formats
Download as PDF or read online on Scribd
CRACKING
i)
| oF Cr+, and Java
a NsIN yl
NZ}
Tata McGraw Hill
Published by Tata McGraw Hill Education Private Limited,
7 West Patel Nagar, New Delhi 110 008.
Copyright © 2009, by Tata McGraw Hill Education Private Limited
First reprint 2009
RALCRDRFRLBYX
No part of this publication may be reproduced or distributed in any form or by any means,
electronic, mechanical, photocopying, recording, or otherwise or stored in a database or
retrieval system without the prior written permission of the publishers. The program
listings (if any) may be entered, stored and executed in a computer system, but they may
not be reproduced for publication,
This edition can be exported from India only by the publishers,
Tata McGraw Hill Education Private Limited
ISBN (13): 978-0-07-007792-8
ISBN (10): 0-07-007792-4
Managing Director: Ajay Shukla
Head—Professional and Healthcare: Roystan La ‘Porte
Executive Publisher—Professional: R Chandra Sekhar
Asst. Sponsoring Editor—Computing: Ritesh Ranjan
Manager—Production: Sohan Gaur
Manager—Sales & Marketing: S Girish
Sr. Product Manager—Science, Technology & Computing: Rekha Dhyani
General Manager—Production: Rajender P Ghansela
Asst. General Manager—Production: B L Dogra
Information contained in this work has been obtained by Tata McGraw Hill, from
sources believed to be reliable. However, neither Tata McGraw Hill nor its authors
guarantee the accuracy or completeness of any information published herein, and
neither Tata McGraw Hill nor its authors shall be responsible for any errors, omissions,
or damages arising out of use of this information. This work is published with the
understanding that Tata McGraw Hill and its authors are supplying information but are
not attempting to render engineering or other professional services. If such services are
required, the assistance of an appropriate professional should be sought.
Typeset at The Composers, 260, C.A. Apt., Paschim Vihar, New Delhi 110 063 and
printed at Rashtriya Printers, M-135, Panchsheel Garden, Naveen Shahdara,
Delhi-110 032.
Cover Design: Kapil Gupta
Cover Printer: Rashtriya Printersvil Preface
For entry-level jobs, the IT industry requires students and young profes-
sionals with good programming and problem solving skills. For jobs that
fequire programming skills, most of the IT companies (both products and
services companies) look for candidates with good C, C++, Java skills (also
C# skills, but to a lesser extent) in addition to skills in writing and using
various data-structures and algorithms. There is no doubt that technical knowl-
edge and skills in various specific domains are very important (such as Oracle,
Linux, distributed computing, network programming, etc.); the key point is that
programming skills are essential for getting almost any software related job in
IT companies (particularly product-based companies such as IBM and HP).
A lot of programming books are already available in the market, but most
of the books are tutorials or textbooks on programming languages, It is diffi-
cult to crack an IT interview by just reading any of these books or by writing a
few programs. IT interviews focus on problem solving skills from a program-
ming perspective and hence, the questions asked are considerably different
from those covered in tutorials or textbooks. For example, textbooks usually
cover pedagogical questions and solutions that are meant for teaching how to
write programs.
Most of the programming textbooks (C/C++/Java) explain how to create a
singly linked list or how to write a program for adding or deleting nodes in a
binary tree. However, in IT interviews, different kinds of questions are asked
from the same topics. For example, “given a singly-linked list, find out the
midpoint of a single-linked list in a single parse of the list” or “given a binary
tree, how will you verify it is a binary search tree or not”. It is difficult to
answer such questions by reading or trying out programs given in textbooks or
tutorials or by having only theoretical knowledge about technical topics. This
book precisely covers such questions.
Target Audience
The book is designed specifically for students and programmers attending
campus placements/interviews for software companies with the objective of
helping them clear written tests and interviews.
The campus placements in IT companies in India typically consist of writ-
ten tests and interviews. In written tests, the objective is to assess program-
ming aptitude and technical ability of the candidates. Programming aptitude
tests usually have multiple choice questions on C programming and sometimes
on Java and C++. They are designed to check if a student knows the funda-
mental programming concepts and has basic programming and problem solv-
ing skills. Aptitude tests cover both theoretical and practical components to
test the breadth of a student’s knowledge. Interviews complement written tests
and typically have questions on problem solving skills and programming puzzles
to gauge the depth of understanding. As a student, by reading this book you
can easily crack both the written tests and interviews in campus placements.
The job interviews for young programmers (with 1 to 4 years experience)
are quite different from the written tests/interviews conducted for students.Preface ix
Except a very few ones, good IT companies do not conduct written tests for
programmers with prior work experience. The interviews are designed to as-
sess a candidate’s practical experience in programming and his/her ability to
solve the problems faced in day-to-day programming. The programming logic
questions and puzzles are also much more complex than those that students are
asked, Hence, a programmer can benefit from this book while preparing for
such job interviews.
Organization
The book is organized in a question-answer (some chapters in question-an-
swer-explanation) format. Questions covered in this book are of varying levels
of difficulty since the questions posed to experienced programmers are
expected to be more difficult than the ones posed to students. For instance,
each question is marked with a level number ranging from 1 to 5 (implying
increasing level of difficulty). Level 1 to 3 questions are simpler ones meant
for students and novice programmers; level 3 to 5 questions are meant for
programmers with more than a year’s experience.
The book starts with FAQs followed by five sections; and three appendices
with additional material.
The introductory chapter is organized as FAQs (Frequently Asked Ques-
tions) on cracking an IT interview. It has two parts. First part covers general
questions about written tests and interviews and clarifies the doubts that the
readers might have. The second part has a list of common questions asked in
HR interviews and has suggestions and hints on how to answer them.
The core of the book begins with a section on general programming topics.
It has three chapters: general problem solving questions, data structures and
algorithms and object oriented programming. Most of the interviews focus on
these three topics: so this section is important to all the readers.
The next three sections cover C, C++, and Java respectively. Depending on
the job interview you are attending, you can choose a section (on the specific
language) to read. These three sections have a uniform chapter content. Each
consists of three chapters: multiple choice, programming aptitude and theoreti-
cal questions. Multiple choice questions are meant to help you clear the writ-
ten tests. Programming aptitude and theoretical questions help you to prepare
for interviews (to some extent, they are useful for written tests also). Multiple
choice questions have four options; each question has a unique answer. The
chapter on programming aptitude questions has self-contained, compilable pro-
grams: after reading the program, you necd to determine the output (or behav-
ior) of the program. Answer and explanation are provided directly after the
question; but it is recommended that you read the program and try answering
ead of just reading the answer and explanation. Theoretical questions focus
on important topics in a given language: you can increase or refresh your
knowledge by reading the questions and answers in this chapter which will be
very helpful in attending interviews.
The last section has two sample question pape:
herself by attempting these timed written test
A student can evaluate
The first question paperContents
Preface vii
Acknowledgements xi
1.__Cracking the IT Interview—FAQ 1
Section I: General Programming it
2._C Problem-Solving Questions 13
3.__Data Structures and Algorithms Questions 28
4. Object-oriented Programming Questions 38
Section II: C Programming 47
5.__C Multiple Choice Questions 49
6._C Programming—Aptitude Questions 62
7,__C Programming —Theory Questions 7
Section II]: C++ Programming 91
8 C++ Multiple Choice Questions 93
9, C++ Programming—Aptitude Questions 109
10. C++ Programming—Theory Questions 124
Section IV: Java Programming 141
11. Java Multiple Choice Questions 143
12, Java Programming—Aptitude Questions 161
13_Java Programming—Theory Questions 183
Section V: Sample Question Papers 197
14 Sample Written Test Question Paper I 199
“15. Sample Written Test Question Paper II 208xiv Contents
16, Sample Interview Questions
Appendix I: Suggested Reading
Appendix II: Web Resources
Appendix III: Entry Level Certification Courses
Index
223
229
232
2341
Cracking the IT Interview—FAQ
This introductory chapter is in the form of Frequently Asked Questions
(FAQ). It answers many of the basic questions and doubts most students
and young programmers have. This FAQ also clears a few misconcep-
tions about attending interviews.
Pant I: General Questions
1. What skills do IT companies look for in prospective candidates?
Answer: IT companies look out for various technical skills and soft
skills in candidates. In soft skills, communication skills are very im-
portant. Other soft skills include presentation skills, team work, writ-
ing skills, etc. In technical skills, companies expect the candidates to
have good expertise in their area of graduation. For computer sci-
ence students, evergreen technical skills are C, Unix, operating sys-
tems, and networking. Candidates having these skills are likely to
have better chances of getting a job.
2. When should | start preparing for placements?
Answer: For soft skills, it is better to start preparing one year before
the placements start. For technical skills, it is beneficial to focus from
the first year itself. Otherwise, you can start revising important sub-
jects—from the placements point of view—from one year before place-
ments.
3. What is the difference between a CV and a résumé?
Answer: A CV (Curriculum Vitae) is a document prepared by a stu-
dent or a fresher searching a job. It provides the academic details of.
the student. A résumé is prepared by a person having work
experience, which emphasizes job history and on-the-job skills and
experience.2 Cracking the C, C++, and Java Interview
4, What should or should not be there in my CV?
Answer: A good CV will have the following sections: objective, per-
sonal strengths, academic background, academic achievements (if any),
extracurricular activities, project details, areas of interest, and per-
sonal and contact delails. It should have neat and simple formatting.
Ideally, it should be of 2-3 pages.
Some characteristics of a bad CV can be as follows: overly com-
plex formatting or styles; typos, grammatical mistakes; either too short
(1 page), or too long (> 3 pages); too many personal details
(e.g., parent’s occupation, 3rd consolation prize in Rangoli competi-
tion); list of weaknesses, etc.
5. How detailed should the C\' or résumé be?
Answer:The CV or résumé should ideally have adequate details about
one’s job history or academic details, project details, and
achievements.
The job history should be from current work experience to the
details of the first job (.e., in reverse chronological order) giving the
name of the company, role/position and number of years (preferably
with joining and leaving dates). The academic details should cover
the college/university, course, year of passing, percentages/CGPA,
etc. Project details should include the title, where it was done, softwares
used, and a short description of the project. Other sections can be
very brief and to-the-point.
6. How should | prepare for written tests?
Answer: To prepare for written tests, following should be taken care
of:
« Know the general format of the question papers from IT compa-
nies. Typically, most of the IT companies cover some or all of the
following topics:
1. programming aptitude (C, data structures, algorithms, etc.)
. quantitative aptitude
- analytical ability
. reasoning (logical, critical, etc.)
wae we
. verbal skills (synonyms, grammar, composition, etc.)
6. puzzles
« Try solving previous years’ sample question papers
Attempting to solve previous years’ sample question papers is
very important. This helps you know where you stand, getCracking the IT Interview—FAQ 3
experience in answering questions quickly in the actual written
test, and, in general, become confident of clearing the written
test. For sample question papers, please see Chapters 14 and 15.
* Read relevant books
= GRE (Barron’s guide)
= RS. Aggarwal’s aptitude books (quantitative aptitude, rea-
soning, etc.)
« Shakuntala Devi’s puzzle books (Puzzles to Puzzle You, More
Puzzles to Puzzle You, etc.)
« Technical books (Let us C, etc.)
A few important and relevant job search sites, technical sites, and list
of books are provided in Appendix I and II in this book.
How should | prepare for attending an interview?
Answer: At the first place, know the basic details about the company—
its main business, size, etc. If possible, visit the company’s website
and get to know the general details about the company. This helps to
show that you are interested in the company when related questions
are asked in the interview.
‘An experienced person looking for a job change needs to know
about the current position he is applying for (the job profile), what is
expected from a person in that position, and how he can fit into that
position.
An important aspect in cracking the interview is your attitude (i.e.,
how you present yourself). Show keen interest, be attentive and listen
to the interviewer. Other aspects to look out for are eye contact, body
language, appearance, way of speaking, showing respect, etc. Also,
be in time for the interview (e.g., start early if traffic jams are
common in your city).
Knowing the latest advances in technology and other happenings
in your technical domain would be an added advantage.
How many interviews do | have to clear to get a job?
Answer: It is usually a minimum of two interviews: a technical inter-
view and an HR interview. In some cases (e.g,, if the company you’ve
applied to is in another city or country), a telephonic interview is
done to screen the candidates before calling them for face-to-face
interviews. In major Indian IT companies and MNCs that are prod-
uct-based, there will be multiple technical interviews. Unless theCracking the C, C++, and Java Interview
hiring company is satisfied with your technical skills (and communi-
cation skills) and you clear the HR interview, you cannot get the job.
Your social status makes no impact in the interviews.
Why do companies have an HR interview in addition to the technical
interview(s)?
Answer: The HR interview has two objectives—(1) to check if you're
fit for the organization; and (2) to check if your requirements match
that of the organization. If you have good communication skills, a
friendly personality, a positive attitude, and keen interest in learning
and contributing, and in addition, if you're au effective team player
and it is likely that you'll stay for at least a few years, it’s most likely
that you will be beneficial to the organization. An HR interview is
intended to check all these aspects. In other words, HR interview checks
your soft skills, attitude, and if you're the “right fit” for the company.
). Why is an HR interview important?
12.
Answer: Simple—only if you clear this interview, you'll get a job! Also,
if you get the job, the HR department (of course, after consulting
with the manager of the team for which you're recruited) decides the
pay you'll get, your roles, and responsibilities, etc.
1am a class topper. Should | attend only selective companies in our
campus interviews because | am sure to get a job?
Answer: You're overconfident and this can spoil your chances of get-
ting a job. Being a class topper obviously gives you a better chance of
getting a job. But remember, the skills required for getting a job are
different from getting high marks. It is better to get a job first and
then start being selective about your ‘dream company’, which you
may want to join as a second job. Also, if you're selective, you lose
opportunities to attempt written tests and interviews and hence when
your ‘dream company’ comes for placement, you'll be ill-prepared
for it.
I got a job, but | do not get a call to join the company. Should | keep on
waiting indefinitely?
Answer: Don’t worry. If the job environment is bad, it is natural that
your joining date can be very late {in some cases, delay can be more
than a year!). Keep in touch with the HR of the concerned company
and get to know the status from other candidates who have got placed
in that company. Explore other alternatives: search for another job
(who knows you might be destined for a better job!); join some job-
oriented courses; do certifications in the areas of your interest ....Cracking the IT Interview—FAQ 5
13. That brings me to another question. Do certifications help in getting a
job?
Answer: Yes. Today certifications are an effective way to demonstrate
your expertise in a particular technical domain. Getting relevant, valu-
able certifications such as CCNA, MCSD, SCJP etc. can significantly
improve your chances of getting a well-paid job. A list of entry level
certification courses is provided in Appendix III.
14, [have been searching for a job for more than a year and | still have not
got a job. What are the options that | have?
Answer: Don’t lose hope. There are examples of candidates who have
good jobs, successful careers, who couldn't get any job initially.
Continue to search for jobs, but also explore other options in this
situation:
1. Go in for higher studies and improve your academic qualifica-
tions.
2. If you have a Bachelor's degree, consider enrolling for Master’s
degrees such as MBA, M.Tech, or other courses, depending on
your interest.
3. Consider joining advanced courses, such as a postgraduate
diploma program from C-DAC.
4. Do some certification courses (CCNA, etc.) in your areas of
interest, which can improve your chances of getting a good job.
5. Join some evergreen job-oriented courses such as software test-
ing and technical writing.
6. Depending on your interest, take some specialized courses such
as advanced animation, or CAD-CAM, from established insti-
tutes like Aptech, NIIT, etc.
7. Learn any new computer skills: new programming languages C,
C++, Java, operating systems (Unix, Linux), applications (Tally,
etc.). Such job skills significantly increase your chances of getting
ajob.
8. Network with your college seniors, relatives, or friends who are
already working and ask them to forward your resume to their
HR departments.
9. Send your CV to companies both directly and through consult-
ants.
10, Improve soft skills: communication skills, presentation skills, learn-
ing foreign languages (Japanese, French, German, etc.).Cracking the C, C++, and Java Interview
15,
11. Do software projects; it adds value to your CV. Try doing a project
from a reputed organization (MNCs, PSUs, Govt. Organizations,
etc.). Don’t pay for doing projects. Rather, try working asa trainee
without getting paid or with a minimum stipend (to gain experi-
ence).
Is it necessary to change jobs frequently to get better pay and position?
Answer: No, it is not a good idea to change jobs frequently. Try to stick
to a company and work there for at least 3 to 5 years.
There are good reasons why one would change a job for profes-
sional reasons (better pay, career advancement, new work environ-
ment, new area of work, overseas work assignments, etc.), or per-
sonal reasons (getting married, want to live with parents, etc.). It is
perfectly acceptable to change a job for such reasons. However, don’t
change your job frequently. There are many reasons why we should
avoid ‘job hopping.’
Potential employers look at the job history of candidates before
selecting them. If a person has changed jobs often (say, 5 jobs in 5
years!), it is very likely that the person will do so in future as well, so
employers prefer not recruiting such candidates. Typically, it requires
around 6 months to become productive in a new organization and
start contributing. If you leave the job within a short period—say
within a year—it is a loss to the comr:ny because of many reasons:
the company has ramped you in your new job and that effort is lost,
the company has to spend again to recruit a new person for your
position, the work gets pending till the time the new person on board
becomes productive, etc. So it becomes difficult to get a new job if
you are a ‘job hopper.’
It is better to take a long-term view about your career. It takes at
least 5 years to learn enough about the job, the company, the technol-
ogy, become highly productive, and make significant contributions
to the company. The pay and position we get in the company
depends on the level of contribution we make to the company. If you
find ‘your kind of job and company’ and stick to it, and focus on
contributing to the company, you'll naturally grow and earn better
than if you keep shifting jobs. ‘Focus on learning than earning’—
that’s what all the successful people have done!Cracking the IT Interview FAQ 7
Part Il: Some FAQs To CaNnpIDATES AND How To ANSWER THEM
16. Tell me about yourself.
Answer: This is an open-ended question that interviewers ask at the
beginning of the interview to know more about you. They also use
this question to get an idea of how you look at yourself and your
achievements.
Briefly explain your professional background, the projects you've
done, significant contributions you’ve made in your previous jobs,
and conclude with a note about your personal background and a few
points on your positive personal characteristics. Don’t talk for an
hour—make it short and to-the-point. Also, don’t overemphasize your
personal details.
17. What are your strengths and weaknesses?
Answer: This is a question asked to check how you look at yourself
and also how your strengths can contribute to the team.
Be honest and tell what you consider as your strengths (‘I learn
new skills fast,’ "I am an effective team player, ‘ ‘I have good leader-
ship skills’, etc.). Provide supporting details for your strengths (‘I learn
new skills fast. In my previous job, I had to learn scripting, I started to
do shell programming from the next day itself, and I did it?). For
weaknesses, don’t elaborate too much; some weaknesses can cost you
your job (‘I can’t resist stealing if I see costly mobiles!’).
18. What do you know about our company?
Answer: This question is to check if you would be interested in work-
ing in that company (if you're a kernel hacker, it is unlikely that you'll
be interested in web programming, assuming that the company de-
velops web-based software). It is also to check if you’re keenly inter-
ested in joining the company—f you're going higher studies and at-
tending interviews ‘just-like-that,’ then you would not have shown
much interest in knowing more about that company, right!
To answer this question you should prepare before attending the
interview. Visit the company’s website to know about the company.
If you know anyone working in the company, contact them and get
an idea of what the company works on, which countries (or states) it
has presence in, the kind of projects or products they are working on,
etc. An overview of the company is more than enough.8 Cracking the C, C++, and Java Interview
19. What do you think of your previous boss?
Answer: This question is to check how well you can work with, or
relate to your new boss if you get the job.
Speak about a few good things you found while working with your
previous boss. However, you can’t be too open in answering this
question!
20. Why are you planning to leave your current job?
Answer: Be careful in answering this question. Usually acceptable an-
swers are: ‘looking for better pay’; ‘looking for better role and growth
opportunities’; ‘got married and had to shift to this city. ‘Bad answers:
‘I didn’t like my old boss!’ (you’re too frank to get this job!); ‘the
project is nearing the deadline and I don’t want to work in that hectic
schedule’ (you can’t desert your project when it is in critical situa-
tion!); ‘I Aad to work!’ (come on, you're paid for doing your work!).
21. Tell us about some challenges you faced in your previous job and how
you overcame them.
Answer: This question is asked to check how confident you are in
handling your day-to-day work and also your confidence in sticky
situations.
‘You can briefly explain some of the challenges that you faced in
your earlier jobs, how you dealt with them, how your team or manag-
ers helped you, and how you successfully overcame the problems
finally. Avoid talking about bad experiences. Also avoid blaming any-
one or the team for any problem. It is better to talk about technical
challenges and problems.
22. Are you a team player?
Answer: Sometimes the interviewer asks you this question directly.
This question is also asked indirectly, as in: “do you prefer working in
teams or working alone?’ or ‘how comfortable are you in working as
a member in a large team” This question is to check how good and
comfortable you are in working as a team player (particularly in a
few types of jobs where team work is very important).
Obviously we need to say yes, but support your answer with more
details or by giving a few instances in the past where you worked
very well as a team player. If you are a fresher, you can talk about
your participation or organizing team sport events, get-togethers, etc.
Focus more about team strength than about individual abilities.
This question could also lead to questions like how you handled con-
flicts within the team. So be prepared!Cracking the IT Interview—FAQ. 9
23. How much salary hike are you looking for?
Answer: Obviously this is one of the most difficult questions to answer!
If you’re honest and say ‘double the current salary,’ ‘ you won’t get
the job. If you say, ‘I am fine getting even the old salary, ‘ you might
actually end up getting it! A safe answer is ‘same as the industry aver-
age hike one gets while moving to a new job’ (whatever that ‘industry
average” means!). If you’ve done enough analysis about the salary
structure in the new company and know that you'll get more for same
level of experience and skill set, you can say: ‘same as the salary that
a person with similar experience and skills will get in your company,’
and throw the ball back in the interviewer's court.
24, Why should we hire you?
Answer: This is a question that every interviewer has, while interview-
ing a candidate. They want a justification on why they should select
you. The interviewer just bounces this ball to you and checks how
you give the reason for hiring you!
Tell them about your professional and personal strengths, relevant
job experience, or academic background, your suitability for the cur-
rent job requirements, etc., and give your view on why they should
hire you. Bad answers: ‘Because I am desperate for a job;’ ‘I have
searched for jobs for more than a year and I didn’t get any—you
should help me!’
25. Do you have any questions for us?
Answer: Typically, an interviewer will ask this question just before the
end of the interview. This is to check if you have any important ques-
tions that you want to get clarified. Instead of saying ‘I have no ques-
tions,’ it is better to ask relevant questions to show your keen interest
in getting the job.
Do show enthusiasm about the new job and ask about the new
team, opportunities, company, etc. Good examples: ‘What are the
current problems that the team is facing now and how can I possibly
help?’, ‘What are the career growth opportunities available in the
company’. Bad examples: ‘Did I do the interview well?’, ‘Will I get
this job? (Both are in the list of Frequently Asked Wrong Questions—
never ask these questions in the interview! But yes, you can ask ‘When
can I expect to hear from you?”.)SEcTION I
General Programming2
C Problem-Solving Questions
One of the important aspects in technical interviews is testing the prob-
lem-solving aptitude of the candidate.
There are multiple ways in which problems can be asked for assessing
candidates’ problem-solving skills such as bit manipulation programming
questions in C, finding what went wrong in data-structure manipulation
programs, solving a particular programming problem, etc. We will cover
these in this chapter, along with a few tricky questions asked in interviews.
The code segments or functions given in this chapter outline the solu-
tion and are not fully compilable or runnable programs.
1. Write a simple implementation of C strlen function. (Level 1)
Answer: Copy the address of a passed string to a temporary variable
and traverse the string till the end-of-string (a null character) is reached.
Then return one less than the difference between the temporary vari-
able and the address of the string passed. This will return the length
of the string.
int my_strlen(char *str) {
char *temp = str;
while (*temp++)
return (temp - str - 1);
)
2. How would you find if the given string is a palindrome or not? (A
palindrome string reads the same if we read it backwards. For example,
“malayalam” and “madam”). (Level 1)
Answer: We can use two pointers, one pointing to the beginning of the
string and the other to the end. A loop is a setup that compares the
characters pointed by these two pointers—if the characters don’t
match, it’s not a palindrome. Else, move the pointers one character
each toward the other. The loop continues till the pointers cross each14
Cracking the C, C++, and Java Interview
other in the middle of the string. At that point we can conclude that
the given string is a palindrome.
The code for this is as follows:
int is_palindrome(char * str) {
char *pl = str, *p2 = str + strlen(str) - 1;
while (pl < p2) {
if (*pl++ != *p2——)
return 0; // false; chars not equal, so not a
palindrome
return 1; // yes, it’s a palindrome
Which data structure can always be used for rewriting a recursive program
to a non-recursive one? Why? (Level 1)
Answer: The required data structure is stack. Recursion internally uses
stack, so stack can always be used for implementing a non-recursive
equivalent for a recursive program.
How can we print the contents of a singly linked list in a reverse order?
(Level 1)
Answer: We can write a recursive function that traverses to the end of
the list. While returning from the function, the contents of the node
can be printed, which will be in reverse order now.
Write simple functions/macros to set and clear (unset) a specific bit in a
given variable. (Level 1)
Answer: The bit-wise or operation can set a bit and bit-wise ana can
reset a bit.
#define BIT(x) (0x1 << x)
int set(int val, int pos) {
return (val |= BIT(pos));
}
int unset(int val, int pos) {
xeturn (val & ~BIT(pos));
}
Rewrite the statement “int k = i * 8 +j / 4;” using bit-wise operators
(where i and j are integers). (Level 2)
Answer: Multiplication and division by a number that is a power of 2
can be replaced by equivalent << and >> operators. So the expres-
sion can be rewritten as:
int k = (i << 3) + (j >> 203C Problem-Solving Questions 15
7. What does the expression (j + (i - j) & -{i < j))) do where i and j are
integers? (Level 2)
Answer: This code results in the minimum of two integers, i and j.
Note that, with slight modification, the expression (j- ((i-j) & -(i next) {
free (ptr) ;
}16
Cracking the C, C++, and Java Interview
11
12.
13.
In the expression ptr = ptr-snext, ptr is accessed after doing
free (ptr). So the behavior of this code segment is undefined. The
solution is to introduce a temporary variable to hold the address to
be pointed next and then free the ptr:
for( ptr = head ; ptr != NULL ; ptr = temp) {
temp = ptr->next;
free (ptr) ;
The following loop is intended to copy the data ina linked list to an array.
What went wrong with this code? (Level 2)
Answer: int i = 0;
for (ptr = head; ptr != NULL; ptr = ptr->next)
arr[++i] = p->data;
The operation ++i leaves the first element arr (0) uninitialized. More-
over, since the first element is not assigned, and if the size of the array
is the same as the number of elements in the linked list, the loop will
attempt to write past the end of the array, which is wrong.
What is wrong with the following code segment? (Level 2)
Answer: // code for inorder traversal of a binary tree
void inorder_traverse (Node* root) {
if (root == 0)
printf ("empty tree") ;
else {
inorder_traverse (root->left) ;
print£("td\n, “ root->data);
inorder_traverse (root->right) ;
}
}
The termination condition of recursion is wrong. If root is zero, the
control has to return, but it instead just prints “empty tree.” This will
result in printing “empty tree” (N + 1) times because for a binary tree
with N nodes, there are N + 1 empty nodes.
Itis acommon practice to assign null to the pointer after calling free. The
following macro does it for convenient use:
#define free_null(p) free(p); p = NULL;
What can go wrong with this macro and how woutd you provide a better
version of free_nu11? (Level 2)
Answer: Consider the following example of how free_nul1 can be
used:C Problem-Solving Questions 17
14,
15.
16.
if(foo(p)) // consider that foo is some function
free_null(p);
// this expands to:
if (£00(p))
free(p) ;
p = NULL; ;
Note that the assignment of p to null is outside if statement and spuri-
ous null statement (;). As it is evident, this macro can lead to prob-
lems when used as a statement. A better option is to make it possible
to be used as a single statement.
define free _null(p) do { free(p); p = NULL; } while(0)
This alternative implementation can now be used as a standalone
statement or inside blocks as well. The spurious semicolon is also
ignored.
You are given a #define x for some data type in C. How would you find
the size of the data type, without using the sizeof operator, declaring a
variable or a pointer variable of that type? (Level 2)
Answer: Since sizeof, or declaring variables or pointers of that type
are not allowed, we are left with only pointer arithmetic to get the
size of the data type. The only known valid value for any pointer to a
data type is 0 (null). And adding 1 results in adding sizeof(X) bytes.
Hence the solution is the following expression: (( (x*) 0) +1)
How would you swap two nibbles in a byte using a macro? (Level 2)
Answer; Using bit-wise and shift operations, separate the two nibbles
and do or to interchange them by doing bit-wise or of the result:
#define swap(x) (((x & OxF) << 4) | ((x & OxFO)>> 4))
// ox
define swap(x) (((x % 16) << 4) | ((x >> 4) & 16)
How would you find the number of bits set in an unsigned integer? (You
can use loops). (Level 2)
Answer: Solution I:
This straightforward solution loops over to check if a particular bit is
set and increment the count:
int count_bits (unsigned int n) {
int c = 0;
while (n != 0){
if (n & 01)
cH;18
Cracking the C, C++, and Java Interview
17.
n >>= 1;
}
return c;
}
Solution II:
This solution loops uses the same logic as that of finding the highest
bit set, and loops over to count the number of times it becomes true:
int count_bits(unsigned int n){
int ¢ = 0;
while (n) {
n&n- 1;
cH:
}
return ¢;
}
Note: You can modify the code by adding the following statement to
check if the integer is that power of 2 or not:
(ones==1) ?
print£(*The number is a power of 2”)
: printf ("The number is NOT a power of 2");
The parity of an integer refers to even or odd number of bits set in that
integer (even-parity or odd-parity). How would you find the parity of an
unsigned integer? (Level 2)
Answer: Solution I:
The direct way to find if the integer is of even or odd parity is to
count the number of bits set in an integer and check if it is an even or
odd number.
Solution II:
In the logic to find the number of bits set in an integer, introduce a
parity Boolean value (which can be an integer). If the loop executes
even number of times, par will be 0, and odd number of times, it will
be set to 1. The final result of par is the parity of the integer:
typedef int bool;
int parity (unsigned int n) {
bool par = 0; // set initial parity to false
// 0 (false) is even parity and 1 (true) is odd parity
while (n) {
par = !par;
né&n- 1;
}
return par;C Problem-Solving Questions 19
18. How can you swap two variables without using a temporary variable?
(Level 2)
Answer: There are a few well-known ways to swap two variables with-
out using a temporary variable. We'll see a solution using arithmetic
and bit-wise operators.
Assuming that i and j are integers, here is a trick to do it with + and -
operators:
isitd:
jei-di
i-i-j;
Here, in the first step, the values of both i and j are added and stored
in one variable. In the next step, the added value of the variable i is
subtracted from j, which results in value of i (since i + j —j is i) and
that value gets stored in j. The value of i is still the original value of
i + j and j now contains the original value of i. Now the expression
i- j is equivalent to i + j - i, which is j; and that value gets stored in
i. So, i and j have their values swapped in the last step.
Ifi and j are not big (so that the result does not overflow), and ifj is
not zero, then the following trick also works, based on the same logic
outlined earlier:
i* ji
“dea S/ a
isis ji
This trick worked using arithmetic operators (+, -, *, /) and can be
done using single bit-wise * (ex-or) operator also:
This works based on the idea that the ex-or operator complements
itself.
19.
Given the pointer to a particular node, say node_ptr, ina singly linked
list, how would you delete that node? (Level 3)
Answer: Since we don’t know the previous node pointer in a singly
linked list, we can’t actually delete the node and keep the linked list
intact. One possible solution is to copy the rest of the nodes while
leaving the current node:
// save the node in a temporary pointer
node * temp_node_ptr = node_ptr;
// till the end of the list is reached
while (temp_node_ptr != 0) {
7// copy the next node to the previous onesCracking the C, C++, and Java Interview
//~ the first one is discarded
temp_node_ptr.data = temp_node_ptr->next.data;
// txaverse to the next node to continue copying
temp_node_ptr = temp_node_ptr->next;
}
As a result, the list seems as if the link has moved one place ahead,
with the data in the node initially pointed by node_ptr getting
deleted.
One problem with this solution is that we need to copy the data in
the nodes till the end of the list (the time complexity is O(N)). And if
there are any pointers pointing to somewhere in the rest of the list,
then they will get invalidated. Therefore, a better solution is to copy
only the data from the immediate next node and free the next node:
// save the node in a temporary pointer
node * temp_node_ptr = node_ptr;
if (temp_nede_ptr->next) {
temp_node_ptr.data = temp_node_ptr->next.data;
// save the address of next node to free it later
node *free_ptr = temp_node_ptr->next;
7/ copy the next of the next node to the current node
temp_node_ptr->next = temp_node_ptr->next->next;
// we've copied both data and next, so free it now
free (free_ptr);
}
Note that these solutions won’t work if the node pointer is the last
element in the list (in which case, we have no way of setting the pre-
vious node pointer to null).
How would you find the middle node in a singly linked list? Write a sample
C code segment for this, (Level 3)
Answer: Create two pointers, pointing to the starting of the list—one
pointer to traverse node-by-node and another to traverse by skipping
anode. When the second pointer reaches null, the node pointed by
the first pointer is the middle node in the linked list.
Node * middle_node (Node *head) {
Node * ptrl = head, * ptr2 = head;
assert (head) ;
‘while (ptr2) {
ptrl = ptri->next;
ptr2 = (ptr2->next) ? ptr2->next-snext : 0;
; -C Problem-Solving Questions 21
return ptrl;
}
21. Consider that the doubly linked list has 5 nodes with data 10, 40, 23, 44,
and 50 in the nodes. The recursive version of traversal function to visit
the nodes (and print the values in the nodes) is given below:
void traverse (Node* node) {
static int i = 1;
if (node == NULL)
return;
traverse (node->next) ;
print£("#d : %d\t", i++, node->data) ;
}
|. What will be the output of this code when the head node is passed to this
traverse function?
Il. Write an iterative version of this code. (Level 3)
L. Output:
1: 502: 443: 234: 405: 10
II. Iteractive version:
void traverse (Node* node) {
static int i = 1;
while (node->next)
node = node->next ;
while (node) {
print£ ("td : td\t", i++, node->data);
node = node->prev;
}
}
Answer: In the recursive function, the data are printed in the reverse
order of the elements in the linked list. In the iterative version, the
traversal is done till the end of the list. Then traversal is done back till
the beginning, while the data are printed.
B
Given a binary tree, you need to verify if It is a binary search tree or not.
How do you do that? (Level 3)
Answer: A binary search tree is a binary tree for which the following
condition holds true: left-node val <= mid-node val <= right-node
val. So, in the inorder traversal of the binary tree, it is enough to
ensure that this condition is true:
// code to do inorder traversal of a binary tree and
// assert that it’s a binary search tree22 Cracking the C, C++, and Java Interview
void inorder_BST (Node* node) {
if (node == 0) {
return;
}
else {
if (node->left)
assert (node->left->data <= node->data) ;
inorder_traverse (root->left) ;
printf ("%d\n", root->data);
if (node->right)
assert (node->right->data > node->data) ;
}
23. How would you find if your system follows a big-endian or a little-endian
order? (Level 3)
Answer: The byte-order in which the variable is stored in a machine is
referred to as the endianness of the machine. If the bytes are stored in
sequence order it is known as a big-endian scheme, and if the order of
bytes is reversed, it is known as little-endian scheme. For example,
for the hexa-decimal value 0x0102, if the machine stores the two bytes
in increasing order in memory, as 0x01 and 0x02, it is a big-endian
machine. if the order is 0x02 and 0x01, then it’s a little endian
machine—Solution I does this check.
Solution I:
int main() {
union {
short c;
char a(sizeof (short) ];
} check;
check. c=0x0102;
if ( check.a[0] == 0x01 && check.a[sizeof(short) - 1]
== 0x02 )
printf ("Big endian\n") ;
else
printf ("Little endian\n”) ;
}
Solution II:
In this solution, there is an integer with initial value 10 (which can be
stored in a byte). In other words, the value is 0x0000000A. If the first
byte is nonzero (i.e., 0x 10, it is little-endian, otherwise it’s big-endian).
By casting the pointer to char *, and indirecting it results in the value
of the first byte in the integer:C Problem-Solving Questions 23
24.
26.
int main(){
int x=10;
if (*((char *)&x) == 0)
print£ ("Big Endian\n");
else
printf ("Little Endian\n") ;
}
The macro of£setot is used to find the offset of a member inside a
structure.
A sample implementation of this macro is as:
#define offsetof(a,b) ((int) (&(((a*) (0) )->b)))
Explain how this macro works. (Level 3)
Answer: The only known valid value for any pointer to a data type is
0 (null), so the expression (a *)0 gets a pointer of type a*. Now,
accessing a member—which is b here—and taking its address will
result in the offset N bytes from 0 for that member b in a. This is the
relative offset of member b from the beginning of the object of type a.
How would you find if a number is the power of 2 or not by using only
operators (no loops)? (Level 3)
Answer: The following solution is simple, so it can be written as a
macro as well. If the bit-wise AnD of an integer value and that value
minus one is zero, then it’s a power of 2:
int is_power_of_2(int n) {
return(!(n & (n - 1)));
How would you find the bit-count of an integer without using any loops?
(Level 3)
Answer: Solution I:
unsigned char init_array [256]; .
// initialize values from 1 to 256 for this array
int number = 10; // the number here
char *byte_pos = (char *) (&number);
int num = (init_array[byte_pos(0)] + init_array[byte_pos[1]]
+ init_array [byte_pos(2]]
+ init_array [byte_pos[3]]);
The idea is to keep an array (here it is init_array) with numbers ini-
tialized from 1 to 256 and pass on the bytes in an integer to given an
index value. The sum of the result from all the bytes in an integer will
give the number of bits set.Cracking the C, C++, and Java Interview
28.
29.
Solution II:
This solution is assuming that an integer is of 32-bit size (which can
be modified for a given size):
int count_bits(unsigned int num) {
unsigned int c = num;
= ((c >> 1) & 0x55555555)
((c >> 2) & 0x33333333)
((c >> 4) & OxOFOFOFOF) + (c & OxOFOFOFOF);
= ((c >> 8) & OXOOFFOOFF) + (c & OxX00FFOOFF);
= ((c >> 16) & OxOOOOFFFF) + (c & Ox0000FFFF) ;
return c;
}
This logic adds up the bits step-by-step and finally it results in the bit-
count of the unsigned integer. The masks are 0101, 0011, 00001111,
00000000 11111111 (repeating) and 0000000000000000
1111111111111, which is hexadecimal numbers are 5, 3, OF, and
OOFF and 0000FFFF (respectively).
(c & 0x55555555);
{e & 0x%33333333);
teat
c
c
c
e
c
. Write a recursive function that prints the binary representation of an
integer. (Level 3)
Answer: A solution is given here, but it does not print the leading
zeros in the integer:
void bit (int num) {
if (num==0)
return;
bit (num>>1) ;
(num&01)? print£("1") : print£(*o");
Write a one-line program that will print the binary representation of the
integer passed as argument. (Level 3)
Answer: This solution converts the passed string to integer using atoi
and does looping to print the bits (as zero or one):
int main(int argc, char *argv([]){
for(arge = sizeof(int)*8; arge--; putchar(
(atoi (argv(1])&(1 << arge)) ? ‘1’ : *0'));
}
How would you find the size of an integer without using the sizeof
operator? (Level 3)
Answer: Solution I:
This solution finds the number of bits in an integer and divides it by
8 (number of bits in a byte):C Problem-Solving Questions 25
30.
int size_of_int() {
unsigned int x=-1;
// ox the value -1, all the bits are one
int count = 1;
// count init value is 1 not 0 because of the number of
// iterations in while loop is (num_of_bits - 1)
while (x<<=1)
count++;
return (count/8);
}
Solution II:
This solution finds the difference in addresses of two consecutive ele-
ments in an integer array (which is the size of an integer):
int size_of_int(){
int arr([2];
return (int) ((char *) (arr +1) - (char *)arr);
Solution IT:
This solution does increment of the value of an integer pointer whose
value is 0 (which will result in size of integer bytes moved from 0):
int size_of_int() {
int *p = 0;
return ++p;
}
Write a simple code segment that checks if your implementation follows
arithmetic or logical right shift (for negative integers). (Level 4)
Answer: In signed numbers, with right shift (>>), the value of the most
significant bit (MSB) filled is implementation-dependent: it can be
either arithmetic or logical shift.
Arithmetic Shift: The MSB is filled with the copy of sign bit, pre-
serving the sign of the value.
Logical Shift: The MSB is filled with zero, thus modifying the sign
of the value.
In other words, if the right-shifted value of a negative integer is less
than zero, it is arithmetic shift, or else it is logical shift. Based on this
logic, here is a code segment that prints if the implementation follows
arithmetic or logical shift:
int main() {
(((-1 >> 1) < 0)) ?
puts (“arithmetic shift\n”)
puts ("logical shift\n");26 Cracking the C, C++, and Java Interview
31. Consider that there is a loop in a singly linked list (by possibly a bug in
the code). Write a sample C code segment that finds out if there is a loop
in a given list or not. (Level 4)
Answer: Create two pointers, pointing to the starting of the list. One
pointer traverses node-by-node and another should traverse one node
ata time. If the pointers reach null, then there is no loop. At any point
if the two pointers are equal (except for the initial condition when
both point to the head node), there is a loop.
int is_there_a_loop(Node *head) {
Node * ptri = head, * ptr2 = head;
assert (head) ;
if(head->next != 0) {
ptrl = head->next;
ptr2 = (head->next) ? head->next->next : 0;
}
while ((ptrl != 0) && (ptr2 != 0)) {
if (ptrl == ptr2) {
return 1; // has loop
ptrl = ptrl->next;
ptr2 = (ptr2->next) ? ptr2-snext-snext : 0;
}
return 0; // no loop in the linked list
}
32. What does the expression ((x) & -{x)) do (where x is an integer)?
(Level 4)
Answer: It returns the lowest bit-set in an integer (which is a power of 2).
33. Write a recursive function to reverse a string. (Level 4)
Answer: Here is a solution that uses the standard strcpy function for
copying characters from the string:
char *my_strrev(char *s) {
return (!*s) ?
s : strepy(s, strncat(my_strrev(s+1),s,1));
}
34. How do you reverse the words in a string? For example, “This sentence
needs to be reverted” should be converted to “reverted be to needs
sentence This.” An efficient and in space solution is preferable.
(Level 5)
Answer: Reverse the string in-place by swapping nth letter with (len -
n- 1)th letter from n=0 to n/2. Then reverse each word in the string
in same way.C Problem-Solving Questions 27
35.
// this function reverses the string starting from
pointer pl
// to the end position pointed by p2.
void str_rev(char* pl, char *p2) {
char *p = pl;
while (pl < p2) {
char temp = *pl;
*pl = *p2;
*p2 = temp;
pl+#;
p2--;
}
}
// this function reverses the words in the given string
// (whose start and end are indicated by pl and p2)
void str_word_rev(char *pl, char *p2)
//stepl: reverse all the characters in the string
//first
str_rev(pl, p2);
: Now reverse every word in the string ...
pl;
while (*p != '\or ) {
while ( (*p2 != '\0') && (*p2 != * ‘') ) {
p2t+;
}
str_rev(pl, p2 - 1);
part;
pl = p2;
Pp = p2;
}
}
A doubly linked list has two pointers—next and prev—for traversing
in both directions. Is it possible to convert that doubly linked list to use
only one pointer — say next —and still provide the ability to traverse in
other directions? (Level 5)
Answer: Yes, it is possible, and here is the description of one way to
achieve.
The idea is to represent the pointers in an integer of equivalent size.
Then use ex-or operation (*} on both next and prev pointers and
store the result in the next pointer. Using the head pointer, the first
node can be accessed directly; using (head ~ next) gives the prev
pointer. Applying this resulting prev on next gives the actual next
pointer, i.e. (prev * next). In this way, we can implement the doubly
linked list that will occupy the same space as the equivalent singiv
linked list.3
Data Structures and Algorithms
Questions
In this chapter, we'll discuss some important questions in data structures
and algorithms. However, problem-solving questions are not covered
in this chapter. They are covered in a separate chapter dedicated to
“Problem Solving”. (see Chapter 2)
1. A linear list of elements in which deletion can be done only from front-
end and insertion from rear-end is known as: (Level 1)
(a) queue
(b) stack
(c) B+ tree
(d) deque
Answer: (a) queue.
2. Alinear list of elements in which insertions and deletions can take place
at both ends (front and rear end) but not in the middle is known as:
(Level 1)
(a) queue
(b) stack
(c) B+ tree
(d) deque
Answer: (d) deque.
3. Which of the following data structures is suitable for modeling telephone
connections in a network? (Level 2)
(a) circular linked lists
(b) graphsData Structures and Algorithms Questions 29
(c) m-ary trees
(d) sets
Answer: (b) graphs.
Which of the following data structures is suitable for implementing a file
directory structure in an operating system? (Level 2)
(a) multiple levels of stacks
(b) multiple levels of linked lists
(c) binary tree
(d) m-ary tree
Answer: (d) m-ary tree.
Which of the following data structure is used for implementing recursion?
(Level 2)
(a) queue
(b) stack
(c) B+ tree
(d) deque
Answer: (b) stack.
Which of the following data structure is useful for converting an
expression in infix notation to postfix notation? (Level 2)
(a) queue
(b) stack
(c) B+ tree
(d) deque
Answer: (b) stack.
Which of the following sorting procedure is slowest? (Level 2)
(a) shell sort
(b) heap sort
(c) bubble sort
(d) merge sort
Aaswer: (c) bubble sort.Cracking the C, C++, and Java Interview
10.
1.
In the average case, which of the following sorting algorithms Is fastest?
(Level 2)
{a) quick sort
(b) selection sort
(c) bubble sort
(d) insertion sort
Answer: (a) quick sort. Quick sort performs fastest in the average case.
If sorting is done by comparison, what is the minimum worst case time
complexity of a sorting algorithm? (Level 2)
(a) O(N)
(b) O(log N)
(c) O(N log N)
(d) O(N’)
Answer: (c) O(N log N). If the sorting is done by comparing the val-
ues, then it has been proved that any sorting algorithm will require
minimum O(N log N) time to do the sorting.
What is the maximum number of comparisons done in selection sort
algorithm? (Level 1)
(a) OW)
(b) O(log N)
{c) O(N log N)
(@) O(N’)
Answer: (a) O(N).
Note that it is not O(N’)—that is the worst case time complexity of
selection sort. O(N) is maximum the number of comparisons required
in this algorithm for completing the sort.
What are “static” and “dynamic” data structures? (Level 1)
Answer: Static data structures are of fixed size. For example, once we
create an array in C language by specifying its size, we cannot modify
it (however, we can change the data that the data structure stores).
Dynamic data structures grow and shrink in memory size as required
(as data are inserted or removed from the data structure). For
example, a linked list is a dynamic structure.Data Structures and Algorithms Questions 31
12. What do you mean by “worst cast time complexity”? (Level 2)
Answer: “Worst case time complexity’ is a time complexity measure in
which the worst-case scenario for time taken to do the steps taken in
the algorithm is considered. The measure considers the maximum
number of computation steps required on any input size N. It consid-
ers the closest approximation of the maximum time taken. It is given
by the ‘big-O’ notation. For example, O(1) indicates the algorithm is
of ‘constant time complexity.’
13. What are the different kinds of search algorithms available? (Level 1)
Answer: Search algorithms can be classified based on the approach
used in searching values. For example, sequential, binary and hash-
ing. If the algorithm does the search sequentially by traversing the
elements in the data structure, it is a sequential. [fit does it by travers-
ing by recursively dividing the search space into two (as in binary
search), it is binary. If hashing is done to find the element in the un-
derlying data structure (say a hash table), then it is hashing.
14, List basic “worst case time complexity” functions in the increasing order
of complexity. (Level 2)
Answer: Constant time—O(1)
Logarithmic time—O(log N)
Linear time—O(N)
Quasilinear—O(N log N)
Quadratic time—O(N?)
Cubic time—O(N*)
Exponential time—O(24).
15. Describe “bubble sort” algorithm. (Level 2)
Answer: “Bubble sort” algorithm starts from one end of the list that is
to be sorted.
It keeps comparing the adjacent elements starting from the first
two to last two elements. For one traversal through the list, the last
element contains the largest (or smallest, depending on the comparison
function) element in that list. The second step is repeated in the list
leaving the last element. This process is repeated till there are no
more elements to compare (or a pass completes in which there was
no swapping done—which means that the list is already in sorted
order).32,
Cracking the C, C++, and Java Interview
16.
17.
18.
Bubble sort has worst-case complexity of O(N’). Following is the
code that sorts the array in ascending order:
void bubble _sort(int arr{], int len) {
for (int i = 0; i < (len - 1); i++) {
for (int j = 4; 3 < len; j++) {
if (arr[j] < arr{j-1]) {
int temp = arr{j];
arr([j] = arr[j-1];
arr[j-1] = temp;
}
}
}
}
What is an ADT? Give an example for an ADT. (Level 2)
Answer: Abstract Data Type (ADT) refers to a structure with a set of
operations defined on it. The internal implementation details of the
structure are typically irrelevant and the ADT is described by the
functionality (operations) it provides.
For example, stack is an ADT. A stack has well-known operations
such as push and pop. These operations also have restriction that they
can be done at only one end of the data structure. We can use a stack
by just knowing its “interface” (i.e., set of functions it provides) with-
out knowing its “implementation” details (i.e., is it implemented
using an array, linked list, etc).
What is a queue? Mention some of the areas in computer science where
queues are useful? (Level 2)
Answer: A queue data structure supports insertions (enqueue opera-
tions) from one end, and deletion operations (dequeue operations)
from the other end. Because of this nature, the first elements that are
inserted in the queue are the first ones to get deleted also, which is
why queues are FIFO (First-In-First-Out) structures.
Queues are used in a wide range of applications in computer sci-
ence. Notably, they are useful in operating systems and networks for
storing list of items waiting for a resource.
What are the three common notations in which expressions can be
represented? What are the advantages of each of these notations?
(Level 2)
Answer: Based on how the operators and its operands are arranged,
there are three common notations in which expressions can be repre-
sented: prefix, infix, and postfix notations.Data Structures and Algorithms Questions 33
21.
22.
23.
Here is a simple example. The expression (A + B) * C is in infix
form. Its prefix form is * +ABC. Its postfix form is AB + C *.
The infix notation is the natural form, easy to understand, and the
most commonly used form in mathematics. In prefix and postfix forms,
no explicit parenthesis is needed to force the precedence of opera-
tors. Also, it is easy to automate the evaluation of expressions in these
two forms. Due to this reason, infix expressions are converted either
to prefix or postfix before evaluating them and these two forms are
used widely in computers. Being specific, using stack data structure,
we can use the postfix form directly to evaluate the expressions.
|. What are the three ways to traverse a binary tree? (Level 2)
Answer: In-order, pre-order, and post-order are three ways to traverse
a binary tree. Consider that L is left node, M is middle node, and R is
right node. The traversal order in in-order is L-M-R; pre-order is
M-L-R; and post-order is L-R-M.
). What are two main ways to traverse a graph? (Level 2)
Answer: Breadth-First-Search (BFS) and Depth-First-Search (DFS) are
the two ways to traverse a graph.
What is a “hash” table (or a “hash” map)? (Level 2)
Answer: “Hash” table (or “hash” map) is an associative container (that
maps key to value) data structure. It supports efficient lookup for a
given key and returns the corresponding value. For example, a hash
table can be used for storing details of names and intercom phone
extension numbers in a company. Given a person’s name—which is
a key—the extension number—the value for that key—for that per-
son can be efficiently retrieved. With a well-chosen hashing function,
both insertion and searching can be of O(1) time complexity.
What is a binary tree? (Level 2)
Answer: A binary tree is a data structure in which every node has at
most two child nodes (i.e., a node can have zero, one or two child
nodes). Child nodes are referred to as left and right nodes. Each node
can have data in it.
What is a binary search tree? (Level 2)
Answer: A binary search tree is a binary tree in which elements are
stored in a sorted order. The left subtree of a node will have values24.
25.
Cracking the C, C++, and Java Interview
less than the value in the node. Similarly, the right subtree of a node
will have values greater than the value in the node.
Which of the following best describes “quick sort” algorithm? (Level 3)
{a) greedy algorithm
(b) backtracking algorithm
() dynamic programming algorithm
(d) divide-and-conquer algorithm
Answer: (d) divide-and-conquer algorithm.
What are ‘divide-and-conquer’ algorithms? Give an example of a sorting
algorithm, which is based on this ‘divide-and-conquer’ approach,
(Level 3)
Answer: ‘Divide-and-conquer’is an approach in problem solving with
three steps: divide, solve (conquer), and combine the results. The
input is divided into a set of pieces and the problem is solved on
those small pieces (using the divide-and-conquer approach repeat-
edly), and then the results are combined together to get the final out-
put.
‘Divide-and-conquer’ algorithms are typically recursive since the di-
vided small pieces are solved by repeatedly applying the ‘divide-
and-conquer’ approach.
Merge sort is an example of ‘divide-and-conquer’ algorithms. Say,
we're given an array of 10 integers, and the objective is to sort the
array. In merge sort, we divide the array into two parts—(1 to 5) and
(5 to 10}—and merge sort is repeatedly applied on these two sub-
parts. The resulting sub-arrays are combined together and finally the
two sub-arrays are combined together to get the sorted array. The
function merge_sort that shows how it works is discussed further:
// merges the array from arr[p to q] and arr[q to rJ
void merge(int arr{], int p, int a, int r) {
int temp[r]; // create a temporary array to merge the
elements
int i=p, k =p;
int j= dq
// loop and copy the elements from two arrays to
// the temp array in sorted order
while({ (i <= q) && (j <= r) ) {
if(arr{i] <= arr{j])
temp[k++] = arrfi++];
else
temp[k++] = arrlj++];Data Structures and Algorithms Questions 35
26.
27.
28,
while(i <= q) // copy left-over elements from p to q
temp[k++] = arr[i++];
while(j <= r) // copy left-over elements from q to r
temp[k++] = arr[jt+];
for(int m= 0; m< x; m+) // copy temp to original
array
arr[m] = temp [m) ;
// given array arr, it sorts the elements from p to r
void merge_sort(int arr{], int p, int r) {
if(p ) are included in the beginning of the
programs.
C is derived from which of the following languages? (Level 1)
(A) Fortran language
(B) Pascal language
(C) C++ language
(D) B language
Answer: (D) B language. The C language evolved from B program-
ming language.
Which of the following is not both unary and binary operator? (Level 1)
(A) & operator
(B) / operator
(C) + operator
(D) * operator
Answer: (B) / operator. The / (division) operator is not a unary opera-
tor. Others are also unary operators.
Which of the following is a bit-wise operator? (Level 1)
(A) Arrow operator (->)
(B) Not operator (!)
(C) Dot operator (.)50
Cracking the C, C++, and Java Interview
(D) Tilde operator (~)
Answer: {D) Tilde operator (~). It is a bit-wise NOT operator. Note
that not operator (!) is a logical operator and not a bit-wise operator.
Which of the following keywords does not indicate a storage class?
(Level 1)
(A) const keyword
(B) extern keyword
(C) static keyword
(D) auto keyword
Answer: (A) const keyword. The keywords for storage classes are auto,
register, extern, and static. Const and volatile are type qualifiers.
What is the output of the following program? (Level 1)
int main() {
int n= 5;
int fact
int i= 1;
for(; i < 5; i++)
fact *= i;
printf ("%d", fact);
}
(A) 0
(B) 24
(C) 120
(D) 240
Answer: (A) 0. Since the initial value of fact is 0, whatever the value
multiplied by that value is also 0. So the program prints 0.
Which of the following expressions is true? (Level 1)
struct 5 {
int i;
float f;
hi
union u {
int i;
float £;
hi
(A) sizeof{struct s) > sizeoffunion u)C Multiple Choice Questions 51
(B) sizeof(struct s) < sizeof{union u)
(C) sizeof(struct s) == sizeof(union u)
(D) sizeof(struct s) <= sizeof(union u)
Answer: (A) sizeof(struct s) > sizeof(union u). The size of struct is the
size of all of its members (plus any padding). Size of union is equal to
the size of the largest member of the union. So, in this code, size of
the struct is greater than the size of the union.
What is the output of the following program? (Level 1)
#define ADD(x) x + x
#define SUB(x) x - x
int main() {
int y = ADD(3) / SUB(3);
printf ("&d", ADD(y));
}
(A) Divide by zero exception at runtime
(B) 1
(C) 2
{(D) -2
Answer: (C) 2. The expression ADD(3) expands to 3 + 3. Expression
SUB(3) expands to 3 - 3. So the initialization expression for y is 3 +
3/3 -3. The / operator has higher precedence, so the expression is
treated as (3 + (3 / 3) - 3), which is (3 + 1 - 3), which is 1. ADD(y)
results in (y + y), which is 2.
Fillin the correct storage class in the given underlined blank space: “The
compiler will give an error if we attempt to get the address of a variable
with ‘storage class.” (Level 1)
(A) register keyword
(B) extern keyword
(C) static keyword
(D) auto keyword
Answer: (A) register keyword.
Which of the following is nota stream that is opened by every C program?
(Level 1)
(A) stdlog
(B) stdout52, Cracking the C, C++, and Java Interview
(C) stdin
(D) stderr
Answer: (A) stdlog. Every C program opens three streams—stdin,
stdout, and stderr.
10. What is the return type of mai1oc function? (Level 1)
(A) void
(B) int
(C) int *
(D) void *
Answer: (D) void *. The declaration for malloc function is “void *
malloc(size_t); ”
11. Which of the following options describes the behavior of the following
program? (Level 2)
auto int i;
int main() { }
(A) Compiler error
(B) No errors
(C) Linker error
(D) Runtime error
Answer: (A) Compiler error. Auto storage class can be used only for
local variables.
12. Which of the following is not a numbering system supported for integer
constants in C? (Level 2)
(A) Binary system
(B) Octal system
(C) Decimal system
(D) Hexadecimal system
Answer: (A) Binary system. Integer constants can be octal (prefixed
by 0), decimal (usual constants), or hexadecimal (prefixed by 0x). C
does not support representing integer constants as a binary number.
13. What is the output of the following program? (Level 2)
int main() {
char stri[]="Hello”;C Multiple Choice Questions 53
char str2[5]="Hello”;
print£("td %d", sizeof(stri), sizeof (str2));
}
(A) 66
(B) 55
(C) Compiler error
(D) 65
Answer: (D) 6 5. The array syntax [] is for leaving the compiler to find
the size of the array from the initialization expression. In str1, for the
string “Hello” including space for the null termination character ‘\0’,
the size of the string is 6. For str2, we explicitly specify the size of the
string as 5, which does not include the ‘\0’ character. So, the program
prints 6 5.
14. What is the output of the following program? (Level 2)
int foo(int x) {
if(x <= 0)
return 0;
else
return foo(x - 2) + x;
}
int main() {
print£("td", f00(6));
(A) 12
(B) 10
(©) 6
(D) 0
Answer: (A) 12. The function foo adds value of x decremented by 2
every time it is recursively called.
15. What is the output of the following program? (Level 2)
int main() {
char stri[]="Hello”;
strl = str2;
printf("ts $s”, strl, str2);
}
(A) Compiler error
(B) Hello World54 Cracking the C, C++, and Java Interview
(C) World Hello
(D) World World
Answer: (A) Compiler error. The variables str1 and str2 are arrays;
it is not possible to assign to arrays and hence the compiler issues an
error.
16. Which of the following operators has lowest precedence? (Level 2)
(A) Comma operator (,)
{B) Ternary operator (?:)
(C) Member access operator (.)
(D) Sizeof operator (sizeof)
Answer: (A) Comma operator. The comma operator has the lowest
precedence in C.
17. Which of the following is a compile-time operator? (Level 2)
(A) Comma operator (,)
(B) Ternary operator (?:)
(C) Array access operator ([])
(D) Sizeof operator (sizeof)
Answer: (D) Sizeof operator. The sizeof operator is the only operator
in C that is fully evaluated at compile-time itself. Therefore, it is
referred to as compile-time operator.
18. Which of the following operators take three operands? (Level 2)
(A) Comma operator (,)
(B) Ternary operator (?:)
(C) Member access operator (.)
(D) Sizeof operator (sizeof)
Answer: (B) Ternary operator. As the name indicates, it is the only
operator in C that takes three operands.
19, Which of the following operators can result in divide-by-zero error?
(Level 2)
(A) * operator
(B) % operator
(C) . (dot) operatorCRACKING the C, C++, and Java INTERVIEW
"The questions and answers are of high quality. The explanations provided are also very
clear and up-to-the-point."
Sathyaprakash Dhanabal
Application Developer, ThoughtWorks India, Bangalore
. helps in strengthening the conceptual foundation needed to crack the IT interview."
VS Murthy Sidagam
Software Engineer, Mascon Global Limited, Bangalore
..-an excellent preparation kit to crack the IT interview."
R Rajaram
Senior Software Engineer, ST-NXP wireless, Singapore
... helps you understand the interviewers’ intention behind asking a question. ..also
‘es you the knowledge and confidence to face any technical interview."
V Sai Magesh
Senior Software Engineer, Manhattan Associates, Bangalore
"Excellent book! ...sums up the basic concepts...provides a lot of relevant information
that matches everyone's requirements.”
M Amarnath
Assistant Manager—Information Systems, 24/7 Customer Inc., Bangalore
-induces interest in readers of all levels of expertise...unique, briefs the non-
qualifying choices and helps in brushing up multiple items in one shot...definitely a
good choice to crack interviews."
Vijay Anand R
Technical Specialist, Infosys Technologies Ltd, Bangalore
"In this fast technology-driven world, this hands-on conceptual guide helps every
ambitious and career-minded individual to achieve his/her dream."
Chitradevi Ramaswami
Tata Consultancy Services Limited, Bangalore
S G Ganesh is currently working at Siemens, Bangalore. He has also authored the book
60 Tips on Object Oriented Programming (Tata McGraw Hill). He can be reached at
sgganesh@gmail.com.
Visit us at : www.tatamegrawhil.com
]
Us tA Sc
a Professional
ISBN-13: 978-0-07-007792-8
ISBN-10; 0-07-007792-4
9"780070'077928! |