# Welcome

Welcome to the course!

# Welcome

### Goals

This course focuses on teaching problem-solving strategies geared towards helping you expertly answer many software engineering interview questions.

Almost all of these problems are variations on questions I have been asked or that others I know have been asked in interviews. They’ve been curated in a way that will allow us to go over several problem-solving strategies.

### The Problems

Every problem comes with a solution and a detailed description of the strategy employed. Most come with two or three different solutions with each discussed in detail compared to the others.

Typically we’ll start with a brute-force algorithm that solves the problem. We’ll then refine it until we can optimize time complexity, space complexity, or both.

We’ll calculate and discuss time and space complexity for every single solution as well.

### What You’ll Get

By the end of the course, you’ll have mastered several algorithmic strategies that can be applied to a wide range of problems. Our discussions will teach you how to approach different types of problems, allowing you to start in the right direction and find the answer during actual interviews.

We’ll teach ways to critically analyze the algorithms we come up with and find ways to make them more efficient. We’ll fine-tune algorithms to reduce the amount of time they take or the space they need. This is exactly what an interviewer is looking for.

# Format

The format of each problem is similar. We start by describing the problem and constraints, giving examples when needed. Some problems include hints to get you started.

There is then an empty solution box for you to try solving it yourself. It’ll look something like this. Complete the function and hit the Test button.

function add(a, b) {    // Your code here}

The difference is that we’ll leave the function blank. It’ll have tests lined up and ready to go to make sure your function works as expected.

After the blank workspace, we’ll dive into solutions. We’ll start with a brute-force solution and discuss how it works and how efficient it is. If better solutions exist, we work on them after.

### Expectations

• You should have a basic working knowledge of JavaScript and the ability to write meaningful code with it.

• You should be familiar with basic ES2015 concepts such as let and const declarations, arrow functions, and classes.

• You should have some idea of what the terms time complexity and space complexity mean. As long as you’re aware of what they are, you’ll do fine, as we walk through finding them for every problem.

For an understanding of time and space complexity, feel free to look at the following pages: