Grokking the Engineering Manager Coding Interview
Ask Author
Back to course home

0% completed

Introduction to Arrays
Table of Contents

What Is an Array?

Key Points

Why Do We Need Arrays?

Memory Representation of an Array

How Arrays Are Stored in Memory

Memory Layout Example

Static vs. Dynamic Arrays

  1. Static Arrays
  1. Dynamic Arrays
  1. Static Vs. Dynamic Arrays Comparision

Which One Should You Use?

Basic Concepts and Operations in Arrays

  1. Accessing Elements
  1. Inserting Elements
  1. Deleting Elements
  1. Searching for an Element
  1. Updating an Element

Key Considerations for Arrays in Coding Interviews

  1. Validate Assumptions
  1. Handle Boundaries
  1. Efficiency Considerations
  1. Loops & Naming
  1. Algorithm Choice
  1. Testing & Edge Cases
  1. Handling Special Values
  1. Modifying While Iterating
  1. Array Methods

What Is an Array?

An array is a collection of items (often called elements) stored in a single block of memory. Each item in an array is of the same type (for example, all integers or all strings). Arrays are very common because they allow quick access to elements by using an index.

Key Points

  • Same Data Type: All elements are of one type (e.g., int, float, string).
  • Index-Based Access: Each element is accessed by an index, usually starting at 0.
  • Fixed Position in Memory: Elements are placed in consecutive memory locations, making access by index very fast.
Array
Array

Why Do We Need Arrays?

Arrays offer a simple way to store many similar values using one identifier. For example, if you have five students and you need to record their marks, you could use five separate variables. But as the number of students grows, using individual variables becomes hard to manage. Instead, you can use an array to hold all the marks in one organized structure.

Image

Memory Representation of an Array

Arrays store elements in contiguous memory locations, which means that all elements are placed next to each other in memory. This structure allows for fast access to elements using an index.

How Arrays Are Stored in Memory

Each element in an array occupies a fixed amount of space in memory, depending on the data type. The position of an element in memory is determined by the base address (starting location of the array) and the index of the element.

  • Fixed Memory Layout: Since elements are stored in sequence, retrieving an element by index is efficient.
  • Direct Index Access: We can compute the memory address of any element without scanning through the array.

Memory Layout Example

Consider an array:

int arr[5] = {10, 20, 30, 40, 50};

If the base address is 1000 and each integer takes 4 bytes, the memory representation would be:

Image

Because elements are placed sequentially, accessing any index is O(1) in time complexity.

Static vs. Dynamic Arrays

Arrays can be categorized into static and dynamic types based on whether their size can change during runtime. Understanding the difference between these two helps in choosing the right type for a given problem.

1. Static Arrays

A static array is an array with a fixed size that is defined when it is created. The number of elements cannot be changed after declaration.

Characteristics

  • Fixed Size: The size is set at the time of declaration and remains unchanged throughout the program.
  • Memory Allocation: Static arrays are usually allocated on the stack, which makes them efficient in terms of speed.
  • Efficient Access: Since memory is allocated contiguously, accessing elements is very fast.
  • No Resizing: If additional space is needed beyond the declared size, a new array must be created and data copied over.

Declaration and Initialization

Although the syntax varies by programming language, the basic approach to declaring a static array is:

Python3
Python3
. . . .

2. Dynamic Arrays

A dynamic array can change its size at runtime, allowing elements to be added or removed as needed.

Characteristics

  • Resizable: The array can expand when new elements are added and shrink when elements are removed.
  • Memory Allocation: Dynamic arrays are typically stored on the heap, meaning memory management is more complex.
  • Performance Trade-offs: While dynamic arrays provide flexibility, resizing them often involves allocating new memory and copying existing elements, which can be expensive in terms of time.
  • Better Memory Utilization: Since memory is allocated as needed, dynamic arrays reduce waste compared to static arrays.

Declaration and Initialization

Dynamic arrays are usually implemented using built-in data structures or libraries in different languages.

Python3
Python3
. . . .

3. Static Vs. Dynamic Arrays Comparision

FeatureStatic ArraysDynamic Arrays
SizeFixed at creation timeCan grow or shrink during runtime
Memory AllocationStack (or fixed memory)Heap (allocated dynamically)
ResizingNot possible without creating a new arrayPossible, but may require copying data
PerformanceFast access, no overhead for size changesFlexible, but resizing may be costly
Ease of UseSimple and efficientMore complex, requires resizing logic
Use CaseBest for fixed-size dataBest for unknown or variable-size data

Which One Should You Use?

  • Use Static Arrays when the number of elements is known and does not change.
  • Use Dynamic Arrays when the number of elements is unknown or can vary.

Understanding the strengths and weaknesses of both types helps in making better programming decisions.

Basic Concepts and Operations in Arrays

Arrays support several fundamental operations, including accessing, inserting, deleting, searching, and updating elements. These operations differ in efficiency depending on whether they involve modifying existing elements or shifting elements within the array. Below, we explain each operation in detail along with Python examples.

1. Accessing Elements

Each element in an array is accessed using its index. Arrays use zero-based indexing, meaning the first element is at index 0, the second at 1, and so on.

The accessing an element by index takes O(1) time complexity, as it requires no iteration.

Example:

arr = [10, 20, 30, 40, 50] print(arr[0]) # Output: 10 print(arr[3]) # Output: 40

2. Inserting Elements

Insertion operations depend on where the new element is added:

a) Inserting at the End

If there is enough space, adding an element at the end does not require shifting elements and is therefore O(1).

arr.append(60) # Add 60 at the end print(arr) # Output: [10, 20, 30, 40, 50, 60]

b) Inserting at a Specific Index

When inserting at index i, all elements after the index must shift one position to the right to make space. Since shifting takes O(n) time in the worst case (when inserting at the beginning), this operation is O(n).

arr.insert(2, 25) # Insert 25 at index 2 print(arr) # Output: [10, 20, 25, 30, 40, 50, 60]

3. Deleting Elements

Deletion operations are similar to insertion—removing an element from the end is efficient, but removing from a specific index requires shifting elements.

a) Deleting from the End

Since no elements need to be shifted, removing the last element takes O(1).

arr.pop() # Removes last element print(arr) # Output: [10, 20, 25, 30, 40, 50]

b) Deleting from a Specific Index

Removing an element from index i requires shifting all elements after i one position left. This takes O(n) in the worst case (when deleting from the beginning).

del arr[2] # Remove element at index 2 print(arr) # Output: [10, 20, 30, 40, 50]

4. Searching for an Element

Searching is used to check if an element exists and to find its index.

a) Linear Search (Unsorted Array)

In an unsorted array, we must check each element one by one, making the worst-case complexity O(n).

if 30 in arr: print("Found at index:", arr.index(30)) # Output: Found at index 2

b) Binary Search (Sorted Array)

If the array is sorted, we can use binary search, which reduces complexity to O(log n) by repeatedly dividing the search space in half.

import bisect index = bisect.bisect_left(arr, 30) # Finds position of 30 in sorted list print("Found at index:", index)

5. Updating an Element

Updating means modifying an existing value, which does not require shifting elements. Since accessing an index is O(1), updating is also O(1).

arr[2] = 100 # Change value at index 2 print(arr) # Output: [10, 20, 100, 40, 50]
Array operations and their time complexities
Array operations and their time complexities

Key Considerations for Arrays in Coding Interviews

1. Validate Assumptions

  • Duplicates: Ask if duplicate values are allowed.
  • Sorted/Unsorted: Some algorithms (e.g., binary search) require sorted arrays.

2. Handle Boundaries

  • Index Out of Bounds: Always check valid indices to avoid errors.
  • Negative Indices: In Python, negative indices access elements from the end.

3. Efficiency Considerations

  • Slicing & Concatenation: Takes O(n) time, avoid unnecessary operations.
  • In-place vs. Extra Space: Try to optimize space usage.

4. Loops & Naming

  • Use Descriptive Variable Names: Improves code clarity.
  • Watch Loop Indices: Avoid off-by-one errors.

5. Algorithm Choice

  • Time & Space Complexity: Always analyze and justify.
  • Nested Loops: Avoid if possible, as they increase time complexity.

6. Testing & Edge Cases

  • Empty, Single-Element, Large Arrays: Always test edge cases.
  • Various Inputs: Ensure the solution works for all possible cases.

7. Handling Special Values

  • Zero & Negative Numbers: Important for sum/product-based problems.

8. Modifying While Iterating

  • Avoid Direct Modification: Use a copy or iterate backward if needed.

9. Array Methods

  • Know Built-in Methods: Understand their time complexity.

By keeping these points in mind, you can approach array problems confidently and optimize your solutions efficiently.

Mark as Completed

Table of Contents

What Is an Array?

Key Points

Why Do We Need Arrays?

Memory Representation of an Array

How Arrays Are Stored in Memory

Memory Layout Example

Static vs. Dynamic Arrays

  1. Static Arrays
  1. Dynamic Arrays
  1. Static Vs. Dynamic Arrays Comparision

Which One Should You Use?

Basic Concepts and Operations in Arrays

  1. Accessing Elements
  1. Inserting Elements
  1. Deleting Elements
  1. Searching for an Element
  1. Updating an Element

Key Considerations for Arrays in Coding Interviews

  1. Validate Assumptions
  1. Handle Boundaries
  1. Efficiency Considerations
  1. Loops & Naming
  1. Algorithm Choice
  1. Testing & Edge Cases
  1. Handling Special Values
  1. Modifying While Iterating
  1. Array Methods