Date Редакция Категория comp Теги C

Реализация выполнена на С99.

1 Массивы и строки

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

Если изменение строки разрешено, ее можно отсортировать (например, быстрой сортировкой O(n*logn)), а затем последовательно сравнить соседние элементы (O(n)).

Решение задачи потребует дополнительной памяти для хранения отметок элементов, встречавшихся в строке. Объем этой памяти зависит от количества уникальных символов алфавита, использованного в строке. Если их меньше 32 (например, только буквы a-z), то достаточно использовать один int (4*8 бит).

#include <string.h>

int is_unique_chars(const char *s)
{
    if (strlen(s) > 256) return 0; 

    int check = 0;

    for (int i = 0; i < strlen(s); i++) {
        int val = s[i] - 'a';
        if ( (check & (1 << val)) > 0 )
            return 0;
        check |= (1 << val);
    }
    return 1;
}

Если алфавит более обширен, то понадобится массив. 256 -- максимальное количество уникальных символов, помещающихся в char. Если для символов использован более "широкий" тип, то уникальных символов будет больше, однако принцип построения решения не изменится.

2. Реализуйте функцию void reverse(char* str) на С или C++. Функция должна циклически сдвигать строку, заканчивающуюся символом null.

#include <string.h>

void reverse(char *s)
{
    for (int i = 0, j = strlen(s)-1; i < j; i++, j--) {
        int c = s[i];
        s[i] = s[j];
        s[j] = c;
    }
}

3. Для двух строк напишите метод, определяющий, является ли одна строка перестановкой другой.

4. Напишите метод, заменяющий все пробелы в строке символами '%20'. Можно предположить, что длина строки позволяет сохранить дополнительные символы и «истинная» длина строки известна.

Пример:
Ввод: "Mr John Smith"
Вывод: "Mr%20John%20Smith"

5. Реализуйте метод, осуществляющий сжатие строки, на основе счетчика повторяющихся символов. Например, строка aabcccccaaa должна превратиться в а2b1с5а3. Если «сжатая» строка оказывается длиннее исходной, метод должен вернуть исходную строку.

6. Дано: изображение в виде матрицы размером NxN, где каждый пиксель занимает 4 байта. Напишите метод, поворачивающий изображение на 90°.

7. Напишите алгоритм, реализующий следующее условие: если элемент матрицы в точке МхN равен 0, то весь столбец и вся строка обнуляются.

8. Допустим, что существует метод isSubstring, проверяющий, является ли одно слово подстрокой другого. Для двух строк, s1 и s2, напишите код проверки, получена ли строка s2 циклическим сдвигом s1, используя только один вызов метода isSubstring

Пример: слово waterbottle получено циклическим сдвигом erbottlewat.



Комментарии

comments powered by Disqus