[英]Check if the digits in a number are in ascending order
我有一個代表數字的字符串:
445123966682
在該數字中,有 3 個數字按升序排列:123 我想編寫一個規則來檢查我給它的任何數字字符串,以查看是否有 3 個或更多數字按升序或降序排列。
正確:445123 或 445987 錯誤:192837 或 97531
我認為最好的方法是使用 RegEx 檢查,但我在 RegEx 方面不是最好的。 我能想到的唯一其他選擇是迭代字符並檢查或將數字轉換為 integer 並使用模+除法從數字中提取每個數字並與系列中的下一個數字進行比較。
編輯對不起,我的意思是連續的順序。 123 有效,135 無效。
使用正則表達式,這有點微不足道:
/012|123|234|345|456|567|678|789|987|876|765|654|543|432|321|210/
這很愚蠢,但問題很簡單,愚蠢的解決方案是最好的解決方案。
我不太確定您是否可以在此處使用 RegExp,因為問題可能看起來更復雜。 您需要 3 個直接或相反順序的數字。 似乎您可以將很多組合放入正則表達式中。
我建議設計一個簡單的緩沖區和了望 window。 緩沖區大小可能等於監視 windows 大小。 您將一個符號放在緩沖區中,然后檢查了望台 window 是否有接下來的幾個符號。 您可以逐步增加此類算法的復雜性以記住位置、長度等。
我認為這就是我解決問題的方法:
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 組。但這很容易。 之后,您只需編寫一個小方法來測試數字是否在升序(我選擇了遞歸)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.