Lesson 4
Traversing Arrays from the Center Using TypeScript
Introduction

Greetings! Welcome to our lesson today, where we'll unravel a fascinating aspect of array manipulation. Here's the question: How would you traverse an array, not from the beginning to the end, or vice versa, but from the center outward in either direction? Today's lesson delves into this concept using TypeScript, which enhances the coding experience with its powerful type system. Brace yourself for a captivating learning journey focused on both logic and type safety.

Task Statement

Our task is to produce a new array, given an array of integers, that starts from the center of the original array and alternates direction towards both ends. That is, the first element of our new array will be the middle element of the original one.

After defining the starting point, we will alternate between elements to the left and to the right of this center until all elements have been included. If the length of the initial array is even, we first take the element to the left of the center, then the one to the right of the center, and proceed with the alternation sequence.

For example, given numbers = [1, 2, 3, 4, 5], the process is as follows:

  • Identify the middle element: 3 is the middle element of the array.
  • Start the new array with 3.
  • Alternate outward: First take 2 (left of 3), then 4 (right of 3).
  • Continue alternating: Next take 1 (left of 2), then 5 (right of 4).

The output is [3, 2, 4, 1, 5].

We will break down this seemingly complex task into manageable pieces to progressively build our TypeScript solution. Keep in mind an additional condition: the length of the array — represented as n — can range from 1 to 100,000, inclusive.

Solution Building: Step 1

First, let's establish the midpoint of our array. Our task requires us to expand our array from the center to the ends, so we divide its length by 2 using integer division. TypeScript enables us to use type annotations for better understanding and error checking. If the array's length is odd, we include the middle element in the newOrder array, as it has no counterpart. If the array's length is even, newOrder initially remains empty.

Here's how it looks in TypeScript:

TypeScript
1function iterateMiddleToEnd(numbers: number[]): number[] { 2 const mid: number = Math.floor(numbers.length / 2); // index of the middle element 3 const newOrder: number[] = []; // Array to store new order 4 5 if (numbers.length % 2 === 1) { 6 newOrder.push(numbers[mid]); // Adding middle element to resulting array if length is odd 7 } 8 // newOrder remains empty for now if length is even 9 10 return newOrder; 11}
Solution Building: Step 2

Successfully solving our task requires two pointers: left and right. These pointers are initialized to point to the elements immediately to the left and right of the middle element, respectively. TypeScript's strict type checking enhances readability and safety by defining these as numbers.

Here is the TypeScript function with the initialization of these pointers:

TypeScript
1function iterateMiddleToEnd(numbers: number[]): number[] { 2 const mid: number = Math.floor(numbers.length / 2); // index of the middle element 3 let left: number; 4 let right: number; 5 const newOrder: number[] = []; // Array to store new order 6 7 if (numbers.length % 2 === 1) { 8 left = mid - 1; // Pointing to the left of the middle element 9 right = mid + 1; // Pointing to the right of the middle element 10 newOrder.push(numbers[mid]); // Adding the middle element to the resulting array 11 } else { 12 left = mid - 1; // Pointing to the left of the middle element 13 right = mid; // Pointing to the middle element 14 } 15 16 return newOrder; 17}
Solution Building: Step 3

With our pointers initialized, it's time to navigate the array and form our new order. TypeScript allows us to use the while loop to iterate from the center of the array to both ends. In each iteration, we push the elements at indices left and right to the newOrder array, decrement left by one, and increment right by one, ensuring type safety throughout.

Here's the complete TypeScript function:

TypeScript
1function iterateMiddleToEnd(numbers: number[]): number[] { 2 const mid: number = Math.floor(numbers.length / 2); // index of the middle element 3 let left: number; 4 let right: number; 5 const newOrder: number[] = []; // Array to store new order 6 7 if (numbers.length % 2 === 1) { 8 left = mid - 1; // Pointing to the left of the middle element 9 right = mid + 1; // Pointing to the right of the middle element 10 newOrder.push(numbers[mid]); // Adding the middle element to the resulting array 11 } else { 12 left = mid - 1; // Pointing to the left of the middle element 13 right = mid; // Pointing to the middle element 14 } 15 16 while (left >= 0 && right < numbers.length) { 17 newOrder.push(numbers[left--]); 18 newOrder.push(numbers[right++]); 19 } 20 21 return newOrder; 22} 23 24const numbers: number[] = [1, 2, 3, 4, 5]; 25const result: number[] = iterateMiddleToEnd(numbers); 26console.log(result); // Output should be [3, 2, 4, 1, 5]

Explanation for left-- and right++:

  • numbers[left--]: The expression first accesses the value at index left in the numbers array and then decrements left by 1. This ensures the current left element is pushed to newOrder before moving the pointer one step to the left.
  • numbers[right++]: Similarly, this expression first accesses the value at index right in the numbers array and then increments right by 1. This ensures the current right element is pushed to newOrder before moving the pointer one step to the right.

By implementing this approach, we have successfully created a new array that starts from the middle and alternates to the left and right ends of the original array, effectively fulfilling the requirements of our task!

Lesson Summary

Well done on reaching the end of this lesson! You've uncovered a riveting method of traversing and manipulating arrays using TypeScript. With TypeScript's type safety and clarity, you've built a more reliable and understandable solution. As the proverb goes, practice makes perfect. Hence, I encourage you to employ this concept in similar problems. Your exceptional journey in mastering algorithms with TypeScript has just begun. Embrace the challenge and happy coding!

Enjoy this lesson? Now it's time to practice with Cosmo!
Practice is how you turn knowledge into actual skills.