Задачи на указатели

Решите задачи без квадратных скобок кроме создания массива и конструкций вида *(a+i).  

A: Ближайшее число

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

В первой строке заданы элементы массива (целые числа, не превосходящие по модулю 1000).

Во второй строке дано одно целое число \(x\), не превосходящее по модулю 1000.

Выведите значение элемента массива, ближайшее к \(x\). Если таких чисел несколько, выведите последнее из них.

Ввод Вывод
5
3 8 4 7 9
5
4
5
1 2 4 5 6
3
4
3
1 2 3
2
2

C: Соседи одного знака

Дан массив. Если в нем есть два соседних элемента одного знака, выведите эти числа. Если соседних элементов одного знака нет - не выводите ничего. Если таких пар соседей несколько - выведите первую пару.

Примечание. В этой задаче нужно реализовать алгоритм линейного поиска: найти такую первую пару элементов, удовлетворяющую заданному условию. Алгоритм линейного поиска пишется при помощи цикла while, а не при помощи цикла for.

Ввод Вывод
5
-1 2 3 -1 -2
2 3

D: Переставить соседние

Переставьте соседние элементы массива (A[0] c A[1], A[2] c A[3] и т.д.). Если элементов нечетное число, то последний элемент остается на своем месте.

Ввод Вывод
5
1 2 3 4 5
2 1 4 3 5

E: Циклический сдвиг вправо

Циклически сдвиньте элементы массива вправо (A[0] переходит на место A[1], A[1] на место A[2], ..., последний элемент переходит на место A[0]).

Используйте минимально возможное количество операций присваивания.

Ввод Вывод
5
1 2 3 4 5
5 1 2 3 4

F: В обратном порядке

Дана строка. Выведите её символы в обратном порядке, по одном символу в строке.

Ввод Вывод
Python
n
o
h
t
y
P

G: Количество слов

Дана строка, состоящая из слов, разделенных пробелами. Определите, сколько в ней слов.

Ввод Вывод
Hello world
2

H: Удаление символа

Дана строка. Удалите из этой строки все символы @.

Ввод Вывод
Bilbo.Baggins@bagend.hobbiton.shire.me
Bilbo.Bagginsbagend.hobbiton.shire.me

Создавайте строку на миллион символов. Использовать вторую строку нельзя.

I: Две половинки

Дана строка. Разрежьте ее на две равные части (если длина строки — четная, а если длина строки нечетная, то длина первой части должна быть на один символ больше). Переставьте эти две части местами.

Результат выведите *в звездочках*.

Ввод Вывод
Hi
*iH*
Hello
*loHel*

Создавайте строку на миллион символов. Использовать вторую строку нельзя.

J: Переставить два слова

Дана строка, состоящая ровно из двух слов, разделенных пробелом. Переставьте эти слова местами.

Ввод Вывод
Hello world
*world Hello*

K: Замена подстроки

Дана строка. Замените в этой строке все цифры 1 на слово one.

Ввод Вывод
1+1=2
one+one=2

Программа должна

  1. Динамически создавать массив на 1000 символов, читать в нее строку
  2. Создавать вторую строку нужной длины длины, формировать там ответ
  3. Очищать память, занятую исходной строкой
  4. Переприсваивать указатель, так чтобы при выводе первой строки выводился ответ

N: Удалить каждый третий символ

Дана строка. Удалите из нее все символы, чьи индексы делятся на 3.

Решение выведите так же, как в задаче «Две половинки».

В этой задаче вам придётся использовать цикл.

Ввод Вывод
Python
*yton*

Программа должна выполнять действия по алгоритму предыдущей задачи

L: Метод бутерброда

Секретное агентство решило для шифрования переписки своих сотрудников использовать «метод бутерброда». Сначала буквы слова нумеруются в таком порядке: первая буква получает номер 1, последняя буква - номер 2, вторая – номер 3, предпоследняя – номер 4, потом третья … и так для всех букв (см. рисунок). Затем все буквы записываются в шифр в порядке своих номеров. Например, слово «sandwich» зашифруется в «shacnidw».

К сожалению, программист агентства, написал только программу шифрования и уволился. И теперь агенты не могут понять, что же они написали друг другу. Помогите им.

Вводится слово, зашифрованное методом бутерброда. Выведите расшифрованное слово.

Решение выведите так же, как в задаче «Две половинки».

Решите эту задачу при помощи срезов, не используя циклы.

Ввод Вывод
Aabrrbaacda
*Abracadabra*

N: Скрытие адреса email

Для защиты от ботов, собирающих с web-страниц адреса электронной почты для рассылки спама, используются методы скрытия адреса электронной почты. Рассмотрим самый простой метод скрытия: в адресе электронной почты символы «.» меняются на «(dot)», символ «@» меняется на «(at)».

Дана строка текста, в ней есть один адрес электронной почты (он содержит один символ «@»). В адресе электронной почты (считайте, что адрес — это слово, отделённое пробелами) выполните указанные замены, в остальных местах замены производить не нужно.

Решение выведите так же, как в задаче «Две половинки».

Ввод Вывод
Bilbo.Baggins@bagend.hobbiton.shire.me - valid email.
*Bilbo(dot)Baggins(at)bagend(dot)hobbiton(dot)shire(dot)me - valid email.*

В этой задаче напишите функцию char* replace(char* s, char *pos, char *replacement), которая принимает строку, указатель на символ, который нужно заменить и строку на которую надо заменить. Функция должна возвращать новую строку.

O: Удалить один символ

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

Программа получает на вход одну строку и должна вывести единственное число: номер символа в строке, при удалении которой слово становится палиндромом, нумерация начинается с 1. Если при удалении любого символа строка не станет палиндромом, программа должна вывести число 0.

Длина входной строки может быть от 2 до 100.000 символов, решение должно иметь сложность \(O(n)\), где \(n\) — длина строки.

Ввод Вывод
raceczar
6
car
0