#arrays #python-3.x #string
#массивы #python-3.x #строка
Вопрос:
Я работал над этой проблемой в leetcode https://leetcode.com/problems/string-compression /
Учитывая массив символов, сожмите его на месте.
Длина после сжатия всегда должна быть меньше или равна исходному массиву.
Каждый элемент массива должен быть символом (не int) длиной 1.
После того, как вы закончите изменять входной массив на месте, верните новую длину массива.
У меня почти есть решение, но, похоже, я не могу посчитать последний символ в строке, и я также не уверен, как это сделать, если есть только количество одного символа, которое я не показываю 1 в массиве.
Я чувствую, что я довольно близок, и я хотел бы попытаться сохранить решение, которое у меня есть, не изменяя его слишком сильно, если это возможно.
Это то, что у меня есть до сих пор. chars
это список символов
def compress(chars):
char = 0
curr = 0
count = 0
while curr < len(chars):
if chars[char] == chars[curr]:
count = 1
else:
# if count == 1:
# break
# else:
chars[char-1] = count
char = curr
count = 0
curr = 1
chars[char-1] = 1
return chars
print(compress(["a", "a", "b", "b", "c", "c", "c"]))
Ответ №1:
Я не совсем смог отформатировать ваш код, чтобы получить ответ, который вы искали. Основываясь на вашем ответе, я смог собрать код и объяснение, которые могли бы вам помочь:
def compress(chars):
count = 1
current_position = 0
# if it's a single character, just return a
# a basic array with count
if len(chars) == 1:
chars.append("1")
return chars
# loop till the 2nd last character is analyzed
while current_position < len(chars) - 1:
# assume that we haven't reached the 2nd last character
# if next character is the same as the current one, delete
# the current one and increase our count
while current_position < len(chars) - 1 and
chars[current_position] == chars[current_position 1]:
del chars[current_position]
count = 1
# if next character isn't the same, time to add the count to
# the list. Split the number into
# character list (e.g. 12 will become ["1", "2"]
# insert those numbers behind the character and increment position
for x in str(count):
chars.insert(current_position 1, str(x))
current_position = 1
# great, on to the next character
current_position = 1
# if we are now at the last character, it's a lonely character
# give it a counter of 1 and exit the looping
if current_position == len(chars) - 1:
chars.append("1")
break
count = 1
return chars
mylist = ["a","b","b","b","b","b","b","b","b","b","b","b","b"]
print(compress(mylist))
Результаты
mylist = ["a","b","b","b","b","b","b","b","b","b","b","b","b"]
['a', '1', 'b', '1', '2']
mylist = ["a","a","a","a","a","a","a","a","a","a","b","b","b","b","b","b","b","b","b","b","b","b"]
['a', '1', '0', 'b', '1', '2']
mylist = ["a"]
['a', '1']
mylist = ["a","b"]
['a', '1', 'b', '1']
mylist = ["a","a","b","b","c","c","c"]
['a', '2', 'b', '2', 'c', '3']