Список массивов и поиск самой длинной подпоследовательности с тем же номером [закрыто]

StackOverflow https://stackoverflow.com//questions/22077983

  •  23-12-2019
  •  | 
  •  

Вопрос

Мне было интересно, каким был бы наилучший способ реализовать это.

Не могу придумать хорошего способа сохранить ту информацию, которая должна быть сохранена, например индекс и количество значений и, наконец, фактическое число, которое повторяется

public class testing 
{

public static void main(String[] args) 
{
    ArrayList<Integer> numbers = new ArrayList<Integer>();
    Scanner in = new Scanner(System.in);
    Integer a =0;
    Integer value = 0;
    Integer num = 0;

    boolean loop = true;
    //getting the string information
    while(loop)

    {
        System.out.println("Enter a series of numbers, 0 to stop");
        Integer n = in.nextInt();
        if(n.equals(0))
        {
            break;
        }
        else
        { 
            numbers.add(n);         

        }



    }

    for (int i = 1; i < numbers.size(); i++)
    { 




    }

}



}
Это было полезно?

Решение

Вы могли бы использовать 2d ArrayList, объявленный следующим образом:

ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();

а затем объявите 2 списка ArrayLists, которые будут добавлены к нему в конце процесса:

ArrayList<Integer> length = new ArrayList<Integer>();

ArrayList<Integer> value = new ArrayList<Integer>();

Затем

1) выполните итерацию по списку, проверяя, совпадает ли элемент с предыдущим.

Если это так, продолжайте до тех пор, пока не закончится или не будет обнаружен элемент, который отличается, и в этот момент сохраните количество предыдущих равных элементов в ArrayList, называемом "длина", и значение элемента в том, которое называется "значение".Есть int (называемый, скажем, index), который хранит индекс элемента в length, содержащий длину самой длинной текущей подпоследовательности (которая будет такой же, как индекс элемента, содержащий значение элемента, из которого он состоит (который был сохранен в value)).

Если это не так, переходите к следующему элементу.

2) Повторите процесс, обновляя индекс при необходимости (т.е.если обнаружена более длинная подпоследовательность).

Чтобы добавить длину и значение к результату в конце, просто сделайте result.add(length); и result.add(value);

Если вы хотите вернуть один объект, содержащий всю необходимую информацию, вы могли бы обернуть int 'index' в целое число и добавить его в конец ArrayList с именем 'length' или даже поместить его в новый ArrayList и добавить этот ArrayList к результату.

Обратите внимание, что для извлечения элемента с индексом i в первом ArrayList (в данном случае элемента с именем 'length') после того, как он был сохранен в result, вам нужно будет выполнить

result.get(0).get(i);

РЕДАКТИРОВАТЬ:

Итак, часть цикла for, которую я имел в виду, была бы такой:

boolean same = false;
int sequenceLength = 0;
Integer sequenceInteger = null; 

for (int i = 1; i < numbers.size(); i++)
        { 
            if(numbers.get(i).equals(numbers.get(i-1)))
                {
                      same = true;
                      sequenceLength++;
                }      
            else(if same == true)
                {
                      sequenceInteger = new Integer(sequenceLength);
                      //add sequenceInteger to length and numbers.get(i-1) to value 
                      same = false;
                      sequenceLength = 0;
                }
            // else do nothing since same is false, which means that the current
            // element is different from the previous and the previous is 
            // different the one before that, so there are no new values to store
        }
// end of list reached
(if same == true)
{
      sequenceInteger = new Integer(sequenceLength);
      //add sequenceInteger to length and numbers.get(i-1) to value 
      same = false;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top