# Software Engineer Interview Questions in London, UK

Software engineer interview questions shared by candidates

## Top Interview Questions

### Software Engineer at Gemalto was asked...

how do you get an Elephant in the fridge? 29 Answerstake the Giraffe out first? Dumbo, you make a big fridge I don't know! But do you know how to tell if there's an elephant in your fridge? There's footprints in the the butter. How can you tell when there's TWO elephants in your fridge? You hear giggling inside. How can you tell when there's THREE elephants in your fridge? You can't close the door. You're welcome. Show more responses Open the fridge door, take the elephant then put it in the fridge, close the fridge door. Done Through the door. Chocolate elephant I'll hire trainer from the world best circus. Get a bigger or fridge or chop the elephant up Use an industrial fridge to be nice or kill it and use lots of fridges Why do you want to put an elephant in a fridge in the first place? A trail of peanuts should do it. Don't use buns, the elephant might put on weight. Open the door and release the chain from around his leg. Depends on the size of the fridge! Show more responses Ask it nicely, but empty the fridge first. You'll want an American sized fridge though. The cheap ones that barely fit a pint of milk are no good for this. Open the fridge door and ask him to step in. What's the purpose of that? Keeping the elephant cool? LOL! I build a bigger fridge. First take everything else out of the fridge. Cut the elephant into pieces (provided it's already dead)! 1. By pieces!!! Omnomnom! Every day a new piece 2. A toy. 3. A note "an elephant". 4. A slide. 5. Big industrial fridge. 6. Wouldn't do that Is it a real elephant? if not how big is it ? How big is the fridge? Show more responses if it was a picture of an Elephant on the packaging. If we are putting animals in the fridge, I can understand a Chicken for eggs, and a Cow for milk and a Pig for bacon, but what would I use an Elephant for? Shoot it. Chop it up. Take to rendering yard. Render to slurry. Collect slurry in roller tubs. Freeze dry slurry. Blend freeze dried slurry to fine powder. Scoop powder into foil bags. Heat seal. Load fridge. Why would you put an elephant in a fridge? They are used to hot climates and have little fur, I doubt they would enjoy it? Do you need to cool the elephant? A hose and water would be a much cheaper and effective way of cooling the elephant, fridges are for static items that don't generate their own heat, like a warm blooded animal, if you need to do a post mortem, I would do it there and then moving it would would likely change many factors including position of the organs etc due to the size and weight, do unless you were looking in say blood your results could be effected by the data, if it is blood it would be easier to take a sample, if you need the fridge and I mean really need it and at the size of the thing, build it, if you need only a section take only the section, it will probably fit in a fridge if necessary use an industrial one. or get a refrigerated lorry with a ramp, logs, ropes, lots of men and pull. IF ITS DEAD... Invent a shrink ray to scale down its size or create a paradox. If you're under a time limit then simply fill the room except the fridge with mice. lay fridge on back, remove all shelves. get elephant to place one foot in fridge and one in freezer, then balance on those two legs. jobs done! Mince it. |

The questions were not very difficult but you really need to have all the concepts crystal-clear and be ready to apply them successfully. One of the questions was "how to count the letters in this string:" "The quick brown fox jumps over the lazy dog"; 12 Answerspublic static int countWords(String str){ if(str == null || str.isEmpty()) return 0; int count = 0; for(int e = 0; e < str.length(); e++){ if(str.charAt(e) != ' '){ count++; while(str.charAt(e) != ' ' && e < str.length()-1){ e++; } }else{ e++; } } return count; } Sorry, the above version has an error!!!!!!!!!!!!!!!!!!!!!!!! concider this one: public static int countWords(String str){ if(str == null || str.isEmpty()) return 0; int count = 0; for(int e = 0; e < str.length(); e++){ if(str.charAt(e) != ' '){ count++; while(str.charAt(e) != ' ' && e < str.length()-1){ e++; } } } return count; } # That's why i love Python: len(re.findall('[a-zA-Z]', s)) Show more responses sorry u need to give input ;) ------ len(re.findall('[a-zA-Z]', "The quick brown fox jumps over the lazy dog")) It depends on what has to be considered a word. For example, if we consider a word any string between spaces, we can write it in a more compact way: public static int countWords(String str){ if(str == null || str.isEmpty()) return 0; return str.split(" ").length; } The question is how to count the characters in the string. If we can assume that the input is ASCII - always clarify first - then we know that the character range is 0-255. void count(char* str, int counts[255]) { if (str == 0) return; if (counts == 0) return; for (char *c = str; c != 0; c++) { counts[*c]++; } } First we assert the input is valid. Note that we take an additional parameter - an array of the count of each ASCII character. We loop through the string until we reach the null terminator, and we iterate a char pointer through each character in the string. For each iteration, we increment the counter in the array. Memory complexity is O(1), runtime complexity is O(n). If the input must be unicode, then we may consider alternatively using a hash table. void count(wchar_t* str, std::unordered_map& counts) { if (str == 0) return; for (char *c = str; c != 0; c++) { counts[*c]++; } } We still arrive at an O(1) memory complexity and O(n) runtime complexity (although it is worth noting that despite a hash table lookup takes O(1) like an array, the fixed cost of each lookup is higher for the hash table due to the hashing function, and in the worst case a lookup can be O(n)). The question asks to count the characters, without using String.length() you can do this: public static Pair countLetters(String s) { //If the string is null or it is empty then it will have no character if (s == null || s.isEmpty()) { //So return the pair with 0 and 0 return new Pair(0, 0); } //If we should still run the loop. boolean run = true; //The count of characters int count = 0; //The count of characters without spaces int countWithoutSpace = 0; //While we are still running (we are at a valid index) while (run) { //Then try to try { //Get the character at the current count char c = s.charAt(count); //Add one to the count as we have a valid character count++; //If the character is not a space if (c != ' ') { //Then add one to the count without spaces. countWithoutSpace++; } //If we get a StringIndexOutOfBooundsException it means that the current count is outside the length of the string. } catch (StringIndexOutOfBoundsException e) { //So stop the loop. run = false; } } //And return the pair with the count and the count without spaces. return new Pair(count, countWithoutSpace); } This returns both the count with and without spaces and does not use a built in length function. Wait..Am I missing something? string.Length will do the job? Yeah i think string.length() will do the job. failed! String.length returns the length of the String. Google asked you how many letters - in other words you cannot count the spaces. String. length returns number of unicode characters -and so includes spaces I would do this: public static int countWords(String sentence){ String noSpace; //REMOVE SPACE noSpace = sentence.replaceAll(" ", ""); return noSpace.length } And in javascript var str = "The quick brown fox jumps over the lazy dog" ; var length = str.replace(/\s/g, "").length; |

### Software Engineer at Google was asked...

Write a function that takes the ordinal number of a column in a spreadsheet and returns the label of that column: i.e. 1 -> A 2 -> B, 26 -> Z, 27->AA 7 Answers!!!! There can be some bugs not fully tested use at your own risk =)... import java.util.ArrayList; public class OrdinalToColumn { public static void main(String[] args) { // TODO Auto-generated method stub int valueToConvert = 64; System.out.println(ordinalToColumnConversion(valueToConvert)); } private static char[] ordinalToColumnConversion(int valueToConvert) { // TODO Auto-generated method stub ArrayList numbersReverse = new ArrayList(); int sizeOfArr; int curIndex, rollBackIndex; while(valueToConvert>0){ // base conversion numbersReverse.add(valueToConvert % 26); valueToConvert /= 26; } sizeOfArr = numbersReverse.size(); curIndex = rollBackIndex = 0; while(curIndex rollBackIndex){ // borrowing can lead some cascading operation we have to roll back until all digits are more than 0 int barrowNumber = numbersReverse.get(tempIndx); // barrow from previous barrowNumber--; numbersReverse.set(tempIndx, barrowNumber); tempIndx--; int nextNumber = numbersReverse.get(tempIndx); // add to the current one nextNumber += 26; numbersReverse.set(tempIndx, nextNumber); } } else { curIndex++; } } if(sizeOfArr > 0 && numbersReverse.get(sizeOfArr-1) == 0){ // remove the highest significant bit if it is 0 numbersReverse.remove(sizeOfArr-1); sizeOfArr--; } char [] returnNumbers = new char [sizeOfArr]; for(int i = sizeOfArr-1, n=0; i>=0; --i, ++n){ returnNumbers[n] = (char)(numbersReverse.get(i)+64); // converting to capital letter } return returnNumbers; } } Here my solution in Java: public class SpreadSheetLabel { private static char LABEL[] = new char[] {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; private static void printLabel(int n) { if (n = 26) { n /= 26; str.append(LABEL[(n-1) % LABEL.length]); } System.out.println(str.reverse()); } public static void main(String[] args) { for(int i = 1; i <= 2600; i++) { printLabel(i); } } } I haven't tried interwee's solution, but that code is so complex and long for such a simple problem I don't even wish to try and understand it :) Anyways, here is my simple and elegant solution in Java: // Precondition: i >=1 public static String excelNumbering(int i){ if(i >=1 && i<= 26) return ""+(char)(i+64); else return excelNumbering((i-1)/26) + excelNumbering((i-1)%26+1); } Show more responses In C++: string excelNumber(int i) { string excelStr = ""; int numAs = i / 26; int rest = i % 26; for (int j = 0; j < numAs; ++j) { excelStr += "A"; } return excelStr + (char) (rest + 64); } Not sure what is meant to happen for error cases (e.g. 0). void calc_ord(int ord, char* out) { if (ord == 0) return; int tmp = ord; char *ptr = out; while (tmp <= 26) { *ptr++ = 'A'; tmp -= 26; } *ptr++ = 'A' + tmp; } public String getName(int n) { String ret=""; while(n>0) { char c='A'+(n%26); ret=c+ret; n/=26; } return ret; } here in OBJC. Is interesting that no one in the previous answers, is calculating the base system..everyone is hardcoding 26. - (NSString *)lettersFromOrdinal:(NSUInteger)ordinal { NSMutableString *letters = [NSMutableString new]; NSUInteger base = 'Z'-'A'+1; NSUInteger labelLength = ceil(customLog(base, ordinal)); for (NSInteger i = labelLength-1; i >= 0; i--) { NSUInteger pow_ = pow(base, i); NSUInteger res = ordinal/pow_; char letter = 'A' + res - 1; [letters appendFormat:@"%c", letter]; ordinal -= res*pow_; } return [letters copy]; } |

The first coding question was to determine whether a list of integers with size N, contains all the numbers from one to N. 7 Answersint a[] = {3,2,1,4,5,6,8,7,9,10}; int sum=0; for(int i=0; i The answer provided by DG is awful. For instance:a[1,1,4] would be given as true. The answer is easier if you think of it in the opposite fashion. If it does not then there must be a duplicate or a number greater than or less than N. This is very easy to check for in O(n) time. I think good way to solve that is to use Max Heap O(n) and then go through array and check x<0, i != i+1 Show more responses In jj's solution, emptying a Max Heap would take O(nlogn) time (basically, the same idea as Heap Sort). Using that time complexity you can use any sorting algorithm that has O(nlogn) time, and then go through the sorted array and check that it only contains consecutive numbers starting with 1. In James' solution, we will need O(n) memory to check for duplicates, to do it in O(n) time. That can also be described as a kind of counting sort. Try and sort the array using counting sort where we expect each element's count to be exactly 1, and in the range [1, n]. We know that sum of numbers from 1 to N is N*(N+1)/2. First we make this calculation and then we sum the numbers in the array. If these two sum.s are equal to each other then the answer is yes, else no. This is an easy O(n) solution. Put the array in a Set (storing the sum of the numbers in a sum int as well). Step 1 check whether N*(N+1)/2 holds. If it this holds, iterate from 1 to n checking the number is there or not in the set. kilicars, your solution is badly wrong. Assuming an array of N elements, I could have n-1 elements equal to 0 and just one element equal to n * (n-1) / 2. Your algorithm would say yes |

### Software Engineer at Facebook was asked...

How do you print all elements of a linked list. 6 Answersstruct Node{ int value Node *next; } for(Node *ptr = Head; ptr != NULL; ptr = ptr->next) { cout value < class Element { int value; Element next; } public void printList(Element root) { if (root == null) return; System.out.println("Value: " + root.value); printList(root.next); } // Define a structure for linked list element typedef struct ListElmt_ { int *data; struct ListElmt_ *next; } ListElmt; // Define a structure for linked lists typedef struct List_ { int size; ListElmt *head; ListElmt *tail; } List; void printLinkedList(List *list) { ListElmt *currentElement = list->head; while (currentElement != NULL) { printf("%d ", *((int *)currentElement->data)); currentElement = currentElement->next; } } Show more responses I wonder why this question is so much easier than the others I have been reading here? It troubles me that there is so much variability in Facebook's interview questions if this really is the case. Maybe they are just labelled incorrectly? some are phone interviews, some are for interns, for collage graduates, for 3-4 years experience, and others are for 4+ years experience. anyway I try to solve as much as I can.... I'd first tell the interviewer that the linked list might have loops. I'll first check if the linked list has loop or not. if yes, find the beginning of the loop and then print the linked list. To find if a linked list has a loop: 1- using two pointers (slow, fast) slow jumps one node and fast jumps two nodes. 2- if slow and fast meet at any node then there is a loop. To find the start of the loop: 3- after slow and fast met at a node, keep fast there and move slow until it comes back to is 4- the number of steps slow took to go back to fast is the length of the loop. 5- reset slow and fast to the beginning of the linked list. 6- move fast number of times = length of the loop. 7- now move slow and fast both one step at the time and when they meet, this is the beginning of the loop. (Because they are apart with n nodes where n is the size of the loop). 8- Print the linked list normally but make sure to not pass the beginning of the loop twice. 9- after all, the question is not easy as it looks ;) |

Merging of Sets: Sets Users which reference other user groups. 6 AnswersRecursively Hello! When did you interview? Beginning of November Show more responses Okay. Thanks! Hi, can you provide more details about the question? Thanks! Recursively is bad due performance ;-) Iterative is the better way. |

### Software Engineer at Accenture was asked...

You have three doors, behind one there is a prize. You choose door A, after that I ll tell you that behind door B there is no prize, do yuo keep your choice or change it ? 7 AnswersChange it. The probability for door A is 1/3, the probability for the set Door C + Door B is 2/3. The interview adds information on the set stating that Door B prob is 0, so the probability for Door C is 2/3 while Door A stays at 1/3 Balls. Once you know that there is no prize behind door B, prob(B) becomes 0. Then, since the prize must be behind A or C, and you don't know anything about them, prob(A) = prob(C) = 1/2. Any of the doors is OK. Sorry Filippo (F?) but u r wrong on this one. U may see also it in this way: in the game You ll never be told that your initial choice is wrong, the information added is only about the other two doors. This breaks the symmetry, the probability that your initial choice stays at 1/3 ( It is secluded by the bit of more information added ) , but now the prob of b goes to zero and because all the probabilities must add up to 1, the prob(c) becomes 2/3. I understand it is not intuitive, but not all the math is :) Show more responses Sorry guys. none of the above is correct. You forgot the check on the sentence, as Interviewer may be lying or not (50% probability for each of the two). If he is NOT lying than there is NO price behind B --> you have 50% it is behind A and 50% it is behind C. If he IS lying than price is behind door B (100% sure) If you draw the brances tree and put it all together, you have that: Probab. = 0,5*[(0.5*A+0.5*C] + 0.5*1*B Ossia: Probab = 0,25*A + 0.25*C + 0.5B which means that both A and C have 25% probabiity of having it right, while B has 50% to be right. Therefore answer is: "you leave door A and choose door B ". Not because this IS behind door B, but because you have a higher probability this is there. :-) my vote is with Rob. this is covered in every basic probability and statistics course. I think Andrea is bringing unneeded complexity to the question Filippo's answer would be correct if he did actually open the door when he chose door A, but because it doesn't say that. So assuming that he telling the truth and that door B does not have a prize i.e probability of a zero, door C must have a probability of 2/3 . Therefore Rob's answer is correct. This is a the Monty Hall problem. Switching yields a win 2/3 of the time, and is preferred. I ran a simulation to confirm :-) https://en.wikipedia.org/wiki/Monty_Hall_problem |

A task in which I was required to print all numbers between 1 and a million - with no repeating digits - Easy enough! Just can throw you off guard a bit 7 Answerspublic static void noRepeat(int n) { int[] ar; for(int i=1;i1) { flag = 1; } temp = temp/10; } if(flag==0) { System.out.println(i); } } } Your answer is correct, but it is slow. Here you are an algorithm that does same thinkg as you do, but also one more algorithm - using permutations. Instead of outputting to System.out I simply calculate how many numbers are there. Run and see how slow is your method for n = 8 (where n is the number of digits). import java.io.*; import java.util.*; public class NumbersNoRepeatDigits{ public class StopWatch { private long startTime = 0; private long stopTime = 0; private boolean running = false; public void start() { this.startTime = System.currentTimeMillis(); this.running = true; } public void stop() { this.stopTime = System.currentTimeMillis(); this.running = false; } //elaspsed time in milliseconds public long getElapsedTime() { long elapsed; if (running) { elapsed = (System.currentTimeMillis() - startTime); } else { elapsed = (stopTime - startTime); } return elapsed; } //elaspsed time in seconds public long getElapsedTimeSecs() { long elapsed; if (running) { elapsed = ((System.currentTimeMillis() - startTime) / 1000); } else { elapsed = ((stopTime - startTime) / 1000); } return elapsed; } } // mode complicated solution public static void permuteArray(int[] a){ permuteArrayCore(a, a.length - 1); } public static void permuteArrayCore(int[] a, int i){ if (i == -1) { if (a[0] > 0) printArray(a); return; } permuteArrayCore(a, i-1); // when ith element is on place; for (int j=i-1; j>=0; j--) { //swap i and j swap(a, i, j); permuteArrayCore(a, i-1); swap(a, i, j); } } private static void swap(int[] a, int i, int j) { int temp = a[i]; a[i] = a[j]; a[j] = temp; } public static void selectMAmong10(int m) { boolean[] take = new boolean[10]; selectMAmongNCore(m, 0, take, 0); } public static void selectMAmongNCore(int m, int next, boolean[] take, int countTaken) { if (countTaken == m){ int[] x = new int[m]; int xi = 0; for (int i = 0; i = m - countTaken) selectMAmongNCore(m, next + 1, take, countTaken); } // simpliest solution public static boolean checkDistinct(int i) { boolean[] digits = new boolean[10]; while (i > 0) { int rem = i % 10; if (digits[rem]) return false; digits[rem] = true; i = i / 10; } return true; } public static int totalCount = 0; public static void printArray(int[] a){ totalCount++; /* for (int i = 0; i < a.length; ++i) System.out.format("%d ", a[i]); System.out.println(); */ } public static void main(String[] args){ int n = 8; NumbersNoRepeatDigits t = new NumbersNoRepeatDigits(); NumbersNoRepeatDigits.StopWatch st = t.new StopWatch(); st.start(); for (int i = 1; i <= n; ++i) selectMAmong10(i); System.out.println(totalCount); System.out.println(st.getElapsedTime()); totalCount = 0; System.out.println("-----------"); int max = (int)Math.pow(10, n); for (int i = 1; i < max ; ++i) { if (checkDistinct(i)) // System.out.println(i); printArray(null); } System.out.println(totalCount); st.stop(); System.out.println(st.getElapsedTime()); } } looks really simple (if I understood it right). Here is the SHORT java version. static boolean hasDupDigit(int i){ boolean[] digits = new boolean[10]; while(i!=0){ int r = i%10; if(digits[r])return true; digits[r] = true; i/=10; } return false; } static void printNums(){ for (int i=1;i<=1000000;i++) if(!hasDupDigit(i)) System.out.println(i); } Show more responses public static void main(String[] args) { for(int i=1;i<1000000;i++){ if(!hasDup(i)) System.out.println(i); } } private static boolean hasDup(int i) { String num=Integer.toString(i); boolean ret=false; char[] carr=num.toCharArray(); for(int k=0;k Permutations anyone? #include using namespace std; bool used[10]; // init to false int count = 0; int num = 1; void backtrack (int pos) { if (pos == 6) { count++; cout << num << endl; } else { for (int i = 0; i <= 9; ++i) { if (not used[i]) { used[i] = true; num = num*10+i; backtrack(pos+1); num /= 10; used[i] = false; } } } } int main () { backtrack (0); } Very Concise Python Solution.!!! def recur(start,nums): if start*10>=1000000: return for i in nums: val=(start*10)+i print val recur(val,nums[0:i]+nums[i+1:]) nums=[0,1,2,3,4,5,6,7,8,9] recur(0,nums) package com.codingpractice.problems; import java.util.LinkedHashSet; public class UniqueDigits { public static void main(String[] args) { final int million = 1000000; for (int k = 1; k ()); } } private static void printNumbersInAscendingOrderWithKUniqueDigits(int k, LinkedHashSet takenElements) { if (k == 0) { for (int no : takenElements) { System.out.print(no); } System.out.println(); return; } for (int j = takenElements.size() == 0 ? 1 : 0; j <= 9; j++) { if (!takenElements.contains(j)) { takenElements.add(j); printNumbersInAscendingOrderWithKUniqueDigits(k - 1, takenElements); takenElements.remove(j); } } } } Ideone link: https://ideone.com/m5XFEt |

### Software Engineer at Facebook was asked...

(Phone screen questions) 1. For a given binary tree, print paths from root to all leaf nodes, one path per line. 2. Given a sequence of positive integers "seq" and an integer "total", return whether a contiguous sequence of "seq" sums up to "total". (Onsite interview questions are covered by NDA therefore can't post, but it can be said that the knowledge of data structures and handling edge cases are important for the coding interviews) 5 Answers1. Use recursive function from the root of binary tree (print at leaf, else recurse to left and right) 2. Use hashset/hashmap to record running sum of "seq", and check if there are two elements having difference of "total" 2. No, you don't need any hashmap. Just use a sliding window... Yes, the sliding window works just as well - it's just that I used hashmap at that time (more straightforward as I used Java for that interview) Show more responses Sliding window works only with non negative values the question says "positive integer" therefore it works - otherwise the hashmap method is still better as there was a short question at the end about "how would your solution handles negative integers on the sequence" (and how to change/optimize the solution if it doesn't do well) |

Implement a method called printNonComments() which prints out a extract of text with comments removed. For example, the input: hello /* this is a multi line comment */ all Should produce: hello all You have access to a method called getNextLine() which returns the next line in the input string. 5 Answers// NOTE: Not tested on an editor, may not compile. Think as a pseudo code // There is condition where this code fails: If there are two comments on the same line like // some text /* hi there */ some more and /* another comment */ even more text public static void main(String[] args){ final String COMMENT_START = "/*"; final String COMMENT_END = "*/"; bool isCommentStarted = false; String line = getNextLine(); while(line != null && line.length() >0){ int index = line.indexOf(COMMENT_START); if(index != -1 && isCommentStarted == false){ // print up until the comment System.out.print(line.subString(0, index)); isCommentStarted = true; } index = line.indexOf(COMMENT_END); if(index != -1){ // print what we have after the comment end System.out.print(line.subString(index)); isCommentStarted = false; } line = getNextLine(); System.out.println(""); // write on next line } } //need to use and also "/*" and "*/" need to be followed by space " ". int main() { string s = "hello /* this is a multi line comment */ all "; istringstream iss(s); string tmp; while(iss>>tmp){ if(tmp=="/*"){ while(iss>>tmp){ if(tmp=="*/"){ iss>>tmp; break; } } } cout< def echo(what): sys.stdout.write(what) def gobble(what): pass funsrc = cycle([(echo, "/*"), (gobble, "*/")]) consumer_fun, delim = funsrc.next() while True: line = getNextLine() if not line: break ix = line.find(delim) while ix >= 0: prefix = line[:ix] line = line[ix+len(delim):] consumer_fun(prefix) consumer_fun, delim = funsrc.next() ix = line.find(delim) consumer_fun(line) Show more responses import re lines = [] while True: line = getNextLine() if line == None: break lines += line print re.sub(r'/\*(.|\n)*?\*/','',lines.join('\n')) With vector instead of the getNextLine() to make test easier. using namespace std; void printNonComment(const vector& v) { bool show = true; for(vector::const_iterator itr = v.begin(); itr != v.end(); ++itr) { string s = *itr; for(int i = 0 ; i v; v.push_back("hello /*"); v.push_back("*/ there"); v.push_back("hello /*adf*/ me"); v.push_back("/*ha /*ha /*ha */ haha"); printNonComment(v); } |

**1**–

**10**of

**2,764**Interview Questions

## See Interview Questions for Similar Jobs

- Senior Software Engineer
- Software Developer
- Associate Software Engineer
- Java Developer
- Software Development Engineer
- Intern
- Analyst
- Business Analyst
- Consultant
- Technical Lead
- Trainee Software Engineer
- Engineer
- Software Development Engineer II
- Systems Engineer
- Fresher
- Technical Support Engineer
- QA Engineer
- Software Engineer II
- Associate
- Project Manager