2010-03-07 37 views
3

我正在研究一個算法,我需要能夠傳遞一個List並查看列表中任何點是否有四個數字在一行中。在一行中查找數字?

我一直在努力用一個簡單的方法來做到這一點......這裏是基本的想法..我想fourNumbersInARow()方法返回true:

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 2010-03-07 05:53:47

+0

這是一個功課題嗎? – monksy 2010-03-07 05:56:15

+0

有點......它是一個很大的問題的一小部分 – systemoutprintln 2010-03-07 16:43:55

回答

1

以下是一個Java的實現,這將返回true。

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_valuerow_count。逐一瀏覽列表,總是看當前值是否比last_value大1;如果是,則增加row_count,否則將其重置爲1。無論如何,將last_value設置爲當前值和循環。如果在任何時候row_count變爲4,則返回true。如果您到達列表的末尾,請返回false

編輯:改變計數器範圍從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

啊......如果有四個增量到'consecutiveCount',而不是四個連續的數字,這個返回值是不是會返回true? (說:1,2,4,5,7,8,10,11將返回true,不是嗎?我不確定這是OP試圖做什麼。) – Ash 2010-03-07 05:56:58

+0

@Ash:好點,謝謝你指出了! – coobird 2010-03-07 06:22:24

+0

我認爲它應該是(number-lastNumber)== 1,而不是(lastNumber-number)== 1,因爲它目前是... – 2010-03-07 06:48:33

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); 

    } 
}