[英]How to find order-preserving subsequence in C#?
我想做的是找到給定序列中的子序列。 但我希望子序列方法有所不同。 即,第一位數字應始終排在第一位,第二位總是第二位,依此類推。 因此,應該保留訂單。
例如給定三個整數,X = 100,Y = 350,Z = 35,我想查找X和Y之間的所有數字,以使數字數字包含Z數字的序列,即{3,5}。 在這種情況下,輸出應為8,子序列為:135、235、305、315、325、335、345、350。
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彼此相鄰。 有任何想法如何修改代碼並實現我想要的嗎?
改變了您的邏輯。 請參閱代碼中的注釋以獲取解釋。
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.