2011-06-12 67 views
2

我有代表一個數字作爲這樣的字符串:檢查了一些數字按升序排列

445123966682 

在這一幕中有3位是按升序排列:123 我想寫一個規則,檢查任何數字字符串我給它看是否有3個或更多的數字按升序或降序。

真:445123或445987 假:192837或97531

我相信最好的辦法是使用正則表達式檢查,但我不是在正則表達式是最好的。我能想到的唯一的其他選擇是迭代字符並檢查或將數字轉換爲整數,並使用模數+除法從數字中獲取每個數字,並與系列中的下一個數字進行比較。

編輯 對不起,我的意思是連續的順序。 123有效,135不是。

+1

987135999會好嗎,因爲「135」是遞增的,但不是連續的? – 2011-06-12 15:04:43

+0

你是否正在尋找一個由regex實現的解決方案? – DeveloperX 2011-06-12 15:06:42

+0

只要性能好,我都可以接受任何解決方案。 – Brandon 2011-06-12 15:08:59

回答

7

用正則表達式,它是一種簡單的:

/012|123|234|345|456|567|678|789|987|876|765|654|543|432|321|210/ 

這是愚蠢的,但問題是很簡單的啞的解決方案是最好的之一。

+0

是的。但是我從OP的例子中假定他的意思是連續的數字 - 否則他的例子'97531 - > false'將是錯誤的。 – Amadan 2011-06-12 15:05:17

+0

是的,我刪除了我的評論,因爲OP可能意味着連續的數字;) – digEmAll 2011-06-12 15:07:28

+0

它可能是一個愚蠢的解決方案,但它完美的工作。 – Brandon 2011-06-12 17:41:01

0

我不太確定您可以在這裏使用RegExp,因爲問題可能會更復雜。你需要3個數字,直接或相反的順序。看起來你可以有很多組合放入正則表達式。

我建議設計一個簡單的緩衝區和了望窗口。緩衝區大小可能等於監視窗口的大小。你在一個緩衝區中放置一個符號並檢查下一個符號的監視窗口。一步一步,你可以加上覆雜的這樣的算法要記住的地方,長度等

0

我覺得這是我會怎麼處理這個問題:

public bool TestForAscending() 
    { 
     var regex = new Regex(@"(\d)(?=(\d{2}))"); 

     var target = "120847212340876"; 

     var matches = regex.Matches(target); 

     List<string> groups = new List<string>(); 

     foreach(Match m in matches) 
     { 
      groups.Add(m.Groups[1].Value + m.Groups[2].Value); 
     } 

     return groups.Any(x => IsAscending(x)); 
    } 

    public static bool IsAscending(string x) 
    { 
     if (x.Length == 1) 
     { 
      return true; 
     } 

     int last = int.Parse(x.Last().ToString()); 
     int prev = int.Parse(x[x.Length - 2].ToString()); 

     return last == prev + 1 && IsAscending(x.Substring(0, x.Length - 1)); 
    } 

這裏有一個正則表達式,將返回每個來自目標字符串的3位數字組(您可以通過調整正則表達式中的量詞來更改要測試的連續數字的數量)。這個正則表達式的問題在於它將兩個組合分開,所以爲了得到完整的數字,你必須連接組1和組2。但這很容易。之後,您只需編寫一些方法來測試數字是否上升(我選擇了遞歸)。