1) Find the missing number in the array

Input: [1.2.3.4.6.7.8.9.10]
Output: 5
Copy the code
const find_missing = function(input) {
  let n = input.length + 1;

  let sum = 0;
  for (let i in input) {
    sum += input[i];
  }

  return Math.floor((n * (n + 1)) / 2) - sum;
};
Copy the code

Hint: Arithmetic series and formula:

2) Invert integers

Input: num = 123
Output: 321
Input: num = -123
Output: -321
Copy the code
const reverse = function(num) {
    let result = 0;
    while(num ! = =0) {
      result = result * 10 + num % 10;
      // the math.trunc () method strips out the decimal part of a number, leaving only the integer part
      num = Math.trunc(num / 10);
    }

    if (result > 2**31 || result < -(2**31)) return 0;
    return result;
};
Copy the code

3) Array arrangement

Input: [1.2.3]
Output: [[1.2.3], [1.3.2], [2.1.3], [2.3.1], [3.1.2], [3.2.1]]
Copy the code
const permute = function(nums) {
    let results = [];

    let go = (current) = > {
      if (current.length === nums.length){
        results.push(current);
        return;
      }
      nums.forEach(n= > {
        if (!current.includes(n)){
          go([...current, n]);
        }
      });
    }
    go([]);
    return results;
};
Copy the code

4) Permutations in strings

Input: s1 = "ab", s2 = "eidbao"
Output: true
Input: s1 = "aa", s2 = "eidbao"
Output: false
Copy the code
const checkPermutation = function(s1, s2) {
  const len1 = s1.length, len2 = s2.length;
  if (len1 > len2) return false;

  const count = Array(26).fill(0);
  for (let i = 0; i < len1; i++) {
      count[s1.charCodeAt(i)-97] + +; count[s2.charCodeAt(i)-97]--;
  }
  if(! count.some(e= >e ! = =0)) return true;

  for (let i = len1; i < len2; i++) {
      count[s2.charCodeAt(i)-97]--;
      count[s2.charCodeAt(i-len1)-97] + +;if(! count.some(e= >e ! = =0)) return true;
  }
  return false;
};
Copy the code

5) Longest valid parentheses

Input: "()"
Output: 2
Input: ") () ())"
Output: 4
Copy the code
const longestValidParentheses = function(S) {
  let stack = [-1], ans = 0;
  for (let i = 0; i < S.length; i++)
    if (S[i] === '(') stack.push(i)
    else if (stack.length === 1) stack[0] = i
    else stack.pop(), ans = Math.max(ans, i - stack[stack.length-1])
  return ans
};
Copy the code

6) 4Sum

const fourSum = function(nums, target) {
  let result = [];
  let length = nums.length;
  if (length < 4) return result; 
  nums = nums.sort((a, b) = > a - b );

  for (let i = 0; i < length - 3; i++) {
    if (nums[i] === nums[i - 1]) continue;
    for (let j = i + 1; j < length - 2; j++) {
      if (j > i + 1 && nums[j] === nums[j - 1]) continue;

      let k = j + 1;
      let l = length - 1;

      while (k < l) {
        const sum = nums[i] + nums[j] + nums[k] + nums[l];

        if (sum === target) {
          result.push([nums[i], nums[j], nums[k], nums[l]])
        }

        if (sum <= target) {
          k += 1;
          while (nums[k] === nums[k - 1]) {
            k += 1; }}if (sum >= target) {
          l -= 1;
          while (nums[l] === nums[l + 1]) {
            l -= 1;
          }
        }
      }
    }
  }

  return result;
};
Copy the code

7) String multiplication

Input: num1 = "2", num2 = "3"
Output: "6"
Copy the code
const multiply = function(num1, num2) {
    if (num1 == 0 || num2 == 0) return '0';
    const result = [];

    for (let a = num1.length - 1; a >= 0; a--) {
        for (let b = num2.length - 1; b >= 0; b--) {
            const p1 = a + b;
            const p2 = a + b + 1;
            const sum = (result[p2] ?? 0) + num1[a] * num2[b];

            result[p1] = (result[p1] ?? 0) + Math.floor(sum / 10);
            result[p2] = sum % 10;
        }
    }
    result[0] = =0 && result.shift();
    return result.join(' ');
};
Copy the code

8) The shortest palindrome

Input: s = "aacecaaa"
Output: "aaacecaaa"
Input: s = "abcd"
Output: "dcbabcd"
Copy the code
const shortestPalindrome = function(s) {
  let index = 0;
  for (let i = s.length - 1; i >= 0; i--) {
    if (s[i] === s[index]) index++;
  }
  if (index === s.length) return s;
  let remainingRev = s.substring(index, s.length);
  console.log(remainingRev);
  remainingRev = reverse(remainingRev);

  return remainingRev + shortestPalindrome(s.substring(0, index)) + s.substring(index);
};

function reverse(string) {
  let myString = ' ';
  for (let i = string.length - 1; i >= 0; i--) {
    myString = myString + string[i];
  }
  return myString;
};
Copy the code

9) Round numbers to English words

Input: num = 123
Output: "One Hundred Twenty Three"
Input: num = 1234567
Output: "One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven"
Copy the code
const numberToWords = function(num) {
  let result = toHundreds(num % 1000);
  const bigNumbers = ["Thousand"."Million"."Billion"];
  for (let i = 0; i < 3; ++i) {
    num = Math.trunc(num / 1000);
    result = num % 1000! = =0 ? [toHundreds(num % 1000), bigNumbers[i], result].filter(Boolean).join("") : result;
  }
  return result.length === 0 ? "Zero" : result;
}

function toHundreds(num) {
  const numbers = [""."One"."Two"."Three"."Four"."Five"."Six"."Seven"."Eight"."Nine"."Ten"."Eleven"."Twelve"."Thirteen"."Fourteen"."Fifteen"."Sixteen"."Seventeen"."Eighteen"."Nineteen"];
  const tens = ["".""."Twenty"."Thirty"."Forty"."Fifty"."Sixty"."Seventy"."Eighty"."Ninety"];
  const result = Array(3).fill("");
  let a = Math.trunc(num / 100), b = num % 100, c = num % 10;
  result[0] = a > 0 && `${numbers[a]} Hundred`;
  result[1] = b < 20 ? numbers[b] : tens[Math.trunc(b / 10)]
  result[2] = b >= 20 && `${numbers[c]}`;
  return result.filter(Boolean).join("");
}
Copy the code

10) Ransom note

Input: ransomNote = "aa", magazine = "ab"
Output: false
Input: ransomNote = "aa", magazine = "aab"
Output: true
Copy the code
const canConstruct = function(ransomNote, magazine) {
  if (ransomNote.length > magazine.length) return false;
  let magMap = new Map(a);for(let char of magazine) {
    magMap.set(char, (magMap.get(char) || 0 ) + 1);
  }

   for(let note of ransomNote) {
    let counter = magMap.get(note);
    if(! counter)return false;

    magMap.set(note, --counter);
   }
  return true;
};
Copy the code

After a bit of research, I came up with these 10 algorithms, each with a special technique that can not only improve our JavaScript skills, but also help us improve our critical thinking skills 🙂.

10 Algos 🚀 to Boost Your JavaScript Skills 🦄, dev. To /awedis/10-a…