5 Συνήθη προβλήματα συνέντευξης JavaScript: Ανάλυση και λύσεις

5 Συνήθη προβλήματα συνέντευξης JavaScript: Ανάλυση και λύσεις

Από τον μεταφραστή: δημοσίευσε ένα άρθρο για εσάς Maria Antonietta Perna, η οποία μιλά για τυπικές εργασίες JavaScript, που προσφέρεται συχνότερα σε αιτούντες-προγραμματιστές σε συνεντεύξεις. Το άρθρο θα είναι χρήσιμο, πρώτα απ 'όλα, σε αρχάριους προγραμματιστές.

Οι συνεντεύξεις σε εταιρείες τεχνολογίας ήταν εδώ και καιρό η συζήτηση. Αυτό δεν προκαλεί έκπληξη - η επιτυχής ολοκλήρωση της συνέντευξης καθιστά δυνατή την απόκτηση καλής δουλειάς. Αλλά αυτό δεν είναι τόσο εύκολο, γιατί συχνά είναι απαραίτητο να λυθούν σύνθετα προβλήματα.

Επιπλέον, τις περισσότερες φορές οι περισσότερες από αυτές τις εργασίες δεν σχετίζονται με την εργασία που θα εκτελέσει ο αιτών, αλλά πρέπει να επιλυθούν. Μερικές φορές πρέπει να το κάνετε στον πίνακα, χωρίς να το ελέγξετε με την Google ή οποιαδήποτε άλλη πηγή. Ναι, η κατάσταση αλλάζει σταδιακά και σε ορισμένες εταιρείες αρνούνται τέτοιες συνεντεύξεις, αλλά πολλοί εργοδότες εξακολουθούν να τηρούν αυτή την παράδοση. Αυτό το άρθρο είναι αφιερωμένο στην ανάλυση τυπικών εργασιών JavaScript που χρησιμοποιούνται συχνά ως εργασίες για τους αιτούντες.

Υπενθύμιση: για όλους τους αναγνώστες του "Habr" - έκπτωση 10 ρούβλια κατά την εγγραφή σε οποιοδήποτε μάθημα Skillbox χρησιμοποιώντας τον κωδικό προσφοράς "Habr".

Το Skillbox προτείνει: Πρακτικό μάθημα "Mobile Developer PRO".

Το κύριο πράγμα είναι να προετοιμαστείτε προσεκτικά για τη συνέντευξή σας.

Ναι, πριν αρχίσουμε να αναλύουμε τις εργασίες, ας δούμε μερικές γενικές συμβουλές για την προετοιμασία για μια συνέντευξη.

Το κύριο πράγμα είναι να προετοιμαστείτε εκ των προτέρων. Ελέγξτε πόσο καλά θυμάστε αλγόριθμους και δομές δεδομένων και βελτιώστε τις γνώσεις σας σε τομείς που δεν είστε πολύ εξοικειωμένοι. Υπάρχουν πολλές διαδικτυακές πλατφόρμες που θα σας βοηθήσουν να προετοιμαστείτε για συνεντεύξεις. συμβουλεύουμε geeksforgeeks, Πραμπ, Συνέντευξη .io и Κωδικός σήματος.

Αξίζει να μάθετε να προφέρετε την απόφαση δυνατά. Συνιστάται να πείτε στους αιτούντες τι κάνετε και όχι απλώς να γράφετε στον πίνακα (ή να πληκτρολογείτε τον κωδικό στον υπολογιστή, επίσης σιωπηλά). Έτσι, εάν κάνετε λάθος στον κώδικα, αλλά η λύση είναι γενικά σωστή, μπορείτε να αυξήσετε τις πιθανότητες επιτυχίας σας.

Το πρόβλημα πρέπει να κατανοηθεί πριν ξεκινήσει η λύση. Σε ορισμένες περιπτώσεις, μπορείτε να κατανοήσετε επιφανειακά την εργασία και στη συνέχεια να ακολουθήσετε λάθος μονοπάτι. Ίσως αξίζει να κάνετε μερικές διευκρινιστικές ερωτήσεις στον συνεντευκτή.

Πρέπει να εξασκηθείτε στη σύνταξη κώδικα με το χέρι, όχι σε υπολογιστή. Συμβαίνει ότι στις συνεντεύξεις δίνεται στον αιτούντα ένας δείκτης και ένας πίνακας όπου δεν υπάρχουν προτροπές ή αυτόματη μορφοποίηση. Όταν ψάχνετε για λύση, σημειώστε τον κωδικό σας σε ένα κομμάτι χαρτί ή απευθείας στον πίνακα. Αν κρατήσεις τα πάντα στο κεφάλι σου, μπορείς να ξεχάσεις κάτι σημαντικό.

Πρότυπο Εργασίες σε JavaScript

Πιθανότατα είστε ήδη εξοικειωμένοι με μερικές από αυτές τις εργασίες. Είτε πήρατε συνεντεύξεις όπου έπρεπε να λύσετε κάτι παρόμοιο, είτε εξασκηθήκατε σε αυτές ενώ μαθαίνατε JavaScript. Λοιπόν, τώρα ήρθε η ώρα να τα λύσουμε ξανά, και με μια λεπτομερή εξήγηση της διαδικασίας.

Παλίνδρομο

Ένα παλίνδρομο είναι μια λέξη, πρόταση ή ακολουθία χαρακτήρων που διαβάζεται ακριβώς με τον ίδιο τρόπο τόσο στη συνήθη κατεύθυνση όσο και στην αντίθετη κατεύθυνση. Για παράδειγμα, το «Άννα» είναι παλίνδρομο, αλλά το «τραπέζι» και ο «Γιάννης» δεν είναι.

Σταδιοποίηση

Δίνεται μια συμβολοσειρά? πρέπει να γράψετε μια συνάρτηση που σας επιτρέπει να επιστρέφετε true εάν η συμβολοσειρά είναι παλίνδρομο και false διαφορετικά. Σε αυτή την περίπτωση, πρέπει να λαμβάνονται υπόψη τα κενά και τα σημεία στίξης.

palindrome('racecar') === true
palindrome('πίνακας') === false

Ανάλυση της εργασίας

Η κύρια ιδέα εδώ είναι να γυρίσετε τη χορδή προς τα πίσω. Εάν η συμβολοσειρά "αντίστροφη" είναι εντελώς πανομοιότυπη με την αρχική, τότε έχουμε ένα παλίνδρομο και η συνάρτηση θα πρέπει να επιστρέψει true. Αν όχι, ψευδής.

Λύση

Εδώ είναι ο κώδικας που σας επιτρέπει να λύσετε το παλίνδρομο.

const palindrome = str => {
  // turn the string to lowercase
  str = str.toLowerCase()
  // reverse input string and return the result of the
  // comparisong
  return str === str.split('').reverse().join('')
}

Το πρώτο βήμα είναι να μετατρέψετε τους χαρακτήρες της συμβολοσειράς εισόδου σε πεζούς χαρακτήρες. Αυτό αποτελεί εγγύηση ότι το πρόγραμμα θα συγκρίνει ακριβώς τους ίδιους τους χαρακτήρες και όχι την υπόθεση ή κάτι άλλο.

Το δεύτερο βήμα είναι το αντίστροφο της γραμμής. Αυτό είναι εύκολο να γίνει: πρέπει να το μετατρέψετε σε πίνακα χρησιμοποιώντας τη μέθοδο .split() (Βιβλιοθήκη String). Στη συνέχεια αντιστρέφουμε τον πίνακα χρησιμοποιώντας .reverse() (Array library). Το τελευταίο βήμα είναι να μετατρέψετε τον αντίστροφο πίνακα σε συμβολοσειρά χρησιμοποιώντας .join() (βιβλιοθήκη πίνακα).

Τώρα το μόνο που χρειάζεται είναι να συγκρίνετε την "αντίστροφη" συμβολοσειρά με την αρχική, επιστρέφοντας το αποτέλεσμα true ή false.

fizzbuzz

Μια από τις πιο δημοφιλείς συνεντεύξεις για δουλειά.

Σταδιοποίηση

Απαιτείται να γράψετε μια συνάρτηση που εμφανίζει αριθμούς από το 1 έως το n στην κονσόλα, όπου το n είναι ένας ακέραιος που λαμβάνει η συνάρτηση ως παράμετρο, με τις ακόλουθες συνθήκες:

  • εξόδου fizz αντί για πολλαπλάσια του 3.
  • έξοδος buzz αντί για πολλαπλάσια του 5.
  • έξοδος fizzbuzz αντί για πολλαπλάσια του 3 και του 5.

Παράδειγμα

Fizzbuzz (5)

Αποτέλεσμα

// 1
// 2
// αφρίζω
// 4
// βουητό

Ανάλυση της εργασίας

Το κύριο πράγμα εδώ είναι ο τρόπος εύρεσης πολλαπλών χρησιμοποιώντας JavaScript. Μπορεί να υλοποιηθεί χρησιμοποιώντας τον τελεστή συντελεστή ή το υπόλοιπο -%, που σας επιτρέπει να εμφανίσετε το υπόλοιπο κατά τη διαίρεση δύο αριθμών. Αν το υπόλοιπο είναι 0, σημαίνει ότι ο πρώτος αριθμός είναι πολλαπλάσιο του δεύτερου.

12% 5 // 2 -> 12 δεν είναι πολλαπλάσιο του 5
12% 3 // 0 -> 12 είναι πολλαπλάσιο του 3

Έτσι, αν διαιρέσουμε το 12 με το 5, θα έχουμε 2 με υπόλοιπο 2. Αν διαιρέσουμε το 12 με το 3, τότε θα έχουμε 4 με ένα υπόλοιπο 0. Στην πρώτη περίπτωση, το 12 δεν είναι πολλαπλάσιο του 5, στο δεύτερον, το 12 είναι πολλαπλάσιο του 3.

Λύση

Η καλύτερη λύση θα ήταν ο παρακάτω κώδικας:

const fizzBuzz = num => {
  for(let i = 1; i <= num; i++) {
    // check if the number is a multiple of 3 and 5
    if(i % 3 === 0 && i % 5 === 0) {
      console.log('fizzbuzz')
    } // check if the number is a multiple of 3
      else if(i % 3 === 0) {
      console.log('fizz')
    } // check if the number is a multiple of 5
      else if(i % 5 === 0) {
      console.log('buzz')
    } else {
      console.log(i)
    }
  }
}

Η συνάρτηση εκτελεί τους απαραίτητους ελέγχους χρησιμοποιώντας δηλώσεις υπό όρους και παράγει το αποτέλεσμα που απαιτείται από τον χρήστη. Στην εργασία, αξίζει να προσέξετε τη σειρά των δηλώσεων if...else: ξεκινώντας με διπλή συνθήκη (&&) και τελειώνοντας με την περίπτωση όταν δεν ήταν δυνατός ο εντοπισμός πολλών αριθμών. Ως αποτέλεσμα, καλύπτουμε όλες τις επιλογές.

Ανάγραμμα

Αυτό είναι το όνομα μιας λέξης που περιέχει όλα τα γράμματα μιας άλλης λέξης στον ίδιο αριθμό, αλλά με διαφορετική σειρά.

Σταδιοποίηση

Πρέπει να γράψουμε μια συνάρτηση που να ελέγχει αν δύο συμβολοσειρές είναι αναγραμματισμοί και η πεζή και η κεφαλαία των γραμμάτων δεν έχει σημασία. Μόνο οι χαρακτήρες μετράνε. τα κενά ή τα σημεία στίξης δεν λαμβάνονται υπόψη.

anagram('finder', 'Friend') --> true
anagram('γεια', 'αντίο') --> false

Ανάλυση της εργασίας

Εδώ είναι σημαντικό να λάβετε υπόψη ότι είναι απαραίτητο να ελέγξετε κάθε γράμμα σε δύο γραμμές εισαγωγής και τον αριθμό τους σε κάθε γραμμή.

εύρεση -> f: 1 φίλος -> f: 1
i: 1 r: 1
n: 1 i: 1
δ: 1 ε: 1
e: 1 n: 1
r: 1 d: 1

Για την αποθήκευση δεδομένων αναγραμμάτων, θα πρέπει να επιλέξετε μια δομή όπως ένα αντικείμενο JavaScript κυριολεκτικά. Το κλειδί σε αυτή την περίπτωση είναι ο χαρακτήρας του γράμματος, η τιμή είναι ο αριθμός των επαναλήψεών του στην τρέχουσα γραμμή.

Υπάρχουν και άλλες προϋποθέσεις:

  • Πρέπει να βεβαιωθείτε ότι η περίπτωση των γραμμάτων δεν λαμβάνεται υπόψη κατά τη σύγκριση. Απλώς μετατρέψτε και τις δύο συμβολοσειρές σε πεζά ή κεφαλαία.
  • Εξαιρούμε όλους τους μη χαρακτήρες από τη σύγκριση. Το καλύτερο για να συνεργαστείτε κανονικές εκφράσεις.

Λύση

// helper function that builds the
// object to store the data
const buildCharObject = str => {
  const charObj = {}
  for(let char of str.replace(/[^w]/g).toLowerCase()) {
    // if the object has already a key value pair
    // equal to the value being looped over,
    // increase the value by 1, otherwise add
    // the letter being looped over as key and 1 as its value
    charObj[char] = charObj[char] + 1 || 1
  }
  return charObj
}
 
// main function
const anagram = (strA, strB) => {
  // build the object that holds strA data
  const aCharObject = buildCharObject(strA)
  // build the object that holds strB data
  const bCharObject = buildCharObject(strB)
 
  // compare number of keys in the two objects
  // (anagrams must have the same number of letters)
  if(Object.keys(aCharObject).length !== Object.keys(bCharObject).length) {
    return false
  }
  // if both objects have the same number of keys
  // we can be sure that at least both strings
  // have the same number of characters
  // now we can compare the two objects to see if both
  // have the same letters in the same amount
  for(let char in aCharObject) {
    if(aCharObject[char] !== bCharObject[char]) {
      return false
    }
  }
  // if both the above checks succeed,
  // you have an anagram: return true
  return true
}

Δώστε προσοχή στη χρήση Object.keys () στο παραπάνω απόσπασμα. Αυτή η μέθοδος επιστρέφει έναν πίνακα που περιέχει τα ονόματα ή τα κλειδιά με την ίδια σειρά που εμφανίζονται στο αντικείμενο. Σε αυτήν την περίπτωση, ο πίνακας θα είναι ως εξής:

['f', 'i', 'n', 'd', 'e', ​​'r']

Έτσι παίρνουμε τις ιδιότητες του αντικειμένου χωρίς να χρειάζεται να κάνουμε μεγάλο βρόχο. Σε μια εργασία, μπορείτε να χρησιμοποιήσετε αυτήν τη μέθοδο με την ιδιότητα .length - για να ελέγξετε αν και οι δύο συμβολοσειρές έχουν τον ίδιο αριθμό χαρακτήρων - αυτό είναι ένα σημαντικό χαρακτηριστικό των αναγραμμάτων.

Αναζήτηση φωνήεντος

Ένα αρκετά απλό έργο που συναντάμε συχνά σε συνεντεύξεις.

Σταδιοποίηση

Πρέπει να γράψετε μια συνάρτηση που να παίρνει μια συμβολοσειρά ως όρισμα και να επιστρέφει τον αριθμό των φωνηέντων που περιέχει η συμβολοσειρά.
Τα φωνήεντα είναι «α», «ε», «ι», «ο», «υ».

Παράδειγμα:

findVowels('hello') // --> 2
findVowels('γιατί') // --> 0

Λύση

Εδώ είναι η πιο εύκολη επιλογή:

const findVowels = str => {
  let count = 0
  const vowels = ['a', 'e', 'i', 'o', 'u']
  for(let char of str.toLowerCase()) {
    if(vowels.includes(char)) {
      count++
    }
  }
  return count
}

Είναι σημαντικό να δώσετε προσοχή στη χρήση της μεθόδου .includes(). Είναι διαθέσιμο τόσο για συμβολοσειρές όσο και για πίνακες. Θα πρέπει να χρησιμοποιείται για να διαπιστωθεί εάν ένας πίνακας περιέχει μια συγκεκριμένη τιμή. Αυτή η μέθοδος επιστρέφει true εάν ο πίνακας περιέχει την καθορισμένη τιμή και false διαφορετικά.

Υπάρχει επίσης μια συντομότερη λύση στο πρόβλημα:

const findVowels = str => {
  const matched = str.match(/[aeiou]/gi)
  return matched ? matches.length : 0
}

Εδώ χρησιμοποιείται η μέθοδος .match(), η οποία σας επιτρέπει να εφαρμόσετε μια αποτελεσματική αναζήτηση. Εάν μια κανονική έκφραση ως όρισμα μεθόδου βρεθεί μέσα στην καθορισμένη συμβολοσειρά, τότε η επιστρεφόμενη τιμή είναι ένας πίνακας χαρακτήρων που ταιριάζουν. Λοιπόν, εάν δεν υπάρχουν αντιστοιχίσεις, τότε η .match() επιστρέφει null.

Fibonacci

Ένα κλασικό έργο που μπορεί να επιτευχθεί σε συνεντεύξεις διαφόρων επιπέδων. Αξίζει να υπενθυμίσουμε ότι η ακολουθία Fibonacci είναι μια σειρά αριθμών, όπου κάθε επόμενος είναι το άθροισμα των δύο προηγούμενων. Έτσι, οι πρώτοι δέκα αριθμοί μοιάζουν με αυτό: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Σταδιοποίηση

Πρέπει να γράψετε μια συνάρτηση που να επιστρέφει την nη εγγραφή σε μια συγκεκριμένη ακολουθία και το n είναι ένας αριθμός που μεταβιβάζεται ως όρισμα στη συνάρτηση.

fibonacci(3) // --> 2

Αυτή η εργασία περιλαμβάνει τον κύκλο των φορών που καθορίζονται στο όρισμα, επιστρέφοντας την τιμή στην κατάλληλη θέση. Αυτός ο τρόπος ρύθμισης του προβλήματος απαιτεί τη χρήση βρόχων. Αν χρησιμοποιείτε την αναδρομή, μπορεί να αρέσει στον συνεντευκτή και να σας δώσει μερικούς επιπλέον βαθμούς.

Λύση

const fibonacci = num => {
  // store the Fibonacci sequence you're going
  // to generate inside an array and
  // initialize the array with the first two
  // numbers of the sequence
  const result = [0, 1]
 
  for(let i = 2; i <= num; i++) {
    // push the sum of the two numbers
    // preceding the position of i in the result array
    // at the end of the result array
    const prevNum1 = result[i - 1]
    const prevNum2 = result[i - 2]
    result.push(prevNum1 + prevNum2)
  }
  // return the last value in the result array
  return result[num]
}

Στον πίνακα αποτελεσμάτων, οι δύο πρώτοι αριθμοί περιέχονται σε μια σειρά επειδή κάθε καταχώρηση στην ακολουθία αποτελείται από το άθροισμα των δύο προηγούμενων αριθμών. Δεν υπάρχουν δύο αριθμοί στην αρχή που μπορούν να ληφθούν για να ληφθεί ο επόμενος αριθμός, επομένως ο βρόχος δεν μπορεί να τους δημιουργήσει αυτόματα. Όμως, όπως γνωρίζουμε, οι δύο πρώτοι αριθμοί είναι πάντα 0 και 1. Επομένως, μπορείτε να αρχικοποιήσετε τον πίνακα αποτελεσμάτων χειροκίνητα.

Όσο για την αναδρομή, όλα είναι πιο απλά και πιο περίπλοκα ταυτόχρονα:

const fibonacci = num => {
  // if num is either 0 or 1 return num
  if(num < 2) {
    return num
  }
  // recursion here
  return fibonacci(num - 1) + fibonacci(num - 2)
}

Συνεχίζουμε να καλούμε fibonacci(), περνώντας όλο και μικρότερους αριθμούς ως ορίσματα. Σταματάμε όταν το όρισμα που πέρασε είναι 0 ή 1.

Παραγωγή

Πιθανότατα, έχετε ήδη αντιμετωπίσει οποιαδήποτε από αυτές τις εργασίες, εάν παίρνατε συνέντευξη για μια εργασία προγραμματιστή front-end ή JavaScript (ειδικά αν πρόκειται για κατώτερο επίπεδο). Αλλά αν δεν τα συναντήσατε, μπορεί να σας φανούν χρήσιμα στο μέλλον - τουλάχιστον για τη γενική ανάπτυξη.

Το Skillbox προτείνει:

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο