Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // s - буфер ввода (обычно input), pos - массив с ОДНИМ числом (позицией текущего элемента буфера), изначально равным 0. именно массив, чтобы число можно было менять прямо из функции
- // обновил код, теперь можно вводить числа меньше 0 (с минусом)
- // Ниже паста, которую нужно писать в мысли, чтобы не прикопались к превриттену
- // ------------
- Посмотрев на входные данные, понимаем, что ввод состоит только из чисел, но этих чисел там очень много. То есть, обычный парсинг через split будет работать крайне долго
- Значит, нужно написать свой парсер, который будет итерироваться по всей строке не много раз, а один, при этом не создавая много дополнительных переменных.
- Напишу свой парсер в функции read, в качестве аргументов он будет принимать строку ввода и позицию, на которой мы остановились при парсинге в прошлый раз.
- Для начала, проверим, является ли первый символ числа знаком минуса. Если да, заведём специальный флаг, который нам будет напоминать. что мы считали отрицательное число.
- Затем, начинается само число. Будем посимвольно считывать его, пока текущий символ относится к цифрам ("0" - "9"). Если это не так, прерываем считывание и возвращаем число с учётом знака.
- Заметим, что аргумент pos - это массив, состоящий из одного числа, в котором мы храним текущую позицию в строке ввода. Я храню именно массив из одного числа, поскольку массивы передаются по
- ссылке и значения их элементов можно менять в любой функции, в отличие от чисел, которые передаются не по ссылке -> их значение в функции не меняется.
- Наконец, в функции solve на конец input припишу пробел, чтобы при считывании последнего числа парсер не завис в бесконечном цикле.
- // ------------
- function read(s: string, pos: int[]) -> int {
- let sign = 1;
- let num = 0;
- if (s.charCodeAt(pos[0]) == 45) {
- sign = -1;
- pos[0] += 1;
- }
- while (true) {
- let d = s.charCodeAt(pos[0]) - 48;
- pos[0] += 1;
- if (d < 0) { break; }
- num = 10 * num + d;
- }
- return sign * num;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement