Задача №2
Сделать программу, которая бы для строки вида
str = "{Пожалуйста|Просто} сделайте так, чтобы это {удивительное|крутое|простое} тестовое предложение {изменялось {быстро|мгновенно} случайным образом|менялось каждый раз}.";
Например, для str="{A|B|C} тест"; три варианта:
- "А тест"
- "Б тест"
- "С тест"
для str = "{A|B} {A|B}"; четыре варианта
- "A A"
- "B B"
- "A B"
- "B A"
для str = “{A|D {B|C}} тест”; три варианта
- “A тест”
- “D B тест”
- “D C тест”
выдавала все возможные варианты (вложенность скобок не ограничена) за один запуск.
Алгоритм
Очевидно, что для перебора всех возможных вариантов отлично подходит рекурсия.
- Написать регулярное выражение для паттерна "{bla bla bla}", причем важно учесть вложенность скобок, т.е.
например: "{изменялось {быстро|мгновенно} случайным образом|менялось каждый раз}" необходимо, чтобы метчилась самая внутренняя пара скобок - {быстро|мгновенно}. '\{([^{]+?)\}' - данное регулярное выражение прекрасно справляется с задачей. - Используя регулярное выражение найти подстроку в исходной строке.
- Разделить полученную строку на массив строк, в качестве разделителя выступает '|'
- Пройтись по полученному массиву, заменяя раннее найденную подстроку в п.2 на строку из массива, и вызвать рекурсию для полученной новой строки.
- Условие выхода из рекурсии - если в строке (которая является аргументов функции) не будет обнаружен символ '|'. Если символ не обнаружен записать значение в map, поскольку при такой рекурсии неизбежны повторяющиеся значения (см. рисунок)
Псевдо код
func (str) {
if (строка содержит '|') {
add to map
return
}
substr = подстрока на основе регулярного выражения
mas = split(substr, '|')
for mas {
newstr = заменить в исходной строке substr на mas[i]
func(newstr)
}
}
Задача №1
Дана таблица Staff (id int, salary int). Id – primary key Напишите запрос, который возвращает вторую по величине зарплату (после самой высокой). Если таковой нет, то запрос должен возвращать null.
Алгоритм
1.Создать вложенный запрос, который будет выводить вторую по величине зарплату.
2.Создать основной запрос, который проверяет первый на null.
SELECT IFNULL( (SELECT DISTINCT salary
FROM Staff
ORDER BY salary DESC
LIMIT 1,1), null) as SecSalary
FROM Staff