Слабо решить эти задачи по программированию?



Книга Слабо решить эти задачи по программированию?

Программирование всегда связано с решением различных задач. Я подготовил список из шести различных заданий и отсортировал их по сложности решения. Первая — самая простая, шестая — самая сложная. Сможете разобраться со всеми?


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


1. Плюс минус


Давайте начнем с относительно простой задачи, взятой с HackerRank. Ее можно назвать разминочной.



Дан массив целых чисел. Вычислите дроби его элементов, являющихся положительными, отрицательными и нулевыми. Выведите на печать десятичное значение каждой дроби в новой строке. Имейте в виду, что это задача с высокой степенью точности. Примеры масштабированы до шести знаков после точки, поэтому диапазон допустимых ошибок составляет до 10^-4 . Например, дан массив arr=[1, 1, 0.-1, -1]. В нем пять элементов, два из которых положительные, два отрицательные и 1 равен нулю. Их отношения будут следующими 2/5 = 0.400000, 2/5 = 0.400000 и 1/5 = 0.200000. На печати они должны выглядеть так: см. скриншот.


2. Сумма двух


Эта задача, взятая с LeetCode, считается простой.



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


3. Самое большое палиндромное произведение


Это еще одна простая задача, которую я взял с Project Euler. На данный момент она уже решена более чем 455 000 людьми:



Палиндромное число читается одинаково в обе стороны. Самое большое палиндромное произведение, полученное из двух двухзначных чисел — это 9009=91*99. Найдите самый большой палиндром, который можно получить из произведения двух трехзначных чисел.


4. Различные значения


Следующая задача взята с Project Euler. Она уже несколько сложнее предыдущей и решена только 100 000 пользователями.



Рассмотрите все целочисленные комбинации a^b при условии, что 2 ≤ a ≤ 5 и 2 ≤ b ≤ 5. Если затем их расположить по порядку, удалив все повторения, то мы получим следующую последовательность из 15 различных значений. Сколько таких различных значений содержится в последовательности, полученной согласно условию 2 ≤ a ≤ 100 и 2 ≤ b ≤ 100?


5. Постоянная Капрекара


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



Пусть функция KaprekarsConstant(num) получает для передачи параметр num — четырехзначное число с как минимум двумя различными цифрами. Программа должна производить с этим числом следующие действия: упорядочивать его цифры по возрастанию и убыванию (добавляя нули для получения четырехзначного числа), а затем вычитать меньшее число из большего. Далее она должна повторять предыдущий шаг. Выполнение этого процесса всегда в итоге будет приводить вас к результату 6174 (7641–1467=6174). Программа также должна возвращать количество повторов, потребовавшихся для достижения этого значения. Например, если num равен 3524, программа должна вернуть 3, вот её три шага: 


(1) 5432–2345 = 3087
(2) 8730–0387 = 8352
(3) 8532–2358 = 6174

6. Поменять местами узлы в парах


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


Давайте не будем слишком углубляться в детали и взглянем на саму задачу:



Дан связанный список. Поменяйте местами смежные узлы и верните их головной элемент. Изменять можно только узлы, но не их значения.


Решения


1. Плюс минус


Решение здесь очень простое:


<?php
function getFractionals($numbers) {
$length = count($numbers);
$results = [
'positive' => 0,
'negative' => 0,
'zero' => 0,
];

for ($i = 0; $i < $length; $i++) {
if ($numbers[$i] < 0) {
$results['negative'] += 1;
} else if ($numbers[$i] > 0) {
$results['positive'] += 1;
} else {
$results['zero'] += 1;
}
}

return [
$results['positive'] / $length,
$results['negative'] / $length,
$results['zero'] / $length
];
}
print_r(getFractionals([1, 1, 0, -1, -1])); // [0.4, 0.4, 0.2]
print_r(getFractionals([-4, 3, -9, 0, 4, 1])); // [0.5, 0.3333, 0.16667]

2. Сумма двух


Хоть эта задача и является несколько сложнее, у вас вряд ли возникнут трудности с ее решением. Я использовал простой подход брутфорс.


<?php
function twoSum($numbers, $target) {
for ($i = 0; $i < count($numbers); $i++) {
for ($j = $i + 1; $j < count($numbers); $j++) {
if ($numbers[$j] + $numbers[$i] === $target) {
return [$i, $j];
}
}
}
}
print_r(twoSum([2, 7, 11, 15], 9)); // [0, 1]
print_r(twoSum([2, 7, 11, 15], 17)); // [0, 3]

3. Самое большое палиндромное произведение


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


Я также добавил стоп-условия, чтобы избежать лишних повторений.


<?php
function isPalindrome($number)
{
return (string) $number === strrev((string) $number);
}
function getBiggestPalindrome($digits)
{
$start = pow(10, $digits) - 1;
$max = 0;
for ($i = $start; $i > 0; $i--)
{
if ($i * $start <= $max)
{
break;
}
for ($j = $start; $j > 0; $j--)
{
$product = $i * $j;
if ($product < $max)
{
break;
}
if ($product > $max && isPalindrome($product))
{
$max = $product;
}
}
}
return $max;
}
echo getBiggestPalindrome(2); // 9009
echo getBiggestPalindrome(3); // 906609, which is 993 * 913

4. Различные значения


Эту задачу я решил снова путем брутфорса.


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


function distinctPowers($min, $max) {
$numbers = [];

for ($i = $min; $i <= $max; $i++) {
for ($j = $min; $j <= $max; $j++) {
$numbers[] = pow($i, $j);
}
}

$unique_numbers = array_unique($numbers);
sort($unique_numbers);

return $unique_numbers;
}
echo print_r(distinctPowers(2, 5), 1); // [4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125]
echo print_r(count(distinctPowers(2, 100)), 1); // 9183 различных выражений

5. Постоянная Капрекара


Эта задача уже несколько сложнее. Она первая в списке, требующая для своего решения рекурсию.


function KaprekarsConstant($number, $numberOfIterations = 1) {
$number = (string) $number;

if (strlen($number) < 4) {
for ($i = strlen($number); $i < 4; $i++) {
$number .= '0';
}
}

$asc = str_split($number);
$desc = $asc;

rsort($desc);
sort($asc);

$asc_number = (int) implode($asc, '');
$desc_number = (int) implode($desc, '');
$difference = abs($asc_number - $desc_number);

if ($difference !== 6174) {
return KaprekarsConstant($difference, $numberOfIterations + 1);
}

return $numberOfIterations;
}
echo KaprekarsConstant(2111); // 5
echo KaprekarsConstant(9831); // 7


Скриншот прохождения всех тестовых кейсов.


6. Поменять местами узлы в парах


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


function swapPairs($head) {
$current = &$head;

while (!is_null($current->next)) {
$nextValue = $current->next->val;

$temp = &$current;
$temp->next->val = $temp->val;
$temp->val = $nextValue;

$current = &$current->next->next;
}
return $head;
}




294   0  

Comments

    Ничего не найдено.