🐈

JS/TS marathon interview

2024/02/12に公開

[advanced 2]

1. validate if given string is palondrome (ignoring whitespace and puctuation)

function isPalindrome(str: string){
const cleanedStr = str.replace(/[^\w]/g,"")
console.log(cleanedStr)
const reversedStr = cleanedStr.split("").reverse().join("")
console.log(reversedStr)
if (cleanedStr === reversedStr){
  console.log("given string "+str+" is palindrome")
}
}
isPalindrome("abb... a")

// abba
// abba
// given string abb... a is palindrome

[basic 2]

9. reverse words without using built-in method

const outcome = [];
const sentence = 'I am fine.';

for (let i = sentence.split(' ').length - 1; 0 <= i; i--) {
  outcome.push(sentence.split(' ')[i]);
}
// ["fine.", "am", "I"]
console.log(outcome);

8. sort array in ascending order

const arr = [8,7,6,5,4,3,2,1]
// [1,2,3,4,5,6,7,8]
console.log(arr.sort((a,b)=>a-b))

7. remove duplicated elemements from an array

const arr = [1,2,3,3,4]
const outcome = Array.from(new Set(arr) )
// [1,2,3,4]
console.log(outcome)

6. sum up all numbers in an array

function sumAllArray(arr: number[]) {
  return arr.reduce((a: number, c: number) => a + c);
}
// 6
console.log(sumAllArray([1, 2, 3]));

5. check if given number is a prime number

function isPrime(num:number):boolean{
  if (num ===1){
    return false
  }
if (num === 2){
  return true
}  
  for(let i=2;i<num;i++){
if (num%i === 0){
  return false}
  return true
}}
//true
console.log(isPrime(3))

4. calculate factorial of given number

function factorial(num: number): number {
  if (num === 1 || num === 0) {
    return 1;
  }
  return num * (factorial(num - 1));
}
//120
console.log(factorial(5))

3. create a new array that contains no duplicated element

function uniqueArray(array: number[]){
  const outcome = [...new Set(array)]
console.log(outcome)
}
// (6) [1, 2, 3, 4, 5, 6]
uniqueArray([1,2,3,4,5,5,5,6,6])
// Mapを使ったオブジェクトの重複排除
const originalArray = [
  { id: '11', num: 1 },
  { id: '22', num: 2 },
  { id: '11', num: 3 },
  { id: '22', num: 4 },
  { id: '33', num: 5 },
];
 
const outcomeArray = [...new Map(originalArray.map((el) => [el.id, el])).values()];
 
console.log(outcomeArray)

2. find the largest and smallest number in array

const arr = [1,2,3,4,5]
console.log(arr.sort((a, b) => b-a)[0] + " is Max")
console.log(arr.sort((a, b) => a-b)[0] + " is Min")
// 5 is Max
// 1 is Min

1. reverse a string without using the built-in reverse() method

const outcome =[]
const str = "ikemen"
// 最後の文字を最初の文字に入れ替える、まずは6番目の文字nからはじめ、6,5,4,3,2,1と降順で繰り返し、0に達したら止める。
  for (let i = str.length; 0 <= i; i--) {
  outcome.push(str[i])
}
// nemeki
console.log(outcome.join(""));

[advanced]

9. check if given strings are anagram

function isAnagrams(str:string, str2:string):boolean{
 //aaabb
//aaabb
 console.log(str.toLowerCase().split("").sort().join(""))
 console.log(str2.toLowerCase().split("").sort().join(""))
return str.toLowerCase().split("").sort().join("")===str2.toLowerCase().split("").sort().join("")

}
//true
console.log(isAnagrams("babaa","ababa"))

8. flatten nested arrays into a single array

const flattenArray = (nestedArray:  [number,number,number,number, number[]]): {} => {
  return nestedArray.flat(Infinity);
};
//(6) [1, 2, 3, 3, 4, 5]
console.log(flattenArray([1,2,3,3,[4,5]]))

7. LinkedList

FYI: https://www.ryokatsu.dev/blog/2021/0701/

6. T/F if the given string is palindrome

function isPalindrome(str: string) {
  //与えられた文字列を小文字化する
  const cleanStr = str.replace(/\W/g,"").toLowerCase();
  const reversedStr = cleanStr.split("").reverse().join("");
    console.log(reversedStr)
  console.log(cleanStr)
      console.log(cleanStr === reversedStr);

}
// abba
// abba
// true
isPalindrome("Abba")

5. merge two arrays into a single array

const arr1: number[] = [1, 2, 3];
const arr2: number[] = [4, 5, 6];
const combined: number[] = [];
combined.push(...arr1, ...arr2);
const combined2: number[] = combined.sort((a, b) => b - a);
// (6) [6, 5, 4, 3, 2, 1]
console.log(combined2);

4. calculate the factorial of a given number

function factorial(n: number) {
  if (n === 0 || n === 1) {
    return 1;
  } else {
    return n * factorial(n - 1);
  }
}
const outcome = factorial(3)
// 3*2*1=6
console.log(outcome)

3. imprement a deep clone function

var homes = [
    {
        "h_id": "3",
        "city": "Dallas",
        "state": "TX",
        "zip": "75201",
        "price": "162500"
    }, {
        "h_id": "4",
        "city": "Bevery Hills",
        "state": "CA",
        "zip": "90210",
        "price": "319250"
    }, {
        "h_id": "5",
        "city": "New York",
        "state": "NY",
        "zip": "00010",
        "price": "962500"
    }
];
deepClone(homes)
function deepClone(obj:{} = {}) {
  const outcome = JSON.parse(JSON.stringify(obj));
  console.log(outcome)
}
// ↑ ディープコピーの場合は、オブジェクトとメモリ上のデータの両方をコピーするため、独立したオブジェクトを作ることができます。この方法は(Dateオブジェクトや関数、undefinedなどが入ってる場合)破壊的コピーをするのでおすすめできない
// わかりやすい説明:
// https://zenn.dev/luvmini511/articles/722cb85067d4e9

2. sort array order by dscending order based on a key

var homes = [
    {
        "h_id": "3",
        "city": "Dallas",
        "state": "TX",
        "zip": "75201",
        "price": "162500"
    }, {
        "h_id": "4",
        "city": "Bevery Hills",
        "state": "CA",
        "zip": "90210",
        "price": "319250"
    }, {
        "h_id": "5",
        "city": "New York",
        "state": "NY",
        "zip": "00010",
        "price": "962500"
    }
];
const outcome = homes.sort((a, b) => parseFloat(b.price) - parseFloat(a.price));
console.log(outcome)
// ニューヨーク、ビバリーヒルズ、ダラスの順番に並び替わる

1. demonstrate debounce and throttle

// 負荷軽減のため、イベントの呼び出しは指定した時間が経過した際に発生するようthrottleやdebounceを使用して処理することがある。
// 一般的にはlodashのthrottleやdebounceが使用されることが多い。
// throttle
// 繰り返し大量に発生する処理を一定間隔で間引くもの。
// よく使う例として、スクロールのイベントがあります。

// debounce
// 繰り返し大量に発生する処理が終わった時に最後の1回だけ実行するもの。
// よく使う例として、ウィンドウのリサイズイベントがあります。

// debounceとthrottleローダッシュを使って
var hello = _.debounce(insertHello, 1000)
window.addEventListener('scroll', hello)

var hello = _.throttle(insertHello, 1000)
window.addEventListener('scroll', hello)

[basic]

10. convert a string to title case (capitalize the first letter of each word)

// string is "hi there chris"
// convert it into array ["hi", "there", "chris"]
// capitalize every word into array ["Hi","There","Chris"]
// join altogether with a space "Hi There Chris"

const str:string="hi there chris"
const outcome = []
outcome.push(str.split(" "))
const outcome2= []
for (let word of str.split(" "))
{outcome2.push(word[0].toUpperCase()+word.slice(1))}
console.log(outcome2.join(" "))
 

 function toTitleCase(str: string) {
  //正規表現を使い「単語の最初の\w」「すべての英数字\b」をアローファンクションで大文字に変換する)
  return str.replace(/\b\w/g, theFirstLetter => theFirstLetter.toUpperCase());
}
console.log(toTitleCase("hi there chris"))

9. Fibonacci with memoization

 function memoize(fn) {
  const cache = {};
  console.log(cache)
  return function (...args) {
 
    if (cache[args]) {
 
      return cache[args];
    }
    const result = fn.apply(this, args);
 
    cache[args] = result;
 
    return result;
  };
}
// slowFibでnのフィボナッチ数を求めることができるがパフォーマンスが遅くなる
// exponential runtime:  f(n) = n^2
function slowFib(n) {
  if (n < 2) {
    return n;
  }
  return fib(n - 1) + fib(n - 2);
}

const fib = memoize(slowFib);

console.log("Fibonacci of 11 is "+slowFib(11))
// 👇console.log(cache)
// 0: 0
// 1: 1
// 2: 1
// 3: 2
// 4: 3
// 5: 5
// 6: 8
// 7: 13
// 8: 21
// 9: 34
// 10: 55
// Fibonacci of 11 is 89

8. find the largest number in nested array

const arr = [[12,45,75], [54,485,2],[23,4,78,2804]];
// 2804
console.log(
arr.flat().sort(
  (a,b)=>
  b-a
)[0]
)

what does "splice()" do?

let array: string[] = ["Doraemon","Shizuka","Nobita","Giant","Suneo"]
// インデックス#1から#3「静香」「のび太」「ジャイアン」と「挿入」をトルカエする
console.log(array.splice(1,3,"挿入"))
// (3) ["Doraemon", "挿入", "Suneo"]
console.log(array)

7. validate if n is prime number

function isPrime(n: number){
if (n === 1) {return true}
if (n === 2) {return false}
for (let i = 2;i<n;i++)
{
  if (n%i ===0)
return false
}
}
// 素数の条件:1とn自身で割り切れる(nがn以外の数字で割り切れる=素数でない)
// 1は素数ではない、2は素数である、これ暗記
// 1〜100までの素数一覧表を紹介!全部で25個 👉 https://terakoya.ameba.jp/a000001446/

6. calculate the factorial of a given number

function factorial(n: number) {
  if (n === 0 || n === 1) {
    return 1;
  } else {
    return n * factorial(n - 1);
  }
}
const outcome = factorial(9)
console.log(outcome)
//  9! = 1*2*3*4*5*6*7*8*9 = 362880
// 正の整数 n に対して, 1 から n までの整数を全てかけあわせたものを n の階乗(かいじょう,英語ではファクトリアルfactorial)と言い,  n! で表す

5. filter only even numbers in array

function filterEvenNumbers(numbers: number[]) {
  //余り0のエレメントだけ抽出する
  return numbers.filter((num: number) => num % 2 === 0);
}
console.log(filterEvenNumbers([1,2,3,4,5,6]))
//他の解答
mixedArr = [1,2,3,4,5,6,7,8,9,10]
const evenArr = []
for (i of mixedArr){

  if (mixedArr[i]%2 == 0)
{
evenArr.push(mixedArr[i])}
}
console.log(evenArr)

4. reverse a given string

let str: string = "Doraemon"
const reverseString = (str: string) => str.split("").reverse().join("");
console.log(reverseString(str))
// nomearoD

3. check if given string is palindrome

let str: string = "ABBA"
let str2: string = "Doraemon"
const splittedStr: string[] =[]
const splittedStr2: string[] =[] 
const reversedStr = str.split("").reverse().join("")
const reversedStr2 = str2.split("").reverse().join("")
console.log(reversedStr)
console.log(reversedStr2)
console.log(str === reversedStr)
console.log(str === reversedStr2)
// ABBA
// nomearoD
// true
// false

2. find a max number of array

const arr = [299,199,499,39]
const sortedDesc = arr.sort((a,b)=>b-a)
console.log(sortedDesc[0])
// 499

1. sum of two numbers

const sumOfTwo =(a: number,b: number): number=>{
  return a+b
}
 console.log(sumOfTwo(2,3))
// 5

Discussion