Столкнувшись с проблемой кода, часто кажется, что Рипли лихорадочно перемещается по темным коридорам Nostromo, решая проблему - в ее случае: как остаться в живых - и нервно боясь быть полученной! на каждом шагу - в ее случае: ужасающим, хищным внеземным зверем. Прежде чем я продолжу, позвольте мне обратиться к преданным: хотя предыдущее предложение напоминает сюжет Alien (1979), мне хорошо известно, что это изображение взято из Aliens (1986). ). Это было просто более наглядно для темы данной статьи!

Недавно я просмотрел заявление о приеме на работу, в котором возникла проблема с кодом. Я справился с задачей, чтобы представить свою работу вместе с приложением. Задача заключалась в следующем: Напишите программу, которая выводит наибольший уникальный набор символов, который можно удалить из этого абзаца, не допуская, чтобы его длина упала ниже 50.

Например: [‘H’, ‘i’, ‘!’, ‘’]

Давайте примем этот вызов и поработаем над первым черновиком или решением методом перебора. Большая часть времени программиста уходит на рефакторинг. У вас будет неограниченное время для рефакторинга и оптимизации программы, запрошенной в этой задаче. В центре внимания этой статьи будет то, как подойти к задаче, решить проблему и выработать решение, отвечающее поставленным задачам.

Прежде всего: прочтите требования. Затем прочтите их еще раз. Произнесите их вслух. Найдите минутку, чтобы переварить инструкции и понять, о чем от вас просят. * Примечание. Я собираюсь использовать JavaScript , чтобы выразить свое решение.

Write a program that outputs the largest unique set of characters that can be removed from this paragraph without letting its length drop below 50. For example: [‘H’, ‘i’, ‘!’, ‘ ’]

При первоначальной оценке можно определить, что:

  • Необходимо написать программу, которая может быть JavaScript функцией.
  • Функция должна производить вывод, поэтому можно использовать console.log().
  • Результатом должно быть array уникальных символов без повторов. В данном примере также подразумевается включение смешанного регистра, специальных символов, знаков препинания и пробелов.
  • Вход, с которым нужно работать, который будет единственным аргументом, передаваемым функции, - это «этот абзац» - абзац, содержащий инструкции для задачи. Подразумевается, что тип данных - string.
  • Вывод должен включать максимальное количество символов, которое может быть удалено из ввода, не позволяя его длине стать меньше 50. (Подразумевается, что length означает количество символов.)

Если вы работаете над этой задачей лично, на техническом собеседовании, эти пункты являются отличными моментами для обсуждения и уточнения для начала. Очень важно, а может быть, даже важнее продемонстрировать процесс до решения. Означает ли «вывод» вывод на терминал или возвращаемое значение? Действительно ли все символы применимы? Является ли ввод на самом деле целым абзацем? И так далее.

Следующий отличный шаг - установить достоверность и написать псевдокод.

let input = 'I recently encountered a job application that presented a code challenge. I tackled the challenge so that I could submit my work with the application. The challenge was this: Write a program that outputs the largest unique set of characters that can be removed from this paragraph without letting its length drop below 50.'
function removeUniqueSet(string) { // define function and argument
  let output = [] // define output
  
  programmatically remove characters from string... loop?
  and add them to output array... .push()?
// employ a conditional for input validation
  if (string.length < 50) {
    console.log('Input phrase has less than 50 characters.')
    return // terminate execution, i.e. end function
  }
  console.log(output)
}
removeUniqueSet(input)
// [???]

УДЕРЖИВАЙТЕ ТЕЛЕФОН. Давайте ненадолго остановимся и поговорим о мозговом пердеже. Когда я решил выполнить это задание, я был один, не выходя из дома, но слова вот небольшой вызов и связь с заявлением о вакансии все еще заставляли меня нервничать! Как будто ксеноморф собирался подкрасться ко мне сзади, как-то нехарактерно заговорить и произнести последние слова, которые мои уши когда-либо слышали: Тебе никогда не получить эту работу.

Тестирование сложное. Это совсем другое дело, чем повседневная работа. Это также может скрыть весь потенциал человека. Нервничать в тестовой ситуации - вполне естественно и часто. Постарайтесь быть спокойным и собранным. Сосредоточьтесь на том, что вы знаете, и на том, как вы работаете в свободное время. Все дает возможность учиться и дает возможность для роста. Со временем и опытом приходит больше уверенности… а также большие проблемы. Всегда будет что-то, чего вы не знаете, так что просто будьте собой и наслаждайтесь процессом. Присутствовать. Получайте удовольствие от дела. Теперь о том мозговом пердеже ...

Из-за нервов у вас может быть момент замешательства или забывчивости во время проверки кода. Просто сделайте вдох и измените свой мыслительный процесс. Вот пример: когда я впервые проанализировал эту задачу, я подумал: «Хорошо. Как начать?". Я проверил длину вводимого абзаца.

let input = 'I recently encountered a job application that presented a code challenge. I tackled the challenge so that I could submit my work with the application. The challenge was this: Write a program that outputs the largest unique set of characters that can be removed from this paragraph without letting its length drop below 50.'
console.log(input.length)
// 322

Я решил, что на клавиатуре всего 26 букв алфавита и10 цифр. Здесь не так много специальных символов (верно?), И в этом конкретном абзаце может быть 2. Даже если я уберу из ввода высокую оценку 100 символов, останется 222. Был ли результат вообще разумным? Я мог бы просто создать уникальный набор из каждого символа и по-прежнему быть далеко от предела остатка 50 символов. Я ошибаюсь?

Я оборонительно сосредоточился на обоснованности задачи и не понял, что количество символов в абзаце не было синонимом количества уникальных символов в абзаце. В абзаце много повторяющихся символов! Более того, цель состояла в том, чтобы создать необходимую функциональность, а не обсуждать вводимые данные. Итак, прояснив цель и обновив свою точку зрения, я приступил к работе.

Вернемся к задаче.

Во-первых, мы можем считать, что функция должна обрабатывать ввод с длиной меньше, чем оставшийся минимум символов 50. Итак, давайте изменим код так, чтобы сначала было задействовано это условие:

function removeUniqueSet(string) {
  let output = []
  if (string.length < 50) {
    console.log('Input phrase has less than 50 characters.')
    return
  }
  programmatically remove characters from string... loop?
  and add them to output array... .push()?
  console.log(output)
}

Затем давайте подойдем к программному удалению символов из ввода. Поскольку функция должна удалять элементы, пока длина ввода не опускается ниже 50, мы можем использовать while loop. Это также позволяет функции получать ввод неизвестной длины. Мы можем установить условие для while loop, которое прерывает цикл, когда длина входной строки достигает 50. Однако нам следует подумать о создании копии входной строки, которая будет действовать как значение обратного отсчета, чтобы мы могли работать с начальным вводом без непреднамеренного изменения его в процессе. Каждый раз при запуске цикла мы хотим удалить только что вычисленный символ - в данном случае - первый символ.

function removeUniqueSet(string) {
  let output = []
  let limit = string // copy of the input string
  if (string.length < 50) {
    console.log('Input phrase has less than 50 characters.')
    return
  }
  while (limit.length > 50) {
// *thinking ahead: add characters to output array... .push()?
    limit = limit.slice(1) // reassigning value
  }
  console.log(output)
}

Теперь есть копия ввода, назначенная переменной с именем limit. Он используется для установки условия while loop путем отслеживания длины limit, и на каждой итерации переназначение limit равно limit за вычетом его первого символа. Это достигается с помощью метода .slice() с аргументом 1, порядковым номером второго символа. По сути, он говорит: «преобразовать limit в limit, начиная со второго символа».

На этом этапе у нас есть функция, которая принимает строку, возвращает сообщение об ошибке, если эта строка меньше 50 символов, или продолжает объединять копии ввода, по одному символу за раз, до тех пор, пока длина копии ввода не уменьшится. к 50. Что осталось сделать, так это исправить результат. У нас есть выходной массив, объявленный в верхней части функции, и он записывается в терминал в нижней части функции. Теперь нам просто нужно построить вывод.

while loop дает возможность оценивать каждый символ ввода, пока выполняется условие. Итак, на каждой итерации мы хотим добавить текущий символ в выходной массив, но только если его еще нет в выходном массиве. Напомним, что выходной результат должен включать только уникальные символы, без повторов. Этого можно достичь, включив оператор if в while loop с условием, которое проверяет, включает ли выходной массив определенный символ. Если оцениваемый символ не уже включен в выходной массив, он добавляется.

function removeUniqueSet(string) {
  let output = []
  let limit = string
  if (string.length < 50) {
    console.log('Input phrase has less than 50 characters.')
    return
  }
  while (limit.length > 50) {
    if (!output.includes(?char?)) { // if output does not include
      output.push(?char?) // add char to output
    }
    limit = limit.slice(1)
  }
  console.log(output)
}

Теперь есть инструкция if, которая проверяет, есть ли символ в выходном массиве. Это достигается за счет использования оператора взрыва (!) для изменения логики вызова метода .includes() в выходном массиве с учетом аргумента определенного символа. Обычно говорят: если выходной массив не включает этот символ, то… добавьте его в выходной массив с помощью метода .push().

Последний шаг к достижению функциональности связан с тем, какие конкретные символы оцениваются. Что ж, нам следует оценить ввод. И имеет смысл делать это программно, от начала до конца, по очереди. К счастью, петля у нас уже настроена. Мы можем использовать его для оценки каждого символа входной строки по индексу. Таким образом, аргументы в операторе if будут входными данными (string) в сочетании с обозначением скобок ([]) для вызова определенных символов по индексу. И, поскольку мы хотим просмотреть каждый символ входной строки, мы можем объявить переменную счетчика (i), установленную на 0, во внешней области функции и увеличить (++) переменную счетчика в нижней части области while loop.

function removeUniqueSet(string) {
  let output = []
  let limit = string
  let i = 0 // declare and assign counter variable
  if (string.length < 50) {
    console.log('Input phrase has less than 50 characters.')
    return
  }
  while (limit.length > 50) {
    if (!output.includes(string[i])) { 
      output.push(string[i]) //access character from string by index
    }
    limit = limit.slice(1)
    i++ // increment the value of i by 1
  }
  console.log(output)
}

У нас есть логичный первый набросок программы, требуемый задачей. Вы должны проверять вывод на протяжении всего процесса сборки. В этой статье я буду «запускать» программу и проверять результат. Для дополнительной проверки я добавлю дополнительный вывод, подтверждающий, что количество вводимых данных не упало ниже 50.

let input = 'I recently encountered a job application that presented a code challenge. I tackled the challenge so that I could submit my work with the application. The challenge was this: Write a program that outputs the largest unique set of characters that can be removed from this paragraph without letting its length drop below 50.'
function removeUniqueSet(string) {
  let output = []
  let limit = string
  let i = 0 
  if (string.length < 50) {
    console.log('Input phrase has less than 50 characters.')
    return
  }
  while (limit.length > 50) {
    if (!output.includes(string[i])) { 
      output.push(string[i])
    }
    limit = limit.slice(1)
    i++
  }
  console.log(output)
  console.log(`remaining input length = ${limit.length}`)
}
removeUniqueSet(input)
// ['I', ' ', 'r', 'e', 'c', 'n', 't', 'l', 'y', 'o', 'u', 'd', 'a', // 'j', 'b', 'p', 'i', 'h', 's', 'g', '.', 'k', 'm', 'w', 'T', ':', // 'W', 'q', 'f', 'v']
// remaining input length = 50

Это решение может быть не самым умным, или самым эффективным, или самым лаконичным, или множеством других вещей, но вот что оно есть: эффективное, хорошо продуманное и подробно объясненное. Эти качества имеют большое значение для развития навыков решения проблем и выработки действенных решений в ограниченные сроки. Как упоминалось ранее, всегда есть время для рефакторинга. Убедитесь, что вы полагаетесь на свои знания, рассказываете о своем процессе и получаете удовольствие от процесса.

Github.com/dangrammer
connected.com/in/danieljromans
danromans.com