Библиотека задач по C++ | тесты, код, задания
5.23K subscribers
575 photos
1 video
162 links
Задачи и тесты по C++ для тренировки и обучения.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/7a480301

Работать у нас: https://job.proglib.io/

Наши каналы: https://yangx.top/proglibrary/9197
加入频道
std::find_if

std::find_if — это стандартный алгоритм, предоставляемый библиотекой . Этот алгоритм предназначен для поиска первого элемента в заданном диапазоне, который удовлетворяет заданному условию, определенному предикатом.

Вот общий формат std::find_if:

#include

template
InputIt find_if(InputIt first, InputIt last, UnaryPredicate p);

first и last представляют диапазон элементов для поиска. first указывает на начало диапазона, а last указывает за его пределы.
p — это унарный предикат, то есть функция, принимающая один аргумент и возвращающая true, если элемент удовлетворяет условию, и false в противном случае.
Ханойская башня

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

Подсказки

• Можно использовать библиотеку <cmath>
• Можно использовать функцию возведения в степень pow

Tower of Hanoi (edabit)

#middle #algorithms #tasks

Решение
#include <cmath>
int towerHanoi(int discs) {
return pow(2, discs) — 1;
}
🔮 Задача FizzBuzz

Сама по себе задача не сложная для решения, но она очень популярная и поэтому о ней стоит знать

Подход к решению
- Можно решить с помощью операторов ветвления
- Для конвертации int в std::string можно использовать std::to_string(...)

Решение

#include <string>

using namespace std;
string fizzBuzz(int num){
if (num % 3 == 0 and num % 5 == 0) {
return «FizzBuzz»;
} else if (num % 3 == 0) {
return «Fizz»;
} else if (num % 5 == 0) {
return «Buzz»;
} else {
return std::to_string(num);
}
}
🍯 Задача с собеседования

Входные данные:
- Дан массив состоящий из int'ов
- Повторяющихся элементов в списке нет

Задача:
- Нужно преобразовать этот массив в строку, сворачивая соседние по числовому ряду числа в диапазоны

Примеры:
[1,4,5,2,3,9,8,11,0] => "0-5,8-9,11"
[1,4,3,2] => "1-4"
[1,4] => "1,4"

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <sstream>

std::string convertToRanges(std::vector<int>& nums) {
if (nums.empty()) {
return "";
}

// Сортируем вектор
std::sort(nums.begin(), nums.end());

std::vector<std::string> ranges;
int start = nums[0];
int prev = start;

for (size_t i = 1; i < nums.size(); ++i) {
if (nums[i] != prev + 1) {
// Если последовательность прервалась, добавляем диапазон
if (start == prev) {
ranges.push_back(std::to_string(start));
}
else {
ranges.push_back(std::to_string(start) + "-" + std::to_string(prev));
}
start = nums[i];
}
prev = nums[i];
}

// Добавляем последний диапазон
if (start == prev) {
ranges.push_back(std::to_string(start));
}
else {
ranges.push_back(std::to_string(start) + "-" + std::to_string(prev));
}

// Объединяем диапазоны в одну строку
std::ostringstream result;
for (size_t i = 0; i < ranges.size(); ++i) {
if (i > 0) {
result << ",";
}
result << ranges[i];
}

return result.str();
}

int main() {
std::vector<int> nums1 = { 1, 4, 5, 2, 3, 9, 8, 11, 0 };
std::cout << convertToRanges(nums1) << std::endl; // Ожидаемый вывод: "0-5,8-9,11"

std::vector<int> nums2 = { 1, 4, 3, 2 };
std::cout << convertToRanges(nums2) << std::endl; // Ожидаемый вывод: "1-4"

std::vector<int> nums3 = { 1, 4 };
std::cout << convertToRanges(nums3) << std::endl; // Ожидаемый вывод: "1,4"

return 0;
}