Сложность: easy
Вам дана строка s, содержащая строчные английские буквы, и матрица shift, где shift[i] = [directioni, amounti]:
directioni может быть 0 (для сдвига влево) или 1 (для сдвига вправо).
amounti - это количество, на которое строка s должна быть сдвинута.
Сдвиг влево на 1 означает удаление первого символа строки s и добавление его в конец.
Аналогично, сдвиг вправо на 1 означает удаление последнего символа строки s и добавление его в начало.
Верните итоговую строку после всех операций.
Пример:
Input: s = "abc", shift = [[0,1],[1,2]]
Output: "cab"
Explanation:
[0,1] means shift to left by 1. "abc" -> "bca"
[1,2] means shift to right by 2. "bca" -> "cab"
👨💻 Алгоритм:
1⃣Пройдите по списку сдвигов, суммируя все сдвиги вправо и влево в два отдельных значения.
2⃣Определите, какое из значений больше, и частично компенсируйте его другим. Затем выполните соответствующий сдвиг с оставшимся значением. Если оба значения равны, строка останется неизменной.
3⃣Выполните сдвиг строки на основе вычисленного значения и верните итоговую строку.
😎 Решение:
class Solution {
func stringShift(_ s: String, _ shift: [[Int]]) -> String {
var leftShifts = 0
var rightShifts = 0
for move in shift {
if move[0] == 0 {
leftShifts += move[1]
} else {
rightShifts += move[1]
}
}
let netShifts = (rightShifts - leftShifts) % s.count
let netShift = netShifts < 0 ? s.count + netShifts : netShifts
if netShift == 0 {
return s
}
let splitIndex = s.index(s.startIndex, offsetBy: s.count - netShift)
return String(s[splitIndex...]) + String(s[..<splitIndex])
}
}Ставь 👍 и забирай 📚 Базу знаний