Как удалить определенные элементы из массива, не удаляя его более поздние вхождения - PullRequest
1 голос
/ 12 апреля 2019

Получите целочисленный ввод от пользователя, а затем удалите элементы из массива, имеющие много последовательных вхождений из массива.

Например, массив ввода «aabcca», а ввод от пользователя - 2. Тогда ответ должен быть «ба».

Я пробовал, когда элементы не повторяются. Мой код отлично работает для примеров типа "aaabbccc".

for j in range(t, (n+1)):
    if (t == n):
        if (count == k):
            array = [x for x in array if x != temp]
        print array
        exit()
    if (t == n and count == k):
        array = [x for x in array if x != temp]
        print array
        exit()
    if temp == data[j]: 
        count += 1
        t += 1
    if temp != data[j]:
        if count == k:
            array = [x for x in array if x != temp]
        temp = data[t]
        count = 1
        t += 1

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Вот один из способов сделать это:

def remove_consecutive(s, n):
    # Number of repeated consecutive characters
    count = 0
    # Previous character
    prev = None
    # Pieces of string of result
    out = []
    for i, c in enumerate(s):
        # If new character
        if c != prev:
            # Add piece of string without repetition blocks
            out.append(s[i - (count % n):i])
            # Reset count
            count = 0
        # Increase count
        count += 1
        prev = c
    # Add last piece
    out.append(s[len(s) - (count % n):])
    return ''.join(out)

print(remove_consecutive('aabcca', 2))
# ba
print(remove_consecutive('aaabbccc', 2))
# ac
print(remove_consecutive('aaabbccc', 3))
# bb
0 голосов
/ 12 апреля 2019

вы можете использовать sliding window или two pointers для ее решения.

ключевым моментом является использование диапазона [start, end] для записи последовательных последовательностей и добавление только тех последовательностей, длина которых меньше n:

def delete_consecutive(s, n):
    start, end, count = 0, 0, 0
    res, cur = '', ''
    for end, c in enumerate(s):
        if c == cur:
            count += 1
        else:
            # only add consecutive seq less than n
            if count < n:
                res += s[start:end]
            count = 1
            start = end
            cur = c

    # deal with tail part
    if count < n:
        res += s[start:end+1]

    return res

тест и вывод:

print(delete_consecutive('aabcca', 2))      # output: ba
print(delete_consecutive('aaabbccc', 3))    # output: bb

Надеюсь, что это поможет вам, и прокомментируйте, если у вас есть дополнительные вопросы. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...