2012-12-05 3 views
3

Прежде всего, я java newb. Я искал краткий подход к этой проблеме, который не включает списки или хэш-таблицы, но еще не нашел его:Stumped: обнаружение идентичной последовательности целых чисел в двух целых массивах

** Обратите внимание, что это не домашнее задание, НО это упражнение № 14 в главе 7 «Построение программ Java»

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

Пример:

Integer[] list1 = {1,6,2,1,4,1,2,1,8}; 

Integer[] list2 = {1,2,1}; 

Вызов contains(list1, list2) вернется true. Я получаю идею вложенных для петель, которые могут перебрать массив, но я не могу видеть четкое решения:

public static Boolean contains(Integer[] listOfNumbers1, Integer[] listOfNumbers2){ 

    for(int i = 0 ; i < listOfNumbers2.length; i++){ 

     for(int j = 0 ; j < listOfNumbers1.length; j++){ 

     } 
    } 

    return true; 
} 
+1

Сначала нужно решить, если вы хотите найти последовательности (как сказано в названии) или сравнить как наборы - только наличие всех элементов второго набора в первый набор (как представляется, в задаче). Код будет существенно отличаться. –

ответ

1

Поэтому в основном мы хотим перебрать каждую позицию в поисковом массиве (listOfNumbers1) и проверки является ли это началом последовательности мы ищем (listOfNumbers2)

// Loops through the search array 
for(int i = 0; i < listOfNumbers1.length; i++) 
{ 
    boolean found = true; 
    for(int j = 0; j < listOfNumbers2.length; j++) 
    { 
     /* Check if the following conditions hold 
      - Not going to cause an ArrayIndexOutOfBoundsException 
      - Values do **not** match => set found to false */ 
     if(i+j < listOfNumbers1.length && listOfNumbers1[i + j] != listOfNumbers2[j]) 
     { 
      // Didn't find the sequence here 
      found = false; 
     } 
    } 

    // If found is still true, we have found the sequence and can exit 
    if(found) return true; 
} 

return false; 
+1

Более эффективно; измените 'found = false' на' return false' и сбросьте флаг. Нет смысла сравнивать остальные элементы, когда вы уже провалились. И окончательное 'return false' должно быть затем' return (listOfNumbers1.length! = 0 || listOfNumbers2.length == 0) '. –

+0

Правильно, но я не хотел путать ОП, который все еще учится подходить к вопросу. Как только он/она подсчитает, что оптимизация возможна – ose

+0

Кроме того, вы можете зацикливать 'i' до первой длины меньше второй длины; 5-символьная последовательность не будет найдена, если осталось всего 3 символа. Это избавляет от внутренней проверки длины каждого цикла. – Amadan

0
class contains{ 
    public static void main(String[] args){ 
     int[] list1 = {1,6,2,1,4,1,2,1,8}; 
     int[] list2 = {1,2,1}; 

     if(contains(list1, list2)){ 
      System.out.println("list2 found in list1"); 
     } 
     else { 
      System.out.println("list2 not found in list1"); 
     } 
    } 

    public static boolean contains(int[] listOfNumbers1, int[] listOfNumbers2){ 
     if(listOfNumbers2.length > listOfNumbers1.length){ 
      return false; 
     } 
     for(int j = 0 ; j < listOfNumbers1.length - listOfNumbers2.length + 1; j++){ 
      for(int i = 0 ; i < listOfNumbers2.length; i++){ 
       if(listOfNumbers1[j+i] != listOfNumbers2[i]){ 
        break; 
       } 
       else { 
        if(i == listOfNumbers2.length-1){ 
         return true; 
        } 
       } 
      } 
     } 
     return false; 
    } 
} 
+0

-1. Если вы жестко задаете размер второго массива, почему бы не пойти на один шаг больше ответа на весь жесткий код - 'return true' намного короче/безопаснее verisn данного постоянного ввода. –

+0

@ AlexeiLevenkov вы правы - видимо, я слишком устал, чтобы отвечать на вопросы. Я исправил свой ответ на переменную длину, и я пойду спать. – Tad

+0

+1 хорошо выглядит сейчас :) –

2

(вы действительно не указать, хотите ли необходимо учитывать, от вас, например, он выглядит, как вы пытаетесь см., если массив1 имеет все элементы массива2 по порядку)

Есть несколько различных случая:

1. array2 is longer than array1: 
     if this is the case the result must be false because array1 can't 
     possibly have the same elements in order since array2 is longer 

2. array2 is the same size as array1: 
     for this step you can use a single loop and compare the elements in order, 
     if you find a mismatch then array1 does not contain array2 

     for i from 0 to length do 
      if array1[i] != array2[i] 
       // false 
      end 
     end 
     // true 

3. array2 is shorter than array1: 
     for this case you need to examine every array2.length elements from array1 
     and see if they match array2 

     matches = 0 
     for i from 0 to array1.length do 
      for j from 0 to array2.length do 
       if array1[i] == array2[j] 
        // increment i 
        // increment matches 
       end 
      end 
      if matches == array2.length 
       // true 
      else 
       // false 
      end 
      matches = 0 // reset matches 
     end 
+0

+1. Хорошая запись в последовательности. Обратите внимание, что для этой проблемы существует более оптимальное решение, когда вы переходите от базового - искать «алгоритмы поиска подстроки». –

+0

@AlexeiLevenkov Да, я подумал, следует ли ссылаться на более сложные алгоритмы сопоставления, например, Warshall или Floyd, но я решил не делать этого, потому что это похоже на более вводный вопрос. Это хорошая идея указать на это, хотя, спасибо, я сделаю редактирование. –

+0

# 1 и # 2 - особый случай # 3, где внешний цикл будет иметь 0 или 1 итерацию соответственно. Я бы сказал, что нет никакой производительности, которую нужно получить, и ясности, которую можно потерять, отделив дела. – Amadan

Смежные вопросы