Как найти длину самой длинной последовательности

Текстовый файл состоит не более чем из 10^6 символов L, D и R. Определите длину самой длинной последовательности, состоящей из символов R.

Сразу скажу, я в пайтоне новичок, поэтому всё, что смог написать так это:

f = open("zadanie24_2.txt")
s = f.readlines()
m = 0
for i in s:
    if s(i) == "R" and s(i + 1) == "RR":
        m+=1
print(m)

Прилетела вот такая ошибка

Traceback (most recent call last):
  File "c:UsersstasoOneDriveРабочий СтолPyExamOption 124.py", line 5, in <module>
    if s(i) == "R" and s(i + 1) == "RR":
TypeError: 'list' object is not callable

Где-то в инете нашёл этот код, в него подставлял свои значения, но опять же ничего не вышло

# откроем файл на чтение
F = open ('zadanie24_2.txt', 'rt')

# T - список файла F
T = F.read ().split ()

K = 1 # K - число одинаковых чисел
A = [] # список длин цепочек одинаковых чисел
for i in range (0, len (T) - 1) :
  #print (T [i], end = '')
  if T [i] == T [i + 1] :
    K += 1
  else :
    A += [K]
    K = 1

A += [K]

F.close ()

R = open ('result.txt', 'wt')
R.write (str (max (A)))

R.close ()
print ('Файл result.txt записан')

Помогите, кто может

m_avrina

Всем привет!
Дан массив чисел, в нем необходимо найти длину самой длинной последовательности(последовательность может быть только с разнице на 1) за O(n)
Собственно вот пример:
1 2 433 500 3 900 4
Следовательно длинная самая последовательность 4(1 2 3 4)
И вот как это все реализовать за 1 проход
Может какие-то наводки/ссылки/статьи


  • Вопрос задан

    более трёх лет назад

  • 418 просмотров



5

комментариев

Пригласить эксперта


Ответы на вопрос 4

demon416nds

Дмитрий

@demon416nds

Разработчик на чем попало

банальным проходом с подсчетом длины текущей последовательности

Astrohas

Astrohas

@Astrohas

Python/Django Developer

https://www.youtube.com/watch?v=t2DpD9GnhfU гуровиц объясняет более внятно.
Просто берете стандартный алгоритм, при n-ом итеме проверяете его разницу в значениях и если разница равно 1 то только тогда увеличиваете счетчик.

tsarevfs

Хранить hash map, в которой ключ — значение последнего элемента в последовательности встреченной раньше, а значение — длина. И дальше проходим по массиву и заполняем.


Похожие вопросы


  • Показать ещё
    Загружается…

28 мая 2023, в 00:03

8000 руб./за проект

27 мая 2023, в 23:03

10000 руб./за проект

27 мая 2023, в 22:55

1000 руб./за проект

Минуточку внимания

0 / 0 / 0

Регистрация: 15.01.2012

Сообщений: 8

1

Найти длину самой длинной последовательности стоящих рядом одинаковых элементов.

11.03.2012, 19:41. Показов 20130. Ответов 2


Студворк — интернет-сервис помощи студентам

Заполнить массив из 10 элементов случайными числами в интервале [10,12] и найти длину самой длинной последовательности стоящих рядом одинаковых элементов.

как пример:
исходный массив:
10 10 11 [ 12 12 12 ] 10 11 12 10
Длина последовательности: 3



0



qnak

58 / 58 / 45

Регистрация: 19.02.2012

Сообщений: 118

11.03.2012, 20:02

2

Лучший ответ Сообщение было отмечено kykan как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
program asdassg;
var a:array [1..10]of integer;i,lmax,l:integer;
begin
    for i:=1 to 10 do a[i]:=random(3)+10;
    
    lmax:=0; l:=0;
    for i:=2 to 10 do begin
    if a[i]=a[i-1] then l:=l+1 else l:=1;
                                if l>lmax then  lmax:=l;
end;
                                writeln(lmax);
  end.

Добавлено через 1 минуту
тестировал, работает



2



versa4e

trainspotting

1086 / 486 / 384

Регистрация: 11.11.2010

Сообщений: 773

11.03.2012, 20:19

3

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
lmax:=1; l:=1;
for i:=2 to 10 do 
  begin
    if a[i]=a[i-1] then 
      l:=l+1 
    else
      begin            
        if l>lmax then lmax:=l;
        l:=1;
      end;
  end;
if l>lmax then lmax:=l;
writeln(lmax);



1



Это была проблема, которая поставила меня в тупик и не позволила вовремя завершить соревнование по программированию. Предысторию можно найти здесь. Решение публикуется в последующем посте.

Проблема

(Объяснение на простом английском языке см. в следующем разделе.)

Вам дан двумерный массив A из N строк и M столбцов. Существует два массива I и J, элементы которых представляют индексы строк и индексы столбцов A соответственно. Должны быть соблюдены следующие условия:

I и J имеют длину L

I не уменьшается. То есть I[p] ≤ I[p+1] для всех o ≤ p ‹ L-1

J не убывает. То есть J[p] ≤ J[p+1] для всех o ≤ p ‹ L-1

Каждый элемент I[p] представляет индекс строки A, а каждый элемент J[p] представляет индекс столбца A . Другими словами:

Для всех 0 ≤ p ‹ L:

0 ≤ I[p] < N

0 ≤ J[p] < M

Индексы строк и столбцов в I и J используются для формирования подпоследовательности A. По сути, это массив длины L с индексами 0 ≤ p ‹ L, где каждый элемент равен A [I[p]] [J[p] ].

Подпоследовательность увеличивается.

Таким образом, для всех o ≤ p ‹ L-1:

A [I[p]] [J[p]] < A [I[p+1]] [J[p+1]]

Какова длина самой длинной возможной подпоследовательности A?

Мой мыслительный процесс

Что они просят простым английским языком?

Понимание проблемы

Всякий раз, когда я вижу проблему такого рода, я понятия не имею, о чем она просит, поэтому, конечно, первое, что я делаю, — это визуализирую ее.

Итак, давайте нарисуем двумерный массив A с N строками и M столбцами.

А как насчет массивов I и J? А эта беспорядочно выглядящая куча символов, A [I[p]] [J[p]]? Давайте попробуем упростить это, взглянув сначала на I и J.

I и J – это массивы индексов строк и столбцов двумерного массива A. Так что же такое I[p]и J[p]? Это будут p индекс строки и p индекс столбца.

Предположим, что I[p] равно 3, а J[p] равно 3. Таким образом, A [I[p]] [J[p]] просто относится к элементу в A, в строке 3 и >колонка 3!

Итак, как это связано с тем, что мы делаем? Напомним, что мы пытаемся найти подпоследовательность A. (Проще говоря, мы выбираем набор различных элементов из A.) Подпоследовательность упорядочена, поэтому A [I[p]] [J[p]] — это еще один способ обозначить элемент pth в этой подпоследовательности!

Но очевидно, что мы не можем просто взять кучу случайных элементов и на этом остановиться. Итак, каковы условия?

  1. Подпоследовательность должна быть возрастающей, поэтому каждый член должен быть больше предыдущего.
  2. Индексы строк и индексы столбцов должны быть неубывающими. Ключевое отличие состоит в том, что каждый термин может быть больше или равен предыдущему.

Как описать это более простыми словами? Оказывается, это довольно легко понять, когда вы визуализируете это.

Здесь мы видим, что выбираем элементы из A, и есть очевидная закономерность — мы можем двигаться только слева направо и сверху вниз< /сильный>.

Почему мы не можем идти справа налево или снизу вверх? Потому что это нарушило бы требование неубывания I и J.

Имейте в виду, что элементы в подпоследовательности должны увеличиваться (в порядке возрастания).

Как видите, может быть более одной возможной подпоследовательности, в которой ее элементы возрастают.

Наша задача — найти длину максимально длинной подпоследовательности. (Может быть более одной самой длинной подпоследовательности, но всегда есть только одна возможная длина.)

Решение

Я сохранил решение для последующего поста, так как считаю, что эти посты (особенно технические) пишутся довольно долго! Быть в курсе.

Suppose we have an unsorted array of numbers, we have to find the length of the longest
sequence of consecutive elements.

So, if the input is like nums = [70, 7, 50, 4, 6, 5], then the output will be 4, as the longest
sequence of consecutive elements is [4, 5, 6, 7]. so we return its length: 4.

To solve this, we will follow these steps −

  • nums := all unique elements of nums

  • max_cnt := 0

  • for each num in nums, do

    • if num — 1 not in nums, then

      • cnt := 0

      • while num is present in nums, do

        • num := num + 1

        • cnt := cnt + 1

      • max_cnt := maximum of max_cnt and cnt

  • return max_cnt

Let us see the following implementation to get better understanding −

Example

 Live Demo

class Solution:
   def solve(self, nums):
      nums = set(nums)
      max_cnt = 0
      for num in nums:
         if num - 1 not in nums:
            cnt = 0
            while num in nums:
               num += 1
               cnt += 1
            max_cnt = max(max_cnt, cnt)
      return max_cnt
ob = Solution()
nums = [70, 7, 50, 4, 6, 5]
print(ob.solve(nums))

Input

[70, 7, 50, 4, 6, 5]

Output

4

Понравилась статья? Поделить с друзьями:
  • Как найти давление атмосферы на глубине
  • Кэтвар как найти друзей
  • Как найти работу рядом дома
  • Как составить строительную смету для заказчика
  • Как найти процентное соотношение двух чисел формула