Медлительность вашего кода - наименьшая из его проблем.Инструменты, которые вы должны использовать:
- чистые функции,
- библиотека последовательностей,
- и, для скорости, перспектива преобразователей.
Мне нравится ваш основной алгоритм: подсчитайте случаи, когда движение up приведет вас к уровню моря.
Мы можем выразить это идиоматически следующим образом:
(defn countingValleys [n s]
(let [counter {\D 1, \U -1}
heights (reductions + (map counter s))
s-heights (map vector s heights)
valley-num (count (filter #{[\U 0]} s-heights))]
valley-num))
... или, используя ->>
макрос многопоточности ...
(defn countingValleys [_ s]
(->> s
(map {\D 1, \U -1})
(reductions +)
(map vector s)
(filter #{[\U 0]})
(count)))
Это яснее ибыстрее чем твой.
Кажется, что вы и HackerRank на самом деле используете ClojureScript.Использование "U"
в качестве элемента строки не будет работать в самом Clojure: вы должны использовать символ \U
.