Уровень: легкий

Проблема 3: https://www.codechef.com/problems/FLOW017

«Вам дано целое число N. Напишите программу для вычисления суммы всех цифр числа N ».

Ограничения:

  • 1 N 1000000

Пример:

Input:
12345
31203
2123
Output:
15
9
8

Подход и решение:

Подход, который я придумал, заключался в использовании метода обратного преобразования массива по месту, который я использовал в одной из наших предыдущих задач, и вместо замены первого на последнюю, второго на вторую последнюю и так далее, мы подведем итоги.

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

Вот почему, поскольку нам нужно перебирать только половину элементов массива, средний элемент всегда остается неизменным и, следовательно, пропускает наш результат суммирования.

Итак, чтобы преодолеть эту проблему, нам нужно сначала проверить длину массива и добавить средний элемент в наш результат суммы.

Давайте посмотрим на алгоритм в приведенном ниже коде:

function sumOfDigits(str) {
    const input = str.split('');
    const mid = Math.floor(input.length/2);
    let sum = 0;
    // check if the array length is odd, and add the element to the          sum result
    if (input.length%2 !== 0) {
      sum+= Number(input[mid]);
    }    
    for(let i = 0; i < mid; i++) {
      sum += Number(input[i]) + Number(input[input.length - 1 - i]);
    }
    console.log(Number(sum));
}

Временная сложность:

Давайте сделаем простую математику, чтобы вычислить временную сложность алгоритма, известную как нотация Big O.

Как мы видим, большинство инструкций выполняется за постоянное время O (1), и только один раз нам пришлось пройти через половину элементов массива, что привело к O (n / 2).

В конце, после игнорирования всех констант и рассмотрения только доминирующей, сложность времени выполнения составляет O (n), что является линейным графиком.

Проблема 4: https://www.codechef.com/problems/FLOW017

«Три числа A, B и C - это входные данные. Напишите программу, чтобы найти среди них второе место ».

Ограничения:

  • 1 A,B,C 1000000

Пример:

Input:
120 11 400
10213 312 10
10 3 450
Output:
120
312
10

Подход и решение:

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

let largest = -Number.MAX_VALUE;
let secondLargest = -Number.MAX_VALUE;

Затем переберите массив, учитывая два крайних случая:

  1. Если новое значение больше, чем наибольшее значение, тогда наибольшее значение становится вторым по величине, а новое значение становится наибольшим.
secondLargest one = largest one 
largest one  = new value

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

secondLargest one = new value

Давайте посмотрим на реальный алгоритм ниже:

function secondLargest(str) {
    let largest = -Number.MAX_VALUE;
    let secondLargest = -Number.MAX_VALUE;
    const input = str.split(' ');
    const length = input.length;
    for(let i =0; i<length; i++ ) {
        const newValue = Number(input[i]);
        if (newValue > largest) {
            secondLargest = largest;
            largest = newValue
           //[secondLargest, largest] = [largest, newValue]
        } else if (newValue > secondLargest && newValue < largest){
            secondLargest = newValue;
        } 
    }
    if (secondLargest === -Number.MAX_VALUE) {
        console.log('Theres no second largest number');
    } else {
        console.log(Number(secondLargest))
    } 
}

Временная сложность:

В конце, после игнорирования всех констант и рассмотрения только доминирующей, сложность времени выполнения составляет O (n), что является линейным графиком.

На этом все, ребята.

Не стесняйтесь размещать свое лучшее решение в разделе комментариев.

Приветствую и счастливого кодирования!