Как сжать строку на месте

#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']