Arrays & Strings
The array is the simplest data structure: items in a row, side by side in memory. Almost everything else is built on top of it — and its strengths and weaknesses explain half of Big-O in practice.
An array stores elements in one contiguous block of memory. That layout gives its superpower: to find item 500, the computer multiplies 500 by the item size and jumps straight there — O(1) access by index, no searching. The weakness is the flip side of the same layout: inserting at the front means shifting every other element right one slot, O(n). Python's list, JavaScript's array, and Java's ArrayList are all dynamic arrays — arrays that grow by allocating a bigger block and copying when full.
Strings are arrays of characters with one twist in most languages: they're immutable. "Changing" a string actually builds a new one, copying everything — so concatenating in a loop is a hidden O(n²) trap. Every language has an escape hatch: collect pieces in a list and join once at the end.
Two pointers and sliding window are the two most common array interview patterns. Both replace a nested loop (O(n²)) with a single coordinated pass (O(n)). If a problem says 'subarray', 'substring', or 'pair that sums to', one of these is usually the answer.