DSA Java CheatSheet
DSA Java CheatSheet
Page 1
1 FIND SMALLEST IN ARRAY 2 FIND LARGEST IN ARRAY 3 2ND SMALLEST & 2ND LARGEST
Logic : Track min while iterating Logic : Track max while iterating Logic : Two-pass or single-pass tracking
int min = arr[0]; int max = arr[0]; int s1=INF, s2=INF; // smallest
for(int i=1; i<n; i++) for(int i=1; i<n; i++) int l1=-INF, l2=-INF; // largest
if(arr[i] < min) if(arr[i] > max) for(int x : arr) {
min = arr[i]; max = arr[i]; if(x<s1){s2=s1;s1=x;}
• Init min = arr[0], loop from index 1 • Init max = arr[0], loop from index 1 else if(x<s2) s2=x;
• Time: O(n) Space: O(1) • Time: O(n) Space: O(1) if(x>l1){l2=l1;l1=x;}
else if(x>l2) l2=x; }
• s2 = 2nd smallest, l2 = 2nd largest
4 REVERSE A GIVEN ARRAY 5 COUNT FREQUENCY OF ELEMENTS • Time: O(n) Space: O(1)
Logic : Two-pointer swap from both ends Logic : Use HashMap for O(n) counting
13 ADDING ELEMENT IN ARRAY 14 FIND ALL REPEATING ELEMENTS 15 FIND NON-REPEATING ELEMENTS
Logic : Use ArrayList for dynamic insertion Logic : HashMap: find elements with freq > 1 Logic : HashMap: find elements with freq == 1
19 SORT ELEMENTS BY FREQUENCY 20 LEFT & RIGHT ROTATION BY K 21 EQUILIBRIUM INDEX OF ARRAY
Logic : Freq map → sort by freq desc Logic : Use modulo to handle k > n Logic : leftSum == rightSum at index i
22 CIRCULAR ROTATION BY K
Logic : Same as right rotation (mod n) 23 SORT ARRAY BY ANOTHER ARRAY 24 SEARCH ELEMENT IN ARRAY
Logic : Use order array index as sort key Logic : Linear search O(n) or Binary search O(log n)
k = k % n;
int[] res = new int[n]; Map<Integer,Integer> pos=new HashMap<>(); // Linear Search:
for(int i=0;i<n;i++) for(int i=0;i<[Link];i++) for(int i=0;i<n;i++)
res[(i+k)%n] = arr[i]; [Link](order[i],i); if(arr[i]==target) return i;
• Element at i → moves to (i+k)%n // Sort arr using comparator: // Binary Search (sorted array):
int orig = n, rev = 0; for(int i=l; i<=r; i++) if(n < 2) return false;
while(n > 0) { if(isPalindrome(i)) for(int i=2; i*i<=n; i++)
rev = rev*10 + n%10; [Link](i+" "); if(n%i == 0) return false;
n /= 10; } // isPalindrome: reverse & compare return true;
return orig == rev; • Time: O((r-l)*log n) Space: O(1) • Any divisor > √n has a pair < √n
• Negative numbers are NOT palindromes • Time: O(√n) Space: O(1)
• Time: O(log n) Space: O(1)
4 PRIME NUMBERS IN RANGE (SIEVE)
Logic : Sieve of Eratosthenes 5 CHECK ARMSTRONG NUMBER
6 CHECK PERFECT NUMBER Logic : Sum of each digit^(# digits) == n
Logic : Sum of proper divisors == n boolean[] sieve = new boolean[r+1];
[Link](sieve, true); int k = [Link](n).length();
int sum = 1; sieve[0]=sieve[1]=false; int sum=0, tmp=n;
for(int i=2; i*i<=n; i++) for(int i=2; i*i<=r; i++) while(tmp>0){
if(n%i==0){ if(sieve[i]) int d=tmp%10;
sum+=i; for(int j=i*i;j<=r;j+=i) sum+=[Link](d,k);
if(i!=n/i) sum+=n/i; } sieve[j]=false; tmp/=10; }
return n!=1 && sum==n; • Time: O(n log log n) Space: O(n) return sum==n; // e.g. 153=1^3+5^3+3^3
// e.g. 28: 1+2+4+7+14=28 • Time: O(log n) Space: O(1)
• Time: O(√n) Space: O(1)
7 EVEN OR ODD
Logic : Use Bitwise AND or Modulo 8 POSITIVE OR NEGATIVE NUMBER
9 SUM OF FIRST N NATURAL NUMBERS Logic : Compare with zero
Logic : Formula: n*(n+1)/2 // Modulo method:
if(n % 2 == 0) → Even if(n > 0) → Positive
// Formula (O(1)): else → Odd else if(n < 0) → Negative
long sum = (long)n*(n+1)/2; // Bitwise method (faster): else → Zero
// Iterative (O(n)): if((n & 1) == 0) → Even // Bitwise trick: (n>>31)&1
long sum=0; • Bitwise AND with 1 checks last bit // gives MSB (sign bit)
for(int i=1;i<=n;i++) sum+=i; • Time: O(1) Space: O(1) • Time: O(1) Space: O(1)
• Formula avoids overflow with long cast
• Time: O(1) with formula
// a=first term, d=common diff, n=terms // a=first term, r=common ratio int max = [Link](a, b);
double sum = (n/2.0)*(2*a + (n-1)*d); if(r == 1) sum = a * n; // Or: int max = (a>b) ? a : b;
// Or: Sn = n/2*(first + last) else // Bitwise (no branch):
double sum2 = (n/2.0)*(a + lastTerm); sum = a*([Link](r,n)-1)/(r-1); int diff = a-b;
• Time: O(1) Space: O(1) • Time: O(1) Space: O(1) int max2 = a-(diff&(diff>>31));
• Time: O(1) Space: O(1)
19 POWER OF A NUMBER (FAST EXP) 20 FACTORS OF A GIVEN NUMBER 21 ALL PRIME FACTORS OF NUMBER
Logic : Binary Exponentiation: O(log n) Logic : Factors occur in pairs around √n Logic : Divide out each prime factor
long power(long base, long exp) { for(int i=1; i*i<=n; i++){ for(int i=2; i*i<=n; i++){
long res=1; if(n%i==0){ while(n%i==0){
while(exp>0){ [Link](i+" "); print(i);
if((exp&1)==1) res*=base; if(i!=n/i) n/=i; } }
base*=base; [Link](n/i+" "); if(n>1) print(n); // remaining prime
exp>>=1; } } } • At most one prime factor > √n
return res; } • Pairs: (i, n/i). Don't double-count √n • Time: O(√n) Space: O(1)
• Halve exp each step → O(log exp) • Time: O(√n) Space: O(1)
• Time: O(log n) Space: O(1)
22 CHECK STRONG NUMBER
23 CHECK AUTOMORPHIC NUMBER Logic : Sum of factorial of digits == n
24 GCD OF TWO NUMBERS Logic : n^2 ends with n
Logic : Euclidean Algorithm: gcd(a,b)=gcd(b,a%b) int sum=0, tmp=n;
long sq = (long)n*n; while(tmp>0){
int gcd(int a, int b){ long tmp = n; sum += factorial(tmp%10);
while(b!=0){ while(tmp>0){ tmp/=10; }
int tmp=b; sq/=10; tmp/=10; } return sum==n;
b=a%b; a=tmp; } // Alternative: check suffix // e.g. 145: 1!+4!+5!=1+24+120=145
return a; } String s=[Link](n); • Time: O(log n) Space: O(1)
// Base case: gcd(a,0)=a return [Link]((long)n*n).endsWith(s);
Logic : Two-pointer from both ends void mergeSort(int[]a,int l,int r){ int p=partition(a,l,r);
if(l<r){ quickSort(a,l,p-1);
int l=0, r=[Link]()-1; int m=(l+r)/2; quickSort(a,p+1,r); } }
while(l<r){ mergeSort(a,l,m); // partition: place pivot correctly,
if([Link](l)!=[Link](r)) mergeSort(a,m+1,r); // all left<pivot, all right>pivot
return false; merge(a,l,m,r); } } • Avg: O(n log n) | Worst: O(n^2) |
l++; r--; } // merge: two-pointer merge into tmp[] In-place
return true; • Always O(n log n) | Stable ✓ | O(n) space
• Time: O(n) Space: O(1)
2 COUNT VOWELS, CONSONANTS, SPACES3 ASCII VALUE OF A CHARACTER 4 REMOVE ALL VOWELS FROM STRING
Logic : Classify each character Logic : Cast char to int Logic : Filter out vowel characters
11 FREQUENCY OF CHARACTERS IN STRING12 FIND NON-REPEATING CHARACTERS 13 CHECK IF TWO STRINGS ARE ANAGRAMS
Logic : int[26] for lowercase, or HashMap Logic : freq array → find chars with count 1 Logic : Sort both strings and compare
int[] freq = new int[256]; // ASCII int[] freq = new int[256]; // Method 1: Sort
for(char c : [Link]()) for(char c:[Link]()) freq[c]++; char[]a=[Link](); [Link](a);
freq[c]++; for(char c:[Link]()) char[]b=[Link](); [Link](b);
// Print non-zero entries: if(freq[c]==1) print(c); return [Link](a,b);
for(int i=0;i<256;i++) // Preserves order of first occurrence // Method 2: freq array
if(freq[i]>0) print((char)i+":"+freq[i]); • Time: O(n) Space: O(1) // freq[c]++ for s1, freq[c]-- for s2
• Time: O(n) Space: O(1) (fixed 256 array) // Anagram if all freq[i]==0
22 SORT CHARACTERS IN A STRING 23 COUNT NUMBER OF WORDS 24 WORD WITH MOST REPEATED LETTERS
Logic : toCharArray → sort → new String Logic : Split on whitespace, count non-empty tokens Logic : For each word: count unique vs total chars
char[] ch = [Link](); // Trim first to avoid empty splits: String best=""; int maxRep=0;
// Preserves case: uppercase before lower String[] words=[Link]("\\s+"); for(char c:[Link]()) freq[c-'a']++;
String[] words=[Link]().split("\\s+");
int l=0,r=[Link]-1;
while(l<r){
String tmp=words[l];
words[l++]=words[r];
words[r--]=tmp; }
return [Link](" ",words);
• Time: O(n) Space: O(n)