Это очень расплывчатый вопрос, хотя это не особенно сложно, если подумать. Как вы говорите, декодирование A3
как AAA
и просто запись его на место перезапишут символы B
и 1
, так почему бы не просто сначала переместить их дальше по массиву?
Например, когда вы прочитали A3
, вы знаете, что вам нужно освободить место для одного дополнительного символа, если это было A4
, вам понадобится два, и так далее. Для этого вы должны найти конец строки в массиве (сделайте это заранее и сохраните его индекс).
Затем выполните цикл, перемещая персонажей в их новые слоты:
Для начала: A|3|B|1|C|2|||||||
Имейте переменную с именем end
, хранящую индекс 5, то есть последнюю непустую запись.
Вы прочитали бы в первой паре, используя переменную с именем cursor
, чтобы сохранить текущую позицию - поэтому после чтения в A
и 3
она будет установлена в 1 (слот с 3 ).
Псевдокод для хода:
var n = array [cursor] - 2; // n = 1, 3 от A3, а затем минус 2, чтобы учесть пару.
для (i = end; i> курсор; i ++)
{
массив [i + n] = массив [i];
}
Это оставило бы вас с:
A|3|A|3|B|1|C|2|||||
Теперь A
уже существует, так что теперь вы хотите написать n + 1
A
, начиная с индекса, хранящегося в cursor
:
for(i = cursor; i < cursor + n + 1; i++)
{
array[i] = array[cursor - 1];
}
// increment the cursor afterwards!
cursor += n + 1;
Предоставление:
A|A|A|A|B|1|C|2|||||
Затем вы указываете на начало следующей пары значений, готовых к повторению. Я понимаю, что в этом ответе есть некоторые пробелы, хотя это намеренно, поскольку это вопрос интервью! Например, в крайних случаях, которые вы указали A1B1
, вам понадобится другой цикл для перемещения последующих символов назад, а не вперед.