Нужна помощь в возвращении самого большого 3-х последовательных чисел в строке (JavaScript) - PullRequest
0 голосов
/ 09 апреля 2019

Мне дана строка чисел в качестве параметра в моей функции.Мне нужно найти самый большой 3-значный последовательный номер и вернуть его.

function largestThreeDigitNum(numString){

    let largestNumber = 0;
    let largestThreeNumber = 0; 

    for(let i= 0; i<numString.length; ++i){
        if(numString[i] === largestNumber){
            largestThreeNumber = largestNumber++
        }
    }
    return largestThreeNumber; 
}

Ответы [ 4 ]

0 голосов
/ 09 апреля 2019

Вы можете взять временный массив и проверить значения.

var array = [101, 102, 103, 307, 308, 309, 211, 215, 227, 249, 479, 480, 481, 901, 902, 635, 636, 637],
    temp = [],
    largest = array.reduce((r, b, i, { [i - 1]: a }) => {
        if (a !== b - 1) {
            temp = [b];
            return r;
        }
        temp.push(b);
        if (temp.length > 3) temp.shift();
        if (temp.length === 3 && (!r || r[0] < temp[0])) return temp.slice();
        return r;
    }, undefined);

console.log(largest);
0 голосов
/ 09 апреля 2019

Вот небольшой скрипт, который возвращает 3 самых больших последовательных числа, надеюсь, он вам поможет

function largestThreeDigitNum(numString) {
  var numbers = [];
  
  // Loop to fill an array with all 3 consecutive numbers
  for (var i = 0; i < numString.length - 2; i++) { 
    numbers.push(numString.slice(i, i + 3));
  }

  numbers.sort() // sort the array from the smallest to the biggest
  return numbers[numbers.length - 1] // return the last item of the array, the biggest one
}

console.log(largestThreeDigitNum("693759936") )
0 голосов
/ 09 апреля 2019

Вот подробный способ, который пытается разбить проблему на несколько небольших проблем и решить эти проблемы с помощью небольших функций.По сути, мы:

  • Конвертируем строку в массив
  • Разбиваем массив на куски по три или как можно ближе к трем
  • Отфильтровываем куски, которыене три длинных числа
  • Преобразование фрагментов 3 'числовых' строк в одно число
  • Пройдите по каждому числу, сохраняя запись самого большого
  • ВозвращаетНаибольшее

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

const splitIntoAllChunks = size => array => Object.values(
  array
    .reduce((prev, _, i) => ({
      ...prev,
      [i]: array.slice(i, i + size),
    }), {})
);
  
const splitIntoThrees = splitIntoAllChunks(3);

const isLength = length => array => array.length === length;

const stringArrayToNumber = array => Number(array.join(''));

const getMax = (champ, challenger) => challenger > champ ? challenger : champ;

const example = "184727158129123"

const result = splitIntoThrees(example.split(''))
  .filter(isLength(3))
  .map(stringArrayToNumber)
  .reduce(getMax, 0);
  
console.dir(result);

Если вы хотите пойти с чем-то более похожим на ваше оригинальное решение, то вы можете немного исправить это с помощью чего-то вроде:

const testData = "1234596789"

function largestThreeDigitNum(numString){

    // this could be passed into the function instead, that way
    // the same code could be used for numbers of different sizes
    let numberSize = 3;

    // we only care about the largest three digit number at any given time
    let largestThreeNumber = 0; 

    // I've changed this to i++ as it's a little more conventional that way
    // I've also setup the loop to stop as soon as it can
    for (let i = 0; i < numString.length - (numberSize - 1); i++){
 
        // find the number for comparison
        const thisNumber = Number(numString.slice(i, i + 3))
        
        // if it's the biggest number, keep track of it
        if(thisNumber > largestThreeNumber){
            largestThreeNumber = thisNumber;
        }
    }
    return largestThreeNumber; 
}

console.dir(largestThreeDigitNum(testData))
0 голосов
/ 09 апреля 2019

ОК, давайте предположим, что ваша входная строка что-то вроде "123 465 789". Вы можете разбить его на пробелы, сохранить только 3-значные числа, отсортировать, взять последние три.

largestThreeDigitNum = numString => numString
                                       .split(" ") // split it over spaces
                                       .filter(n => n.length === 3) // keep only 3 digit numbers
                                       .sort()
                                       .slice(-3) // take the last three

console.log( largestThreeDigitNum("56 456 321 78 987 123 741 2 96 41 58 654") )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...