Staircase

As an example, when the input is 6, should print this:

     #
    ##
   ###
  ####
 #####
######

JavaScript

Solution 1

/**
 * Prints an ascii-art of a stair case of `n` steps.
 *
 * - T.C: O(n²).
 * - S.C: O(n).
 *
 * @param {number} n The number of steps to print.
 * @sig Number -> Void
 */
function staircase(n) {
  for (var i = 1; i <= n; ++i) {
    var row = new Array(n).fill(' ').fill('#', n - i).join('');
    console.log(row);
  }
}

Time complexity \(O(n²)\) because we use fill() and join() inside each iteration of the loop. Those array methods are loops themselves.

Solution 2

/**
 * Prints an ascii-art of a stair case of `n` steps.
 *
 * - T.C: O(n²)
 * - S.C: O(n).
 * 
 * @param {number} n The number of steps to print.
 * @sig Number -> Void
 */
 function staircase(n) {
  let r = 1;

  while (r <= n) {
    let blanks = [...Array(n - r)].map(i => ' ');
    let hashes = [...Array(n - (n - r++))].map(i => '#');
    console.log([...blanks, ...hashes].join(''));
  }
}

Spreads are loops too, as are maps and joins. Time complexity \(O(n²)\) because in the end there are nested loops with this approach too.