Сложность: 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 {
function stringShift($s, $shift) {
$leftShifts = 0;
$rightShifts = 0;
foreach ($shift as $move) {
if ($move[0] == 0) {
$leftShifts += $move[1];
} else {
$rightShifts += $move[1];
}
}
$netShifts = ($rightShifts - $leftShifts) % strlen($s);
if ($netShifts < 0) {
$netShifts += strlen($s);
}
if ($netShifts == 0) {
return $s;
}
return substr($s, -$netShifts) . substr($s, 0, strlen($s) - $netShifts);
}
}Ставь 👍 и забирай 📚 Базу знаний