Skip to content
SparkTime, home

Lesson 27 · From Practice to Job-Ready

Your 12-Week DSA Study and Revision Plan

A realistic week-by-week plan for working through this course around college or a job: what to learn, implement, practise and revise each week, with timed sessions, mock interviews, a spaced-revision schedule, and lighter and more intensive alternatives.

On this page

Key takeaways

  • A plan works when it is sustainable. About 8 to 10 hours a week for 12 weeks is realistic for many people. Adjust it to your life, not the other way round.
  • Every week follows the same loop: learn, implement, practise, revise. Keep one catch-up and revision slot, and never double up on topics to catch up.
  • Revise on a schedule (after 1, 3, 7, 14 and 30 days) and keep an error log. Most forgetting happens in the first week.
  • Start timed sessions around week 6 and mock interviews around week 8. Practising out loud matters as much as solving.
  • There is a lighter (16-week) and a more intensive (8-week) version. Nothing here guarantees a job. It builds skills that interviews look for.

Most study plans fail for the same reason: they were written by someone who imagined a version of you with unlimited energy. On day 1 you follow the schedule perfectly. By day 12 you are tired, behind and tempted to start over.

This plan tries not to do that. It assumes you have a college timetable or a job, that some weeks will be bad, and that you need slack. It will not promise you a job, because no plan can. What it can do is organise the 28 articles of this course into twelve weeks of steady work, with built-in revision, practice under time pressure, and rehearsal of the interview itself.

What you will learn

#
  • A weekly rhythm you can sustain, with a daily session template.
  • A week-by-week plan with goals and checkpoints.
  • How to revise on a schedule and keep an error log.
  • When to start timed sessions and mock interviews.
  • A lighter and a more intensive version, and what to cut when time runs out.

Principles

#
  1. Learn, implement, practise, revise. Reading is not learning. For every topic, read it, type the code, solve problems, and come back to it later.
  2. Consistency beats intensity. An hour every day outperforms a ten-hour Sunday, because you forget less and the work stays fresh.
  3. Revise early. Much forgetting happens within days. A small, scheduled review is much cheaper than relearning.
  4. Practise like the real thing. From the middle of the plan, solve problems with a timer, on paper or in a plain editor, and explain aloud.
  5. Keep slack. One session a week is for catching up, not for new material.
  6. Track, then adjust. Review your progress at the end of weeks 2, 6 and 10, and change the plan if it is not working.

The weekly rhythm

#

This assumes about 9 to 10 hours a week. It is a template, and you can shift the days around.

Day

Time

What you do

Monday

1.25 h

Learn: read the article section, trace the dry runs

Tuesday

1.25 h

Implement: type the code from the article, change it, break it

Wednesday

1.25 h

Practise: exercises, attempted before the solutions

Thursday

1.25 h

Learn or practise: next article, or more problems

Friday

0.75 h

Revision: review the error log and old notes

Saturday

2.5 h

Timed practice, project work, or a mock interview. Catch up on anything missed

Sunday

1 h

Weekly review: tick off the checklist, plan next week. Or rest

A 90-minute session

#

Block

Time

Activity

Warm-up

10 min

Re-solve a short problem from last week, from memory

Main

50 min

New material or the current exercise set

Reflection

15 min

Write what you learned and what confused you in the error log

Wrap-up

15 min

Plan the next session, and put the date of the next review in your calendar

A 30-minute minimum day

#

Some days are bad. Keep a floor so the habit survives: 10 minutes of revision, 15 minutes on one exercise, 5 minutes of notes. A 30-minute day does not break the plan. A skipped week might.

The 12-week plan

#

Article numbers refer to the articles in this course. "Implement" means typing and running the code yourself. "Practise" refers to the exercises at the end of each article, plus any extra problems you choose. The problem counts are suggestions, and understanding matters more than quantity.

Week

Focus

Articles

Implement

Checkpoint: by the end of the week you can...

1

Foundations

1, 2, 3, 4

Compile and run every program. Re-type the streak and complexity-counting programs

Set up Java, apply the six-step loop, explain why int overflows, and state the Big O of simple loops

2

Arrays and strings

5, 6

Rotate, move zeroes, Kadane, palindrome, anagram, run-length encoding

Solve basic array and string problems in O(n), and explain StringBuilder

3

Linked lists, stacks, queues

7, 8

A linked list class, reverse, cycle detection, valid parentheses, next greater element

Draw pointer changes, and pick ArrayDeque for a stack or queue

4

Hashing and recursion

9, 10

Two sum with a map, group anagrams, subsets, permutations, N-Queens

Use maps for counting and lookup, and write a backtracking solution with undo

5

Trees, plus a review week for weeks 1 to 4

11

Four traversals, BST insert and validate

Write tree recursion with a null base case. Re-solve five earlier problems from memory

6

Heaps, searching and sorting

12, 13

A min-heap, top-K, binary search with bounds, merge sort

Write binary search correctly, and use comparators. Start timed sessions

7

Two pointers and sliding window

14, 15

Pair sum, 3Sum, longest substring, minimum window

Choose between two pointers, a window and a hash map, and justify pointer moves

8

Prefix sums, greedy, bits and maths

16, 17, 18

Range sums, merge intervals, XOR single number, GCD. Lighter reading, more coding

Test a greedy rule against a counterexample. First mock interview

9

Graphs

19, 20

BFS, DFS, islands, Dijkstra, Kahn's algorithm

Model a problem as a graph, and pick BFS, DFS, Dijkstra or topological sort

10

Dynamic programming

21, 22

Fibonacci four ways, coin change, house robber, grid paths, LCS

Write the six DP steps for a new problem. This is the hardest week: do not rush it

11

Tries, DSU, interview workflow

23, 24, 25

A trie, DSU with Kruskal. Fenwick and segment trees are optional

Run the full workflow on a new problem, out loud. Start the practice project

12

Integration and interview readiness

26, 28

Finish the project milestones. Mixed timed sets

Complete two mock interviews, review your error log, and write a one-page pattern summary

Notes on the plan

#
  • Week 5 is lighter on purpose. It has one new article and a review of weeks 1 to 4. Do not skip the review.
  • Week 8 has three articles but each is shorter, and the bit-manipulation article is mostly optional depth.
  • Week 10 is the hardest. If you need two weeks for dynamic programming, take them, and use the slack that you protected.
  • Tries, Fenwick and segment trees are lower priority. If you run short of time, learn DSU and skim the rest.
  • The project (article 26) runs alongside weeks 9 to 12, one milestone at a time.

Revision that actually works

#

Spaced revision

#

You are far more likely to forget something in the first few days than later. So review it soon, then at growing gaps. A simple schedule: after 1, 3, 7, 14 and 30 days. This is the same schedule the practice project uses.

When you finish a topic or solve a problem, note the date. Then, on each review date, re-solve it from memory (not re-read it). If you can do it cleanly, move to the next gap. If you cannot, go back to the first gap.

The program below turns a study date into its review dates, and also spreads a number of articles across a number of weeks. You can use it to build your own pacing.

Java
// File: Main.javaimport java.time.DayOfWeek;import java.time.LocalDate;import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class Main {    static final int[] REVIEW_GAPS = {1, 3, 7, 14, 30};    static List<LocalDate> reviewDates(LocalDate studied) {        List<LocalDate> dates = new ArrayList<>();        for (int gap : REVIEW_GAPS) {            dates.add(studied.plusDays(gap));        }        return dates;    }    // Spreads totalItems over the given number of weeks as evenly as possible.    // The first (totalItems % weeks) weeks get one extra item, so nothing is lost.    static int[] weeklyLoad(int totalItems, int weeks) {        if (weeks <= 0) {            throw new IllegalArgumentException("weeks must be positive");        }        int[] load = new int[weeks];        int base = totalItems / weeks;        int extra = totalItems % weeks;        for (int w = 0; w < weeks; w++) {            load[w] = base + (w < extra ? 1 : 0);        }        return load;    }    // The Monday of week number weekNumber (1, 2, 3, ...), counting from the first Monday on or after start.    static LocalDate mondayOfWeek(LocalDate start, int weekNumber) {        LocalDate monday = start;        while (monday.getDayOfWeek() != DayOfWeek.MONDAY) {            monday = monday.plusDays(1);        }        return monday.plusWeeks(weekNumber - 1);    }    public static void main(String[] args) {        LocalDate studied = LocalDate.of(2026, 10, 12);        System.out.println("studied " + studied + " (" + studied.getDayOfWeek() + ")");        System.out.println("review on " + reviewDates(studied));        for (int weeks : new int[] {8, 12, 16, 20}) {            int[] load = weeklyLoad(28, weeks);            int total = 0;            for (int n : load) {                total += n;            }            System.out.println(weeks + " weeks: " + Arrays.toString(load) + " total " + total);        }        LocalDate start = LocalDate.of(2026, 10, 7);        System.out.println("week 1 starts " + mondayOfWeek(start, 1) + ", week 12 starts " + mondayOfWeek(start, 12));        System.out.println(Arrays.toString(weeklyLoad(0, 3)));    }}
Code
studied 2026-10-12 (MONDAY)review on [2026-10-13, 2026-10-15, 2026-10-19, 2026-10-26, 2026-11-11]8 weeks: [4, 4, 4, 4, 3, 3, 3, 3] total 2812 weeks: [3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2] total 2816 weeks: [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1] total 2820 weeks: [2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] total 28week 1 starts 2026-10-12, week 12 starts 2026-12-28[0, 0, 0]

The even spread is only a starting draft. Real plans are uneven: our 12-week plan puts four articles in week 1 (they are short), and one in week 5 (a review week). Take the draft, and then move articles around according to difficulty.

The error log

#

Keep one file or notebook with an entry for every mistake or confusion. It is the most valuable page you will own. A useful format:

Date

Problem or topic

What went wrong

The rule I learned

Review dates

12 Oct

Binary search

Infinite loop

In the closed form, use mid + 1 and mid - 1

13, 15, 19, 26 Oct, 11 Nov

14 Oct

Two sum with a map

Paired an element with itself

Look up before you store

15, 17, 21, 28 Oct, 13 Nov

Re-read it every Friday. Over weeks it becomes a personalised guide to the mistakes you actually make.

The pattern notebook

#

For each pattern (two pointers, sliding window, BFS, DP state), keep a card with: when it applies (signals in the problem), the template, a worked example, the edge cases, and a counterexample or trap. Write it in your own words. Writing it is the revision.

Timed sessions

#

From week 6, add one timed problem a week:

  • Set a timer for 45 minutes (shorter for easy problems).
  • Use a plain editor or paper, with no autocomplete and no looking at solutions.
  • Work through the workflow from article 25: clarify, example, brute force, optimise, code, test.
  • At the end, score yourself with the self-review checklist. Did you test? Did you state the complexity?
  • Whether or not you finish, spend 15 minutes comparing your approach with the solution, and write the lesson in your error log.

Timed practice builds a skill that untimed practice cannot: thinking clearly while the clock is running.

Mock interviews

#

Start in week 8, and do one a week in weeks 10 to 12.

  • Find a partner: a classmate, a colleague, or someone from an online community of learners. Take turns being the interviewer. Being the interviewer teaches you a lot.
  • Or mock alone: read a problem, set a timer, and talk out loud as if someone were listening. Record yourself if you can bear it. You will notice filler words and long silences.
  • Use a simple feedback form: Did I clarify first? Did I state a brute force? Was my code readable? Did I test? Was my complexity statement right? What one thing will I change next time?
  • Treat each mock as information, not a verdict.

Lighter and more intensive versions

#

Lighter: 16 weeks, about 5 to 6 hours a week

#

Good for a heavy college semester or a demanding job. Use the same weekly rhythm but with fewer sessions (for example, Tuesday, Thursday, Saturday, and a short Sunday review).

Weeks

Articles

1

1, 2, 3

2

4, 5

3

6, 7

4

8, 9

5

10, 11

6

12, 13

7

14, 15

8

16, 17

9

18, 19

10

20, 21

11

22

12

23, 24

13

25, plus review

14

26 (the project)

15

Mock interviews and timed sets

16

28, a final review, and the pattern summary

Intensive: 8 weeks, about 15 to 18 hours a week

#

Only if you have the time, for example in a semester break. Compress the plan, and protect the revision and mocks more than the new material.

Week

Articles

1

1 to 6 (skim 3 if you know Java)

2

7 to 10

3

11 to 13

4

14 to 18

5

19, 20

6

21, 22, 23, 24 (24 is optional depth)

7

25, 26, timed sets, two mock interviews

8

28, mixed timed practice, three mock interviews, final review

Do not go faster than your retention allows. Reading eight articles in a week and remembering none of them is worse than reading four.

What to cut when time is short

#

If you cannot cover everything, protect the core in this order:

Tier

Topics

Articles

1. Core: do not skip

Complexity, arrays, strings, hashing, linked lists, stacks and queues, recursion, trees, sorting and searching, two pointers, sliding window, the interview workflow

4 to 11, 13 to 15, 25

2. Common: do next

Heaps, graphs (BFS, DFS), dynamic programming basics, greedy and intervals, prefix sums

12, 16, 17, 19, 21, 22

3. Useful: if time allows

Shortest paths and topological sort, DSU, bit manipulation and maths

18, 20, 24 (DSU part)

4. Optional depth

Tries, Fenwick and segment trees

23, 24 (tree parts)

If you only have four weeks, do tier 1, practise out loud, and add a little of tier 2.

How to track progress

#

At the end of each module, answer these without looking:

  • After week 4: Can I write an O(n) solution for a simple array problem, trace a linked list reversal, and say when to use a stack or a map?
  • After week 8: Can I recognise two pointers, sliding window, prefix sums and greedy from a problem statement?
  • After week 10: Can I model a graph problem, and write the six DP steps?
  • After week 12: Can I run the full interview workflow on a new problem, in about 40 minutes, out loud?

A simple tracker is a table with the topic, date learned, number of problems, confidence from 1 to 5, and next review. Update it each Sunday.

Complexity of the schedule helpers

#

The helper functions are tiny. reviewDates is O(1) (five dates), weeklyLoad is O(weeks), and mondayOfWeek is O(7) at most for the initial search. The more important lesson is in weeklyLoad: using totalItems / weeks alone would lose the remainder, and the exercise below asks you to find that bug. Whenever you divide, ask what happens to the remainder.

Common mistakes when following a study plan

#
  • Starting too hard. A plan you can follow at 70% is better than one you abandon in week 3.
  • Collecting resources instead of working. One course (this one), one language, one set of notes.
  • Skipping revision because new topics feel more productive.
  • Never practising under time pressure, then freezing in the real thing.
  • Doubling up to catch up. It creates overload. Drop optional items instead.
  • Comparing your week 3 with someone else's week 12. Compare yourself with last month's you.
  • Ignoring the error log. The mistakes you repeat are the ones to fix first.
  • Practising only the topics you enjoy. Make a rule that every week includes one thing you find uncomfortable.
  • Treating the plan as a promise. It is a scaffold. Adjust it after each review.
  • Neglecting health. Sleep, food and movement are part of preparation. A tired brain solves problems badly.

Exercises

#

Exercise 1

Trace

#

You study "sliding window" on Monday 12 October 2026. On which dates should you review it, using the 1, 3, 7, 14 and 30-day gaps? What day of the week is each?

Exercise 2: Design your own schedule

#

You have 6 hours a week and 20 weeks. Using the course structure, decide how many articles per week you will do, which articles you will skip or skim, and when you will start timed sessions and mock interviews.

Exercise 3: Distribute the work

#

Write a method weeklyLoad(int totalItems, int weeks) that spreads items across weeks as evenly as possible, with no item lost. Test it with 28 articles over 12 and over 16 weeks.

Exercise 4: Debug

#

This method is supposed to spread 28 articles over 12 weeks, but the schedule only covers 24. Find the bug and fix it.

Java
static int[] weeklyLoadBuggy(int totalItems, int weeks) {    int[] load = new int[weeks];    for (int w = 0; w < weeks; w++) {        load[w] = totalItems / weeks;    }    return load;}

Exercise 5: Interview-style, a 10-day plan

#

You have an online assessment in 10 days and about 2 hours a day. You have already read the first four articles. Which topics do you prioritise, and what does a typical day look like?

Show solutionHide solution

The review dates are 1, 3, 7, 14 and 30 days after 12 October 2026.

Gap

Date

Day

+1

13 October 2026

Tuesday

+3

15 October 2026

Thursday

+7

19 October 2026

Monday

+14

26 October 2026

Monday

+30

11 November 2026

Wednesday

Putting these in a calendar immediately after studying, with a reminder, is what turns the schedule into a habit.

Java
// File: Main.javaimport java.time.LocalDate;public class Main {    public static void main(String[] args) {        LocalDate studied = LocalDate.of(2026, 10, 12);        int[] gaps = {1, 3, 7, 14, 30};        for (int gap : gaps) {            LocalDate date = studied.plusDays(gap);            System.out.println("+" + gap + ": " + date + " " + date.getDayOfWeek());        }    }}
Code
+1: 2026-10-13 TUESDAY+3: 2026-10-15 THURSDAY+7: 2026-10-19 MONDAY+14: 2026-10-26 MONDAY+30: 2026-11-11 WEDNESDAY

Exercise 2

Show solutionHide solution

There is no single right answer. Here is a sensible one, with the reasoning.

Budget. 6 hours a week for 20 weeks is 120 hours. The 12-week standard plan needs roughly 110 hours (about 9 hours a week), so this is similar in total, spread over more weeks. That works.

Pace. 28 articles over 20 weeks is about 1.4 per week. Since 2 of the 28 are this plan and the placement guide, you have 26 learning articles. Aim for one new article most weeks, and two in lighter weeks.

Skim or skip. Skim article 3 if you already know Java. Treat the Fenwick and segment trees in article 24, and the whole of tries (article 23) as optional. Skim the bit-manipulation depth in article 18, but keep n & (n - 1) and XOR.

Weekly shape at 6 hours. Three 1.5-hour sessions (learn, implement, practise) plus one 1.5-hour session split between revision and the error log. Drop the separate Saturday timed block until week 8.

Milestones.

Weeks

Focus

1 to 3

Articles 1 to 6

4 to 8

Articles 7 to 13 (one a week)

9 to 12

Articles 14 to 18, with timed sessions starting in week 9

13 to 16

Articles 19 to 22 (graphs and DP, one a week)

17

Article 24 (DSU part), article 25

18 to 19

The project, plus mock interviews starting in week 17

20

Article 28, final revision

The principle: keep the order, lengthen the time, and keep revision and mocks. Do not drop those two to save time.

Exercise 3

Show solutionHide solution

Divide with / to get the base amount, and use % for the remainder, which is the number of weeks that get one extra item. Give the extra to the first remainder weeks. The loads then add up to exactly totalItems.

Java
// File: Main.javaimport java.util.Arrays;public class Main {    static int[] weeklyLoad(int totalItems, int weeks) {        if (weeks <= 0) {            throw new IllegalArgumentException("weeks must be positive");        }        int[] load = new int[weeks];        int base = totalItems / weeks;        int extra = totalItems % weeks;        for (int w = 0; w < weeks; w++) {            load[w] = base + (w < extra ? 1 : 0);        }        return load;    }    static int sum(int[] values) {        int total = 0;        for (int v : values) {            total += v;        }        return total;    }    public static void main(String[] args) {        int[] twelve = weeklyLoad(28, 12);        int[] sixteen = weeklyLoad(28, 16);        System.out.println(Arrays.toString(twelve) + " " + sum(twelve));        System.out.println(Arrays.toString(sixteen) + " " + sum(sixteen));        System.out.println(Arrays.toString(weeklyLoad(5, 8)) + " " + sum(weeklyLoad(5, 8)));    }}
Code
[3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2] 28[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1] 28[1, 1, 1, 1, 1, 0, 0, 0] 5

For 28 articles over 12 weeks, 28 / 12 = 2 with remainder 4, so four weeks get 3 articles and eight weeks get 2. For 5 articles over 8 weeks, the base is 0 and the first five weeks get 1 each.

Exercise 4

Show solutionHide solution

The bug is integer division throws away the remainder. 28 / 12 is 2, so every week gets 2 articles and the total is only 24. Four articles disappear. The fix is to also compute totalItems % weeks and give one extra item to that many weeks.

Java
// File: Main.javaimport java.util.Arrays;public class Main {    static int[] weeklyLoadBuggy(int totalItems, int weeks) {        int[] load = new int[weeks];        for (int w = 0; w < weeks; w++) {            load[w] = totalItems / weeks;        }        return load;    }    static int[] weeklyLoadFixed(int totalItems, int weeks) {        int[] load = new int[weeks];        int extra = totalItems % weeks;        for (int w = 0; w < weeks; w++) {            load[w] = totalItems / weeks + (w < extra ? 1 : 0);        }        return load;    }    public static void main(String[] args) {        int buggyTotal = Arrays.stream(weeklyLoadBuggy(28, 12)).sum();        int fixedTotal = Arrays.stream(weeklyLoadFixed(28, 12)).sum();        System.out.println("buggy covers " + buggyTotal + " articles, fixed covers " + fixedTotal);    }}
Code
buggy covers 24 articles, fixed covers 28

A good habit: after writing code that splits something into parts, check that the parts add back up to the whole.

Exercise 5

Show solutionHide solution

Be honest about what ten days can do. You cannot learn everything, so you prioritise the topics that assessments most commonly use, and practise them under time pressure. (Assessment formats vary, so check yours if you can: the number of questions, the time, whether partial marks exist, and which languages are allowed.)

Priorities, in order.

  1. Arrays and strings (articles 5, 6): the most common ground. Frequency counting, two pointers, simple in-place changes.
  2. Hashing (article 9): pair sum, counting, duplicates.
  3. Sorting and binary search (article 13), and two pointers and sliding window (articles 14, 15).
  4. Recursion and basic trees (articles 10, 11), and stacks and queues (article 8).
  5. Basic graphs (BFS/DFS) and simple DP (articles 19, 21, 22), only if there is time left.
  6. Input and output handling in your language: reading input quickly and printing correctly, which costs people marks for no good reason (see article 28).

A typical day (2 hours).

Time

Activity

15 min

Revise yesterday's error log entries

40 min

Learn or review one topic: read the key section and type one example

50 min

Two timed problems of that topic, 25 minutes each, with a plain editor

15 min

Compare with solutions, and add to the error log

Days 1 to 7: one topic per day from the list above (two for the shorter ones). Days 8 and 9: mixed timed sets of 3 problems. Day 10: a light revision of your error log, rest, and a check of your setup (language, input handling, test environment).

The principle is breadth on the core, practice under a clock, and protect your sleep before the test. Do not spend the last two days on a brand-new advanced topic.

Where to go next

#

Connected lessons

  • Guide · Career

    The OA Landscape: Platforms, Formats, Proctoring and Rules

  • Guide · Career

    What Technical Rounds Look Like and How to Solve Out Loud

  • Guide · Career

    A LinkedIn Profile That Gets Recruiter Messages