2010-03-07 3 views
3

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

я боролся с простым способом сделать это ... Вот основная идея .. Я хотел бы метод fourNumbersInARow() для возврата верно:

import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 


public class Numbers { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     List<Integer> numbers = new ArrayList<Integer>(); 
     for(int i = 0; i<10; i++){ 
      numbers.add((new Random().nextInt())); 
     } 
     numbers.add(1); 
     numbers.add(2); 
     numbers.add(3); 
     numbers.add(4); 

     System.out.println(fourNumbersInARow()); 

    } 

    private static boolean fourNumbersInARow() { 


    } 

} 
+0

Элементы в списках в строках? – Zaki

+0

Это вопрос домашнего задания? – monksy

+0

Вид ... Его небольшая часть для огромной проблемы – systemoutprintln

ответ

1

Вот реализация в Java.

static boolean fourNumbersInARow(List<Integer> list) { 
    int last = 0xFACADE; // can be any number 
    int count = 0;  // important! 
    for (int i : list) { 
     if (i == last + 1) { 
      if (++count == 4) return true; 
     } else { 
      count = 1; 
     } 
     last = i; 
    } 
    return false; 
} 

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

7

Используйте две переменные: last_value и row_count. Просматривая список один за другим, всегда смотрите, будет ли текущее значение точно больше, чем last_value; если да, увеличьте row_count, если нет, сбросьте его до 1. В любом случае установите last_value на текущее значение и цикл. Если в любой момент row_count будет 4, возврат true. Если вы дойдете до конца списка, верните false.

EDIT: изменил диапазон счетчика начать с 1

0

Это звучит немного похоже на домашнее задание вопрос, так что я не хочу, чтобы написать полное решение. Но в вашем методе просто перебирайте список. Возьмите первый номер и посмотрите, появится ли следующее число после текущего, если это так, установите флаг переменной с начальной позицией и текущим номером на следующей итерации через проверку цикла, чтобы увидеть, находится ли это значение до предыдущего значения и т. д. После того, как четыре в строке найдены, вырваться из цикла и вернуть true. Если вы столкнулись с числом, которое не является хронологически правильным, установите флаг (начальное местоположение) на нуль или отрицательный и запустите процесс из текущего местоположения в списке.

1

В псевдокоде:

consecutiveCount = 1 
lastNumber = firstElementInList(list) 

for (number in list.fromSecondElement()): 
    if (number - lastNumber == 1): 
    consecutiveCount++ 
    else: 
    consecutiveCount = 1 

    if (consecutiveCount == 4): 
    return true 

    lastNumber = number 

return false 

В нижней строке, вы будете хотеть, чтобы следить за последним номером в том, что было в списке, и сравнить его с текущим номером, чтобы увидеть, если разница 1. Чтобы запомнить последнее число, необходима переменная, такая как lastNumber.

Затем, чтобы отслеживать, сколько последовательных номеров было там, должен быть счетчик для этого, который в примере около consecutiveCount.

При условии, когда произошло четыре последовательных номера, метод должен вернуть true.

+0

А ... это не вернет true в тех случаях, когда есть четыре приращения 'consecutiveCount', а не четыре последовательных числа? (Скажи: 1, 2, 4, 5, 7, 8, 10, 11 вернет истину, не так ли?Я не уверен, что это то, что пытался сделать OP.) – Ash

+0

@Ash: Хорошая точка, спасибо, что указали это! – coobird

+0

Я думаю, что это должно быть (number-lastNumber) == 1, а не (lastNumber-number) == 1, как оно есть в настоящее время ... –

0

Проверьте этот код, это возвращает истину, если последовательность из 4-х цифр и еще ложь в противном случае

public class FindFourSequence { 

    public boolean isFourinRow(ArrayList seqList) { 

     boolean flag = false; 
     int tempValue = 0; 
     int tempValue2 = 0; 
     int tempValue3 = 0; 
     int tempValue4 = 0; 
     Iterator iter = seqList.iterator(); 
     while(iter.hasNext()){ 
      String s1 = (String)iter.next(); 
      tempValue=Integer.valueOf(s1).intValue(); 
      if(!(iter.hasNext())){ 
       break; 
      } 
      String s2 = (String)iter.next(); 
      tempValue2=Integer.valueOf(s2).intValue(); 
      if(((tempValue2-tempValue)==1) || (tempValue-tempValue2)==1){ 
       if(!(iter.hasNext())){ 
        break; 
       } 
       String s3 = (String)iter.next(); 
       tempValue3=Integer.valueOf(s3).intValue(); 
       if((tempValue3-tempValue2)==1 || (tempValue2-tempValue3)==1){ 
        if(!(iter.hasNext())){ 
         break; 
        } 
        String s4 = (String)iter.next(); 
        tempValue4=Integer.valueOf(s4).intValue(); 
        if((tempValue3-tempValue4==1) || (tempValue4-tempValue3)==1){ 
         flag = true; 
         return flag; 
        } 
       } 
      } 
     } 

     return flag; 
    } 

    public static void main(String[] args) throws Exception { 

     ArrayList aList = new ArrayList(); 
     boolean flag = false; 
     FindFourSequence example = new FindFourSequence(); 
     Random random = new Random(); 
     for (int k = 0; k < 25; k++) { 
      int number = random.nextInt(20); 
      System.out.println(" the Number is :" + number); 
      aList.add("" + number); 
     } 
/*  aList.add("" + 1); 
     aList.add("" + 2); 
     aList.add("" + 3); 
     aList.add("" + 4);*/ 
     flag = example.isFourinRow(aList); 
     System.out.println(" the result value is : " + flag); 

    } 
}