Погрузитесь в мир вставки операторов и раскройте секреты арифметических операций. Поднимите уровень своей игры в программирование уже сегодня! 🧮🎯 #JavaScriptГоловоломки #МагияАрифметики #Решение Задач

В этой статье мы отправимся в увлекательное путешествие, чтобы решить увлекательную задачу с помощью JavaScript. Наша цель — вставить необходимые арифметические операторы (+, -, *) в строку цифр, чтобы получить целевое значение. Эта проблема заставляет нас найти эффективное решение, которое исследует различные комбинации операторов для достижения желаемого результата. Мы рассмотрим логику этой проблемы и предоставим вам два фрагмента кода: простой и оптимизированный вариант. Приготовьтесь раскрыть секреты арифметических операций!

Логика:

Чтобы достичь целевого значения путем вставки арифметических операторов в строку цифр, мы можем использовать рекурсию и возврат. Мы начинаем с рассмотрения каждой цифры в строке и рекурсивно исследуем все возможные комбинации операторов. На каждом шаге мы вычисляем текущее значение выражения и проверяем, соответствует ли оно целевому значению. Если это так, мы возвращаем выражение. Если нет, продолжаем изучать другие возможности. Используя возможности рекурсии и поиска с возвратом, мы тщательно ищем правильную комбинацию операторов для достижения целевого значения.

Простой фрагмент кода:

Начнем с простого фрагмента кода, воплощающего логику достижения целевого значения путем вставки арифметических операторов:

function insertOperators(digits, target) {
  const result = [];
  backtrack(digits, target, '', 0, 0);
  return result;
  function backtrack(digits, target, expression, index, evalSum) {
    if (index === digits.length) {
      if (evalSum === target) {
        result.push(expression);
      }
      return;
    }
    for (let i = index; i < digits.length; i++) {
      const currStr = digits.slice(index, i + 1);
      const currNum = parseInt(currStr);
      if (index === 0) {
        backtrack(digits, target, currStr, i + 1, currNum);
      } else {
        backtrack(digits, target, expression + '+' + currStr, i + 1, evalSum + currNum);
        backtrack(digits, target, expression + '-' + currStr, i + 1, evalSum - currNum);
        backtrack(digits, target, expression + '*' + currStr, i + 1, evalSum * currNum);
      }
    }
  }
}
// Usage
const digits = '123';
const target = 6;
const expressions = insertOperators(digits, target);
console.log('Expressions:', expressions);

Выход:

Expressions: ['1+2+3', '1*2*3']

В предоставленном простом фрагменте кода мы определяем функцию с именем insertOperators, которая принимает в качестве входных данных строку цифр и целевое значение. Мы инициализируем пустой массив result для хранения выражений, которые возвращают целевое значение. Затем мы вызываем функцию backtrack для изучения всех возможных комбинаций операторов. Функция backtrack принимает цифры, целевое значение, текущее выражение, текущий индекс и оцененную сумму в качестве параметров. Если индекс достигает конца цифр, мы проверяем, соответствует ли оцененная сумма целевому значению. Если это так, мы добавляем выражение в массив result. Если нет, мы продолжаем изучать другие возможности, возвращаясь назад и пробуя разные операторы. Наконец, мы возвращаем массив result, содержащий выражения, которые достигают целевого значения.

Оптимизированный фрагмент кода:

Теперь давайте углубимся в оптимизированную версию кода, которая обеспечивает лучшую временную и пространственную сложность:

function insertOperatorsOptimized(digits, target) {
  const result = [];
  const backtrack = (digits, target, expression, index, evalSum, multed) => {
    if (index === digits.length) {
      if (evalSum === target) {
        result.push(expression);
      }
      return;
    }
    let num = 0;
    for (let i = index; i < digits.length; i++) {
      num = num * 10 + parseInt(digits[i]);
if (index === 0) {
        backtrack(digits, target, num.toString(), i + 1, num, num);
      } else {
        backtrack(digits, target, expression + '+' + num, i + 1, evalSum + num, num);
        backtrack(digits, target, expression + '-' + num, i + 1, evalSum - num, -num);
        backtrack(digits, target, expression + '*' + num, i + 1, evalSum - multed + multed * num, multed * num);
      }
      
      if (num === 0) {
        break;
      }
    }
  };
  backtrack(digits, target, '', 0, 0, 0);
  return result;
}
// Usage
const digits = '123';
const target = 6;
const expressions = insertOperatorsOptimized(digits, target);
console.log('Expressions:', expressions);

Выход:

Expressions: ['1+2+3', '1*2*3']
  • В предоставленном оптимизированном фрагменте кода мы оптимизируем процесс преобразования подстроки цифр в число, используя одну переменную num и обновляя ее в цикле. Это устраняет необходимость многократного обращения к parseInt и повышает эффективность.
  • Кроме того, мы добавляем проверку на ноль, прерывая цикл, если текущее число равно нулю, чтобы избежать ненужных вычислений. Общая логика и структура кода остаются такими же, как и в простом фрагменте кода.

Краткое содержание:

В нашем стремлении достичь целевого значения путем вставки арифметических операторов в строку цифр мы исследовали логику этой интригующей проблемы с помощью JavaScript. Мы предоставили два фрагмента кода: простую версию и оптимизированную версию. Оптимизированная версия оптимизировала процесс преобразования чисел и включала проверку нуля для повышения эффективности. Используя эти фрагменты кода, теперь вы можете эффективно исследовать различные комбинации операторов для достижения целевого значения, раскрывая всю мощь арифметических манипуляций. Погрузитесь в мир рекурсии и возврата и оцените элегантность решения сложных задач в JavaScript!

Надеюсь, что приведенная выше статья дала лучшее понимание. Если у вас есть какие-либо вопросы относительно областей, которые я обсуждал в этой статье, области улучшения, не стесняйтесь комментировать ниже.

[Раскрытие информации: эта статья является совместным творением, в котором мои собственные идеи сочетаются с помощью ChatGPT для оптимальной артикуляции.]