How to Reverse a String
Tags: javascript, computerscience, tutorial, beginners
Published: 2020-08-19 00:35:10

---
title: How to Reverse a String
published: true
description: Can you write a function that reverses an inputted string without using the built-in Array#reverse method?
tags: javascript, computerscience, tutorial, beginners
cover_image: https://storage.googleapis.com/algodailyrandomassets/curriculum/easy-strings/reverse-a-string-2.png
canonical_url: https://algodaily.com/challenges/reverse-a-string
---

The only way to get better at solving algorithms and data structures is to power through a few.

We covered the best ways to prepare [in this lesson](https://algodaily.com/lessons/how-to-use-algodaily-and-get-the-most-out-of-it), in [this one](https://algodaily.com/lessons/how-to-prepare-for-a-technical-interview), and [here](https://algodaily.com/lessons/how-to-get-better-at-coding-interviews). Be sure to visit those if you need some more guidance. Otherwise, let's jump into it.


### Reverse a String

Let's **reverse a string**!

<img src="https://storage.googleapis.com/algodailyrandomassets/curriculum/easy-strings/reverse-a-string.jpg" class="img-fluid" />

Can you write a function that reverses an inputted string without using the built-in <code>Array#reverse</code> method?

Let's look at some examples. So, calling:

`reverseString("jake")` should return `"ekaj"`.

`reverseString("reverseastring")` should return `"gnirtsaesrever"`.

<img src="https://storage.googleapis.com/algodailyrandomassets/curriculum/easy-strings/reverse-a-string-1.png" class="img-fluid" />


_This lesson was originally published at [https://algodaily.com](https://algodaily.com/challenges/reverse-a-string), where I maintain a technical interview course and write think-pieces for ambitious developers._

---



### True or False?



In Java, C#, JavaScript, Python and Go, strings are `immutable`. This means the string object's state can't be changed after creation.







**Solution:** True



---

{% youtube L3nxzt4i4Vo %}

### On Interviewer Mindset

Reversing a string is one of the most common technical interview questions that candidates get. Interviewers love it because it's deceptively simple. After all, as a software engineer, you'd probably call the `#reverse` method on your favorite `String` class and call it a day!

So don't overlook this one-- it appears a surprising amount as a warm-up or build-up question. Many interviewers will take the approach of using an easy question like this one, and actually judge much more harshly. You'll want to make you sure really nail this.

### How We'll Begin Solving

We want the **string reversed**, which means that we end up with all our letters positioned backwards. _If you need a quick review of `string`s, check out [our lesson on arrays and strings](https://algodaily.com/lessons/a-gentle-refresher-into-arrays-and-strings)._

We know that `string`s can be thought of as character arrays-- that is, each element in the array is a single character. And if we can assume that, then we know the location (array position) of each character, as well as the index when the `array` ends.

**There's a caveat to thinking of strings as character arrays-- it's not always true. As readers and viewers have pointed out, a string represents text formed from graphemes (the smallest functional unit of a writing system)-- formed by combining character sequences in unicode.**

Though strings and arrays contain similar methods like `length`, `concat`, and character position access-- _they are not identical_. As an example, arrays are mutable and strings usually are not. Before we can operate on the string as an array, we'll need to separate the units (in JS by calling the `.split()` method, or bypass this property by generating a brand new string instead of trying to operate on the original.

However, after the `split` operation, we can apply that paradigm to operating on this string. Thus we can step through each of its indices. Stepping through the beginning of the string, we'll make these observations at each point:

<img src="https://storage.googleapis.com/algodailyrandomassets/curriculum/easy-strings/reverse-a-string-2.png" class="img-fluid" />

```js
const str = "JAKE";
// position 0 - "J"
// position 1 - "A"
// ...
```

Since a reversed string is just itself backwards, **a brute force solution** could be to use the indices, and iterate from *the back to the front*.

See the code attached and try to run it using `Run Sample Code`. You'll see that we log out each character from the back of the string!



```javascript
function reverseString(str) {
  let newString = '';
	
	// start from end
  for (let i = str.length-1; i >= 0; i--) {
    console.log('Processing ', newString, str[i]);
		// append it to the string builder
    newString = newString + str[i];
  }

	// return the string
  return newString;
}

console.log(reverseString('test'));
```



### Fill In



We want to `console.log` out:

```js
5
4
3
2
1
```

What's the missing line here?

```js
var arr =  [1, 2, 3, 4, 5];

for (var i = ___________; i >= 0; i--) {
	console.log(arr[i]);
}
```







**Solution:** arr.length - 1



---



### Can We Do Better Than Brute Force?

However, it wouldn't really be an interesting algorithms question if there wasn't a better way. Let's see how we can optimize this, or make it run faster. When trying to make something more efficient, it helps to think of things to *cut or reduce*.

One thing to note is that we're going through the _entire_ string-- do we truly need to iterate through every single letter?

**Let's examine a worst case scenario.** What if the string is a million characters long? That would be a million operations to work through! Can we improve it?

### Yes, With More Pointers!

Well, we're only working with a single pointer right now. The iterator from our loop starts from the back, and appends each character to a new string, one by one. Having gone through [The Two Pointer Technique](https://algodaily.com/lessons/using-the-two-pointer-technique), we may recognize that some dramatic improvements can be had by increasing the number of pointers we use.

<img src="https://storage.googleapis.com/algodailyrandomassets/curriculum/arrays/two-pointer-1.svg" class="img-fluid" />

By this I mean, we can **cut the number of operations in half**. How? What if we did some **swapping** instead? By using a `while` loop and two pointers-- one on the left and one on the right.

With this in mind-- the big reveal is that, at each iteration, we can swap the letters at the pointer indices. After swapping, we would increment the `left` pointer while decrementing the `right` one. That could be hard to visualize, so let's see a basic example listed out.



```
jake    // starting string

eakj    // first pass
^  ^

ekaj    // second pass
 ^^
```



### Multiple Choice



What's a good use case for the two pointers technique?







<ul><li>Shifting indices to be greater at each iteration</li><li>Reducing a solution with a nested for-loop and O(n^2) complexity to O(n)</li><li>Finding pairs and duplicates in a for-loop</li><li>None of these</li></ul>



**Solution:** Reducing a solution with a nested for-loop and O(n^2) complexity to O(n)



---



With two pointers, we've cut the number of operations in half. It's much faster now! However, similar to the brute force, the time complexity is still `O(n)`.

<img src="https://storage.googleapis.com/algodailyrandomassets/curriculum/easy-strings/reverse-a-string-3.png" class="img-fluid" />

### Why Is This?

Well, if `n` is the length of the string, we'll end up making `n/2` swaps. But remember, [Big O Notation](https://algodaily.com/lessons/understanding-big-o-and-algorithmic-complexity) isn't about the raw number of operations required for an algorithm-- it's about _how the number scales with the input_.

So despite requiring half the number operations-- a `4`-character string would require `2` swaps with the two-pointer method. But an `8`-character string would require `4` swaps. The input doubled, and so did the number of operations.

### Final Solution

```js
function reverseString(str) {
  let strArr = str.split("");
  let start = 0;
  let end = str.length - 1;

  while (start <= end) {
    const temp = strArr[start];
    strArr[start] = strArr[end];
    strArr[end] = temp;
    start++;
    end--;
  }

  return strArr.join("");
}

```