Java 02
Java 02
Every Java program starts with a main method. This is the entry point for execution.
Key points: ‑ Class name must match the ilename ([Link] for Solution class) ‑ main method
must be public static void ‑ args is a String array for command‑line input (rarely used in DSA)
‑ public class is required; can also be package‑private (no modi ier)
Printing Output
// Standard output
[Link]("Value: " + 5); // Prints and adds newline
[Link]("No newline"); // No newline at end
[Link]("%d %s\n", 10, "text"); // Formatted output
import [Link];
int n = [Link]();
double d = [Link]();
String s = [Link](); // Single word
String line = [Link](); // Entire line
boolean b = [Link](); // Check if next token is int
1
}
}
import [Link];
import [Link].*;
int n = [Link]([Link]());
String[] parts = [Link]().split(" ");
[Link]("Answer");
[Link](); // Important: flush before closing
2
[Link]();
}
}
// Integer types
int x = 10; // 32-bit, range: -2^31 to 2^31-1
long y = 10000000000L; // 64-bit, must end with 'L'
short s = 100; // 16-bit (rarely used)
byte b = 10; // 8-bit (rarely used)
// Floating-point
double d = 3.14; // 64-bit (default)
float f = 3.14f; // 32-bit (rarely used in DSA)
Reference Types
Memory difference: ‑ Primitive: value stored directly in variable ‑ Reference: variable stores mem‑
ory address of object
3
// Solution: use long for large numbers
long safeValue = (long) max + 1; // Correctly becomes 2147483648L
// Type casting
int i = 10;
long l = (long) i; // Widening (implicit)
int j = (int) l; // Narrowing (explicit cast required)
double d = 3.14;
int k = (int) d; // Loses decimal part: k = 3
Useful Constants
// Character codes
char zero = '0'; // Unicode 48
char a = 'a'; // Unicode 97
4
}
3. Control Flow
If‑Else Statements
int x = 10;
if (x > 0) {
[Link]("Positive");
} else if (x < 0) {
[Link]("Negative");
} else {
[Link]("Zero");
}
For Loop
5
// Reverse loop
for (int i = n - 1; i >= 0; i--) {
[Link](i);
}
// Multiple variables
for (int i = 0, j = 10; i < 5; i++, j--) {
[Link](i + " " + j);
}
int i = 0;
while (i < 5) {
[Link](i);
i++;
}
6
[Link](i + " " + j);
}
}
4. Methods
De ining and Calling Methods
Return Types
7
static String getText() {
return "hello";
}
Variable Scope
if (true) {
int y = 10; // Scope: only inside if block
[Link](x); // OK
}
// [Link](y); // ERROR: y out of scope
}
Recursion Basics
// Factorial: n! = n * (n-1)!
static int factorial(int n) {
if (n == 0) return 1; // Base case
return n * factorial(n - 1); // Recursive case
}
8
if (n <= 1) return n;
return fib(n - 1) + fib(n - 2);
}
// Swap
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
Stack over low: Too deep recursion causes StackOver lowError. Use iterative approach for n >
10000.
5. Arrays
1D Arrays
// Accessing elements
arr[0] = 10;
[Link](arr[0]);
// Length
int size = [Link];
// Iteration
for (int i = 0; i < [Link]; i++) {
9
[Link](arr[i]);
}
2D Arrays
// Accessing
matrix[0][1] = 5;
[Link](matrix[0][1]);
// Iteration
for (int i = 0; i < [Link]; i++) {
for (int j = 0; j < matrix[i].length; j++) {
[Link](matrix[i][j]);
}
}
// For-each
for (int[] row : matrix) {
for (int val : row) {
[Link](val);
}
}
10
Common Array Operations
// Copy array
int[] original = {1, 2, 3};
int[] copy = [Link]();
// OR
int[] copy2 = new int[[Link]];
[Link](original, 0, copy2, 0, [Link]);
// Fill array
[Link](arr, 0); // Fill all with 0
[Link](arr, 2, 5, 99); // Fill index 2 to 4 with 99
// Sort array
[Link](arr); // Ascending order
11
[Link](arr[0]); // 100 (modified!)
}
Important: Arrays are passed by reference. Changes inside the method affect the original array.
Common Mistakes
6. Strings
String Basics
// String concatenation
String s3 = "Hello" + " " + "World"; // "Hello World"
12
String s4 = s1 + 123; // "hello123"
// String length
int len = [Link](); // 5
String s = "hello";
// Character access
char c = [Link](0); // 'h'
char[] chars = [Link](); // ['h','e','l','l','o']
// Substring
String sub = [Link](1); // "ello" (from index 1 to end)
String sub2 = [Link](1, 3); // "el" (from 1 to 3 exclusive)
// Case conversion
String upper = [Link](); // "HELLO"
String lower = "HELLO".toLowerCase(); // "hello"
// Trimming whitespace
String trimmed = " hello ".trim(); // "hello"
// Splitting
String[] parts = "a,b,c".split(","); // ["a", "b", "c"]
// Finding substring
int index = [Link]('e'); // 1
int index2 = [Link]("ll"); // 2
boolean contains = [Link]("ell"); // true
// Replacing
String replaced = [Link]('l', 'x'); // "hexxo"
String replaced2 = [Link]("l", "x"); // "hexxo"
13
// Starting and ending
boolean startsWithH = [Link]("he"); // true
boolean endsWithO = [Link]("lo"); // true
Comparing Strings
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
// Compare lexicographically
int cmp = [Link](s2); // 0 if equal, <0 if s1 < s2, >0 if s1 > s2
14
[Link]("hello"); // Add at end
[Link](0, "start"); // Insert at position
[Link](0); // Delete character at index
[Link](0, 5); // Delete range
[Link](); // Reverse
[Link](0, 'H'); // Set character at index
String str = [Link](); // Convert to String
int len = [Link](); // Length
Character Operations
char c = 'A';
// Character classification
boolean isDigit = [Link](c); // false
boolean isLetter = [Link](c); // true
boolean isLowerCase = [Link](c); // false
boolean isUpperCase = [Link](c); // true
// Case conversion
char lower = [Link](c); // 'a'
char upper = [Link](c); // 'A'
// Character codes
char fromCode = (char) 65; // 'A'
int code = (int) 'A'; // 65
15
String str2 = [Link](arr);
import [Link];
import [Link];
16
[Link]((Integer) 5); // Remove first occurrence of value
[Link](); // Remove all
// Access
int val = [Link](0);
[Link](0, 100); // Update value at index
// Iteration
for (int i = 0; i < [Link](); i++) {
[Link]([Link](i));
}
// Convert to array
int[] arr = [Link]().mapToInt(i -> i).toArray();
Integer[] arr2 = [Link](new Integer[0]);
// Common operations
[Link](5); // First index of value
[Link](5); // Last index of value
ArrayList<Integer> subList = new ArrayList<>([Link](0, 3));
LinkedList
import [Link];
// Add
17
[Link](5); // Add at end
[Link](1); // Add at beginning
[Link](10); // Add at end
// Remove
[Link](); // Remove first element
[Link](); // Remove last element
[Link](0); // Remove at index
// Access
int first = [Link]();
int last = [Link]();
int val = [Link](0);
// Iteration
for (int num : list) {
[Link](num);
}
import [Link];
import [Link];
18
int size = [Link]();
boolean isEmpty = [Link]();
import [Link];
import [Link];
import [Link];
// Iteration
for (int num : queue) {
19
[Link](num);
}
PriorityQueue (Heap)
import [Link];
import [Link];
// Min-heap (default)
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
[Link](5);
[Link](3);
[Link](7);
[Link]([Link]()); // 3
// Max-heap
PriorityQueue<Integer> maxHeap = new PriorityQueue<>([Link]());
[Link](5);
[Link](3);
[Link](7);
[Link]([Link]()); // 7
// Common operations
int size = [Link]();
boolean isEmpty = [Link]();
[Link]();
20
}
Common uses: Top K elements, Dijkstra’s algorithm, median inding, task scheduling.
HashSet
import [Link];
import [Link];
// Add
[Link](5);
[Link](3);
[Link](5); // Duplicate, not added
// Remove
[Link](5);
[Link]();
// Check membership
boolean contains = [Link](3);
// Size
int size = [Link]();
boolean isEmpty = [Link]();
// Convert to array
Integer[] arr = [Link](new Integer[0]);
21
// Set operations
Set<Integer> s1 = new HashSet<>([Link](1, 2, 3));
Set<Integer> s2 = new HashSet<>([Link](2, 3, 4));
HashMap
import [Link];
import [Link];
// Put (add/update)
[Link]("apple", 5);
[Link]("banana", 3);
// Get
Integer value = [Link]("apple"); // 5
Integer value2 = [Link]("cherry", 0); // 0 if key not found
// Remove
[Link]("apple");
[Link]();
// Check
boolean hasKey = [Link]("banana");
boolean hasValue = [Link](3);
// Size
int size = [Link]();
boolean isEmpty = [Link]();
// Iteration
22
for (String key : [Link]()) {
[Link](key + " -> " + [Link](key));
}
// Common operations
[Link]("apple", 10); // Only put if key doesn't exist
[Link]("apple", (k, v) -> v == null ? 1 : v + 1); // Update with function
import [Link];
import [Link];
// Useful methods
Integer firstKey = [Link](); // 3
Integer lastKey = [Link](); // 7
Integer floorKey = [Link](4); // 3 (greatest <= 4)
Integer ceilingKey = [Link](4); // 5 (least >= 4)
23
Integer lower = [Link](5); // 3 (strictly less)
Integer higher = [Link](5); // 7 (strictly greater)
When to use: Need sorted order, range queries, median in stream (use two heaps usually).
import [Link];
import [Link];
24
// Iteration
for (int num : deque) {
[Link](num);
}
Common uses: Sliding window maximum, palace checker (palindrome), sliding window variants.
import [Link];
// Sort a range
int[] arr2 = {5, 2, 8, 1, 9};
[Link](arr2, 1, 4); // Sort from index 1 to 3 (exclusive 4)
Sorting Collections
import [Link];
import [Link];
25
// Sort in ascending order
[Link](list);
// Custom comparator
[Link](list, (a, b) -> a - b); // Ascending
[Link](list, (a, b) -> b - a); // Descending
// Reverse a list
[Link](list);
Custom Comparators
Binary Search
import [Link];
26
int[] arr = {1, 3, 5, 7, 9};
9. Custom Classes
Simple Class De inition
class Node {
int val;
Node next;
Node(int val) {
27
[Link] = val;
[Link] = null;
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
[Link] = val;
[Link] = null;
[Link] = null;
}
}
class Pair {
int first;
int second;
Usage in DSA
28
current = [Link];
}
@Override
public int compareTo(Person other) {
return [Link]([Link], [Link]);
}
}
// Usage
ArrayList<Person> people = new ArrayList<>();
[Link](new Person("Alice", 30));
[Link](new Person("Bob", 25));
[Link](people); // Sorted by age
// Or use lambda
[Link](people, (a, b) -> [Link]([Link], [Link]));
29
10. Common DSA Patterns in Java
Two Pointers
Sliding Window
30
int maxSum = 0;
int currentSum = 0;
// Initial window
for (int i = 0; i < k; i++) {
currentSum += arr[i];
}
maxSum = currentSum;
[Link](maxSum); // 18 (6 + -1 + 4 + 1 + 8)
31
// Example: Find middle of linked list
ListNode findMiddle(ListNode head) {
ListNode slow = head, fast = head;
while (fast != null && [Link] != null) {
slow = [Link];
fast = [Link];
}
return slow; // Middle node
}
Pre ix Sum
32
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
33
BFS (Breadth‑First Search)
import [Link];
import [Link];
import [Link];
class Node {
int val;
ArrayList<Node> neighbors;
Node(int val) {
[Link] = val;
neighbors = new ArrayList<>();
}
}
// BFS traversal
void bfs(Node start) {
Queue<Node> queue = new ArrayDeque<>();
Set<Node> visited = new HashSet<>();
[Link](start);
[Link](start);
while (![Link]()) {
Node node = [Link]();
[Link]([Link]);
34
Queue<Node> queue = new ArrayDeque<>();
[Link](start);
while (![Link]()) {
int levelSize = [Link]();
for (int i = 0; i < levelSize; i++) {
Node node = [Link]();
[Link]([Link] + " ");
// DFS recursive
void dfsRecursive(Node node, Set<Node> visited) {
[Link](node);
[Link]([Link]);
// DFS iterative
void dfsIterative(Node start) {
Deque<Node> stack = new ArrayDeque<>();
Set<Node> visited = new HashSet<>();
[Link](start);
[Link](start);
35
while (![Link]()) {
Node node = [Link]();
[Link]([Link]);
[Link]([Link]);
dfsTree([Link]);
dfsTree([Link]);
}
// Choose
[Link](nums[i]);
used[i] = true;
36
// Explore
permute(nums, current, used, result);
// Unchoose (backtrack)
[Link]([Link]() - 1);
used[i] = false;
}
}
37
// Example 2: Product of two numbers
int a = 100000, b = 100000;
long product = (long) a * b; // 10^10, exceeds int range
38
// [Link](i): O(n)
// [Link](0)/remove(0): O(1)
// [Link]/remove/contains: O(1) avg
// [Link]/get: O(1) avg
// TreeSet/TreeMap operations: O(log n)
Pre‑sizing Collections
39
for (int j = 0; j < n; j++) {
// O(1) operation
}
}
// Not acceptable:
// - O(2^n): Only for n � 20
// - O(n!): Only for n � 10
Integer c = 128;
Integer d = 128;
[Link](c == d); // false (not cached)
40
// CORRECT: Always use equals() for objects
if ([Link](s2)) { }
if ([Link](b)) { }
NullPointerException
// Safe navigation
String length = s != null ? [Link]([Link]()) : "N/A";
// In collections
ArrayList<Integer> list = null;
// for (int num : list) { } // NullPointerException
41
int v = [Link]("missing", 0) + 1;
Off‑by‑One Errors
// Correct iteration
for (int i = 0; i < [Link]; i++) {
arr[i] = i;
}
42
int mod = (n % m + m) % m; // Always positive result
// Example
int result = (-5 % 3 + 3) % 3; // 1
Over low
Integer c = 128;
Integer d = 128;
[Link](c == d); // false
43
Floating‑Point Precision
import [Link];
// Sort
[Link](arr);
// Fill
[Link](arr, 0); // Fill all
[Link](arr, 2, 4, 99); // Fill range
// Copy
int[] copy = [Link](arr, [Link]);
int[] partial = [Link](arr, 1, 4);
44
// Convert to string
[Link]([Link](arr));
// Check equality
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
[Link]([Link](a, b)); // true
Collections Utility
import [Link];
import [Link];
// Sort
[Link](list);
// Reverse sort
[Link](list, [Link]());
// Reverse
[Link](list);
// Shuffle
[Link](list);
// Rotate
[Link](list, 2);
45
// Copy
ArrayList<Integer> copy = new ArrayList<>(list);
// Fill
[Link](list, 0);
// Frequency
int count = [Link](list, 5);
Math Utility
import [Link];
// Basic
int abs = [Link](-5);
double sqrt = [Link](16); // 4.0
double pow = [Link](2, 3); // 8.0
// Rounding
double round = [Link](3.7); // 4.0
double floor = [Link](3.7); // 3.0
double ceil = [Link](3.2); // 4.0
// Constants
double pi = [Link];
double e = Math.E;
// Random
int random = (int) ([Link]() * 100); // 0 to 99
Deque
import [Link];
import [Link];
46
Deque<Integer> deque = new ArrayDeque<>();
// Add
[Link](1);
[Link](2);
// Remove
int first = [Link]();
int last = [Link]();
// Peek
int peekFirst = [Link]();
int peekLast = [Link]();
// Check
boolean isEmpty = [Link]();
int size = [Link]();
@Override
public int compareTo(Person other) {
return [Link]([Link], [Link]);
}
}
// Chaining comparators
Comparator<Person> combined = [Link](byName);
47
// Usage
List<Person> people = new ArrayList<>();
[Link](new Person(30, "Alice"));
[Link](new Person(25, "Bob"));
// IndexOutOfBoundsException
int[] arr = new int[5];
// arr[5] = 0; // IndexOutOfBoundsException
// NullPointerException
String s = null;
// [Link](); // NullPointerException
// NumberFormatException
// int x = [Link]("abc"); // NumberFormatException
// ArithmeticException
// int x = 5 / 0; // ArithmeticException
// InputMismatchException (Scanner)
Scanner sc = new Scanner("abc");
// int x = [Link](); // InputMismatchException
if (s != null) {
[Link]();
48
}
try {
int x = [Link](input);
} catch (NumberFormatException e) {
x = 0;
}
try {
int x = [Link]("123");
int[] arr = new int[x];
arr[x] = 100; // IndexOutOfBoundsException
} catch (NumberFormatException e) {
[Link]("Invalid number");
} catch (ArrayIndexOutOfBoundsException e) {
[Link]("Array index out of bounds");
}
import [Link].*;
int t = [Link]([Link]());
while (t-- > 0) {
int n = [Link]([Link]());
49
String[] parts = [Link]().split(" ");
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = [Link](parts[i]);
}
// Solve
int answer = solve(arr);
[Link](answer);
}
[Link]();
[Link]();
}
BFS Template
[Link](startNode);
[Link](startNode);
while (![Link]()) {
Node node = [Link]();
50
}
[Link](startNode);
[Link](startNode, 0);
while (![Link]()) {
Node node = [Link]();
// Process node
[Link]([Link]);
51
int result = [Link];
[Link](startNode);
[Link](startNode);
while (![Link]()) {
Node node = [Link]();
// Process node
[Link]([Link]);
52
if (arr[mid] >= target) {
result = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
[Link](result);
Union‑Find Template
class UnionFind {
int[] parent;
int[] rank;
UnionFind(int n) {
parent = new int[n];
rank = new int[n];
for (int i = 0; i < n; i++) {
parent[i] = i;
rank[i] = 0;
}
}
53
int find(int x) {
if (parent[x] != x) {
parent[x] = find(parent[x]); // Path compression
}
return parent[x];
}
// Union by rank
if (rank[rootX] > rank[rootY]) {
parent[rootY] = rootX;
} else if (rank[rootX] < rank[rootY]) {
parent[rootX] = rootY;
} else {
parent[rootY] = rootX;
rank[rootX]++;
}
return true;
}
}
// Usage
UnionFind uf = new UnionFind(n);
[Link](0, 1);
[Link](1, 2);
[Link]([Link](0) == [Link](2)); // true
// Min-heap
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
[Link](5);
54
[Link](3);
[Link](7);
[Link]([Link]()); // 3
// Max-heap
PriorityQueue<Integer> maxHeap = new PriorityQueue<>([Link]());
[Link](5);
[Link](3);
[Link](7);
[Link]([Link]()); // 7
55
Graph Adjacency List Template
// Using ArrayList
ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
for (int i = 0; i < n; i++) {
[Link](new ArrayList<>());
}
// Add edge
[Link](0).add(1); // Edge from 0 to 1
[Link](1).add(0); // Undirected: add reverse edge
// Iterate neighbors
for (int neighbor : [Link](0)) {
[Link](neighbor);
}
// Iterate
for (int[] edge : [Link](0)) {
int neighbor = edge[0];
int weight = edge[1];
}
56
int windowSum = 0;
for (int i = 0; i < k; i++) {
windowSum += arr[i];
}
int maxSum = windowSum;
// Variable window
int left = 0, right = 0;
int sum = 0;
int target = 10;
right++;
}
Backtracking Template
void backtrack(List<Integer> current, int[] candidates, int target, int start, List<List<In
// Base case
if (target == 0) {
[Link](new ArrayList<>(current));
return;
}
if (target < 0) return;
57
// Explore
for (int i = start; i < [Link]; i++) {
// Choose
[Link](candidates[i]);
// Recurse
backtrack(current, candidates, target - candidates[i], i, result);
// Unchoose
[Link]([Link]() - 1);
}
}
// Usage
List<List<Integer>> result = new ArrayList<>();
backtrack(new ArrayList<>(), new int[]{2, 3, 6}, 7, 0, result);
class SegmentTree {
int[] tree;
int n;
SegmentTree(int[] arr) {
n = [Link];
tree = new int[4 * n];
build(arr, 0, 0, n - 1);
}
58
}
}
void update(int node, int start, int end, int idx, int val) {
if (start == end) {
tree[node] = val;
} else {
int mid = (start + end) / 2;
if (idx <= mid) {
update(2 * node + 1, start, mid, idx, val);
} else {
update(2 * node + 2, mid + 1, end, idx, val);
}
tree[node] = tree[2 * node + 1] + tree[2 * node + 2];
}
}
}
// Usage
int[] arr = {1, 2, 3, 4, 5};
SegmentTree st = new SegmentTree(arr);
[Link]([Link](0, 0, [Link] - 1, 1, 3)); // Sum of [1, 3]
[Link](0, 0, [Link] - 1, 2, 10);
59
Operation ArrayList LinkedList HashSet TreeSet HashMap TreeMap
// 2D ArrayList
ArrayList<ArrayList<Integer>> grid = new ArrayList<>();
for (int i = 0; i < rows; i++) {
[Link](new ArrayList<>());
}
60
// Priority queue with custom order
PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> b - a);
61