2016-10-18 33 views
0

我想要做的是找到給定序列的子序列。但我想要的子序列方法是不同的。也就是說,第一位數字應該總是第一位,第二位總是第二位,依此類推。所以,它應該是保持秩序。例如給出三個整數,X = 100,Y = 350,Z = 35,我想找到X和Y之間的所有數字,這樣數字的數字就包含了Z位的序列,即{3, 5}。在這種情況下,輸出應該是8和子序列是:135,235,305,315,325,335,345,350如何在C#中查找順序保留子序列?

public List<int> split(int Z) { 

    var digits = new List<int>(); 

    for (; Z > 0; Z /= 10) { 
     digits.Add(Z % 10); 
    } 

    return digits; 
} 

private static int count(int X, int Y, int Z) { 

    int count = 0; 
    var splitZ = split(Z); 

    for (int i = X; i <= Y; i++) { 
     var idigits = split(i); 
     var subseq = new LinkedList<int>(); 

     foreach (var digit in idigits) { 
      subseq.AddLast(digit); 

      if (subseq.Count == splitZ.Count) { 
       if (subseq.SequenceEqual(splitZ)) { 
        Console.WriteLine(i); 
        count++; 
       } 
      } 
     } 
    } 

    return count; 
} 

我有上面的代碼段,但與它的問題是, ,它將作爲輸出3而不是8返回。它只是計數,135,235,335。序列35彼此相鄰。任何想法如何修改代碼並實現我想要的?

+0

你看過基數排序嗎? –

+0

讓我想起了邏輯學期1 - DFA和NFA – Benj

+0

@DavidLively不是真的沒有。 – typos

回答

1

改變了你的邏輯了一下。請參閱代碼中的註釋以獲取解釋。

private static int count(int X, int Y, int Z) 
{ 

    int count = 0; 
    var splitZ = split(Z); 

    if (splitZ.Count == 0) 
    { 
     return Y - X + 1; // everything matches an empty Z sequence 
    } 

    for (int i = X; i <= Y; i++) 
    { 
     var idigits = split(i); 
     int subIndex = 0; 

     foreach (var digit in idigits) 
     { 
      if (splitZ[subIndex] == digit) 
      { 
       ++subIndex; // matched digit 
      } 

      if (subIndex >= splitZ.Count) 
      { 
       ++count; 
       break; // matched whole sub-sequence 
      } 
     } 
    } 

    return count; 
} 
+0

謝謝。這是有道理的。 – typos