Java Interview - Algorithm & Data Structures Revision
Valid Parentheses
public boolean isValid(String s) {
Stack<Character> st = new Stack<>();
for(char c : s.toCharArray()){
if(c == '(') st.push(')');
else if(c == '{') st.push('}');
else if(c == '[') st.push(']');
else if(st.isEmpty() || st.pop() != c) return false;
}
return st.isEmpty();
}
Excel Sheet Column Title
public String convertToTitle(int n) {
StringBuilder result = new StringBuilder();
while(n > 0){
n--;
result.insert(0, (char) ('A' + n % 26));
n = n / 26;
}
return result.toString();
}
Two Sum IV - Input is a BST
public HashSet<Integer> hs = new HashSet<>();
public boolean findTarget(TreeNode root, int k) {
if(root == null) return false;
if(hs.contains(root.val)) return true;
else hs.add(k - root.val);
return (findTarget(root.left, k) || findTarget(root.right, k));
}
First Bad Version
public int firstBadVersion(int n) {
int start = 1; int end = n;
while(start < end){
int mid = start + (end - start) / 2;
if(!(isBadVersion(mid))) start = mid + 1;
else end = mid;
}
return start;
}
Remove duplicates in a sorted linked list
public ListNode deleteDuplicates(ListNode a) {
if(a == null) return a;
ListNode output = a;
while(a.next != null){
if(a.val == a.next.val) {a.next = a.next.next; continue;}
a = a.next;
}
return output;
}
Number of 1s in a number
public int numSetBits(long a) {
int count = 0;
while(a > 0){
count += a & 1;
a = a >>> 1;
}
return count;
}
List Cycle
public ListNode detectCycle(ListNode a) {
ListNode slow = a; ListNode fast = a; boolean hasCycle = false;
while(fast != null && fast.next != null && slow != null){
slow = slow.next; fast = fast.next.next;
if(fast == slow) {hasCycle = true; break; }
}
if(!hasCycle) return null;
else{
fast = a;
while(slow != fast){
slow = slow.next; fast = fast.next;
}
return slow;
}
}
int singlenum = 0;
for(int i = 0; i < a.size(); i++){
singlenum = singlenum ^ a.get(i);
}
return singlenum;
}
while(true) {
if (A == 0) return B;
if (B == 0) return A;
if (A > B) {
A = A % B;
} else {
B = B % A;
}
}
}
ListNode slow = a; ListNode fast = a; boolean hasCycle = false;
while(fast != null && fast.next != null && slow != null){
slow = slow.next; fast = fast.next.next;
if(fast == slow) {hasCycle = true; break; }
}
if(!hasCycle) return null;
else{
fast = a;
while(slow != fast){
slow = slow.next; fast = fast.next;
}
return slow;
}
}
Given an array of integers, every element appears twice except for one. Find that single one.
public int singleNumber(final List<Integer> a) {int singlenum = 0;
for(int i = 0; i < a.size(); i++){
singlenum = singlenum ^ a.get(i);
}
return singlenum;
}
GCD
public int gcd(int A, int B) {while(true) {
if (A == 0) return B;
if (B == 0) return A;
if (A > B) {
A = A % B;
} else {
B = B % A;
}
}
}
If String is palindrome utmost deleting one character
public boolean validPalindrome(String s) {
int l = -1, r = s.length();
while (++l < --r)
if (s.charAt(l) != s.charAt(r)) return isPalindromic(s, l, r+1) || isPalindromic(s, l-1, r);
return true;
}
public boolean isPalindromic(String s, int l, int r) {
while (++l < --r)
if (s.charAt(l) != s.charAt(r)) return false;
return true;
}
Birthday cake blowout
static int birthdayCakeCandles(int n, int[] ar) {HashMap<Integer, Integer> heights = new HashMap<>(); int max = 0;
for(int i : ar){
max = Math.max(max, i);
if(heights.containsKey(i))heights.replace(i, heights.get(i)+1);
else heights.put(i, 1);
}
return heights.get(max);
}
12 Hour clock to 24 Hour clock
static String timeConversion(String s) {if(s.charAt(s.length() - 2) == 'A') {
int hour = Integer.parseInt(s.substring(0,2));
if(hour == 12) return "00" + s.substring(2, s.length() - 2);
else return s.substring(0, s.length() - 2);
}
else{
int hour = Integer.parseInt(s.substring(0,2));
if(hour == 12) return s.substring(0, s.length() - 2);
return "" + (hour + 12) + s.substring(2, s.length() - 2);
}
}
Remove duplicates from sorted array (atmost 2 duplicates are ok)
public int removeDuplicates(int[] nums) {
int i = 0;
for(int n : nums){
if(i < 2 || n > nums[i-2]) nums[i++] = n;
}
return i;
}
Minimum absolute difference between two terms in an array
static int minimumAbsoluteDifference(int n, int[] arr) {Arrays.sort(arr);
int min = arr[arr.length - 1] - arr[0];
System.out.println("Min : " + (arr[arr.length - 1] - arr[0]));
for(int i = 0; i < arr.length - 1; i++){
System.out.println(arr[i + 1] - arr[i]);
min = Math.min(min, arr[i + 1] - arr[i]);
}
return min;
}
If continuous subarray exists where sum is mod of K
public boolean checkSubarraySum(int[] nums, int k) {Map<Integer, Integer> map = new HashMap<Integer, Integer>(){{put(0,-1);}};;
int runningSum = 0;
for (int i=0;i<nums.length;i++) {
runningSum += nums[i];
if (k != 0) runningSum %= k;
Integer prev = map.get(runningSum);
if (prev != null) {
if (i - prev > 1) return true;
}
else map.put(runningSum, i);
}
return false;
}
Sort 0,1,2
public void sortColors(int[] nums) {int last = nums.length - 1;
int start = 0;
for(int i = 0; i < nums.length; i++){
while(nums[i] == 2 && i < nums.length - 1) {
nums[i] = nums[last];
nums[last--] = 2;
}
while(nums[i] == 0 && i > 0) {
nums[i] = nums[start];
nums[start++] = 0;
}
}
}
Hamming distance
public int totalHammingDistance(int[] nums) {int total = 0;
for(int i = 0; i < nums.length - 1; i++){
int bitCount = 0;
for(int j = i + 1; j < nums.length; j++){
bitCount += (nums[i] >> j) & 1;
}
total += bitCount;
}
return total;
}
Number of paths in a graph
public int countComponents(int n, int[][] edges) {if(n <= 1) return n;
HashMap<Integer, List<Integer>> hm = new HashMap<>();
for(int i = 0; i < n; i++) hm.put(i, new ArrayList<>());
for(int[] i : edges){
hm.get(i[0]).add(i[1]);
hm.get(i[1]).add(i[0]);
}
HashSet<Integer> hs = new HashSet<>();
int count = 0;
for(int i = 0; i < n; i++){
if(hs.add(i)){
dfs(i, hs, hm);
count++;
}
}
return count;
}
public void dfs(int i, HashSet<Integer> hs, HashMap<Integer, List<Integer>> hm){
for(int j : hm.get(i)){
if(hs.add(j)){
dfs(j, hs, hm);
}
}
}
Maximum size subarray
public int maxSubArrayLen(int[] nums, int k) {HashMap<Integer, Integer> hm = new HashMap<>();
int sum = 0; int len = 0;
for(int i = 0; i < nums.length; i++){
sum += nums[i];
if(sum == k) len = Math.max(len, i + 1);
else if(hm.containsKey(sum - k)) len = Math.max(len, (i - hm.get(sum - k))); //difference is excess and seeing if it already calculated...if excess is removed, we have a match
if(!hm.containsKey(sum)) hm.put(sum, i);
}
return len;
}
Given an array of integers sorted in ascending order, find the starting and ending position of a given target value
public int[] searchRange(int[] nums, int target) {if(nums == null || nums.length <= 1) return null;
int start = 0; int end = nums.length; int st = 0; int en = 0;
while(start < end){
int mid = (start + end) / 2;
if (nums[mid] < target) start = mid + 1;
else end = mid;
}
int[] op = new int[2];
op[0] = end;
end = nums.length;
while(start < end){
int mid = (start + end) / 2 + 1;
if (nums[mid] > target) end = mid - 1;
else start = mid;
}
op[1] = end;
return op;
}
Longest common prefix
public String longestCommonPrefix(String[] strs) {if(strs == null || strs.length == 0) return "";
if(strs.length == 1) return strs[0];
Arrays.sort(strs, (String a, String b) -> a.length() - b.length());
int maxLen = strs.length;
String currPrefix = strs[0];
for(int i = 1; i < strs.length; i++){
String nextWord = strs[i]; int ind = 0;
for(int j = 0; j < currPrefix.length(); j++){
if(currPrefix.charAt(j) != nextWord.charAt(j)){
currPrefix = currPrefix.substring(0,ind); break;
}
else ind++;
}
}
return currPrefix;
}
Add bold tags in String
public String addBoldTag(String s, String[] dict) {boolean[] bold = new boolean[s.length()];
for(int i = 0; i < s.length(); i++){
for(String st : dict){
if(s.charAt(i) == st.charAt(0) && (s.length() - i >= st.length()) && s.substring(i, i + st.length()).equals(st)){
for(int j = i; j < i + st.length(); j++){
bold[j] = true;
}
//break;
}
}
}
boolean boldOn = false; String output = "";
for(int i = 0; i < s.length(); i++){
if(bold[i] && !boldOn){
output += "<b>" + s.charAt(i);
boldOn = true;
}
else if(!bold[i] && boldOn){
output += "</b>" + s.charAt(i);
boldOn = false;
}
else{
output += s.charAt(i);
}
}
if(boldOn) output += "</b>";
return output;
}
Merge intervals
public List<Interval> merge(List<Interval> intervals) {List<Interval> op = new ArrayList<>();
if(intervals == null || intervals.size() == 0) return op;
Collections.sort(intervals, (Interval a1, Interval a2) -> a1.start - a2.start);
Interval curr = intervals.get(0);
for(int i = 1; i < intervals.size(); i++){
if(intervals.get(i).start <= curr.end){
curr.end = Math.max(intervals.get(i).end, curr.end);
}
else{
op.add(curr);
curr = intervals.get(i);
}
}
op.add(curr);
return op;
}
Find minimum element in rotated sorted array
public int findMin(int[] nums) {if(nums == null || nums.length == 0) return 0;
int start = 0; int end = nums.length - 1;
while(start < end){
int mid = (start + end) / 2;
if(nums[mid] < nums[end]) end = mid;
else start = mid + 1;
}
return nums[start];
}
Given a list of parent - child relationship, determine if 2 nodes have a common anchestor apart from themselves.
public static boolean haveSharedAncestor(List<List<Integer>> pairs, int nodeA, int nodeB) {HashMap<Integer, List<Integer>> cpMap = new HashMap<>(); //store child to parent relation
for(List<Integer> pair : pairs){
int child = pair.get(1);
int parent = pair.get(0);
List<Integer> temp = cpMap.getOrDefault(child, new ArrayList<Integer>());
temp.add(parent);
cpMap.put(child, temp);
}
Queue<Integer> childQ = new LinkedList<>();
childQ.offer(nodeA);
HashSet<Integer> pList = new HashSet<>();
while(!childQ.isEmpty()){
int curr = childQ.poll();
if(cpMap.containsKey(curr)){
for(int par : cpMap.get(curr)) {
pList.add(par);
childQ.offer(par);
}
}
}
childQ.offer(nodeB);
while(!childQ.isEmpty()){
int curr = childQ.poll();
if(cpMap.containsKey(curr)){
for(int par : cpMap.get(curr)) {
if(pList.contains(par)) return true;
childQ.offer(par);
}
}
}
return false;
}
Comments
Post a Comment