我正在创建一个包含图片和视频的滑块,我希望为每种类型分配一定的屏幕时间。
static void Main(String[] args) {
string s = "nmmaddammhelloollehdertr";
long ans = Manacher(s, s.Length);
Console.WriteLine(ans);
}
static long Manacher(string s, int N) {
int i, j, k, rp;
int[,] R = new int[2, N + 1];
// rp is the palindrome radius
// R is a table for storing results (2 rows for even and odd length palindromes)
// store the maximum length of the palindromes from left and from right here
int[] MaxFromLeft = new int[N];
int[] MaxFromRight = new int[N];
for (i = 0; i < N; i++) {
MaxFromLeft[i] = 1;
MaxFromRight[i] = 1;
}
// insert guards to iterate easily
// without having to check going out of index range
s = "@" + s + "#";
for (j = 0; j <= 1; j++) {
R[j, 0] = rp = 0; i = 1;
while (i <= N) {
while (s[i - rp - 1] == s[i + j + rp]) rp++;
R[j, i] = rp;
k = 1;
while ((R[j, i - k] != rp - k) && (k < rp)) {
R[j, i + k] = Math.Min(R[j, i - k], rp - k);
k++;
}
rp = Math.Max(rp - k, 0);
i += k;
}
}
s = s.Substring(1, N);
int len // length of the palindrome
, st // start index
, end; // end index;
for (i = 1; i <= N; i++) {
for (j = 0; j <= 1; j++)
for (rp = R[j, i]; rp > 0; rp--) {
len = 2 * rp + j;
st = i - rp - 1;
end = st + len - 1;
// update the maximum length
MaxFromRight[st] = Math.Max(MaxFromRight[st], len);
MaxFromLeft[end] = Math.Max(MaxFromLeft[end], len);
}
}
// get the accumulative maximums
// to avoid doing a second loop inside
for (i = N - 2, j = 1; i > 1; i--, j++) {
MaxFromRight[i] = Math.Max(MaxFromRight[i], MaxFromRight[i + 1]);
MaxFromLeft[j] = Math.Max(MaxFromLeft[j], MaxFromLeft[j - 1]);
}
long ans = 0;
for (i = 0; i < N - 1; i++) {
ans = Math.Max(ans, MaxFromLeft[i] * MaxFromRight[i + 1]);
}
return ans;
}
我可以使用上面的代码为所有幻灯片设置通用时间,但无法为数组中的每个项目设置单独的值。
这是我真正想要实现的目标 1)一旦完成无限迭代,迭代数组从0到最后一个索引 2)能够根据每个对象内的type属性设置下一次迭代的时间。
现在只有1)是可以接受的。
答案 0 :(得分:1)
诀窍是使用concatMap。它将从每个项目创建一个直接可观察的项目,然后延迟一个空的Observable。在那个延迟之后,observable完成,下一个将被连接。这将使用repeat()运算符无限重复。
let data = [{"path":"http://localhost:8091/public/testimg.jpg","type":"image"},{"path":"http://localhost:8091/public/testvideo.mp4","type":"video"}];
const delayByMediaType = {image: 1000, video: 5000};
Observable.from(data)
.concatMap(media =>
Observable.of(media).concat(Observable.empty().delay(delayByMediaType[media.type]))
)
.repeat()
.do(console.log)
.subscribe(item => this.activeItem = item);
答案 1 :(得分:0)
let data = [{"path":"http://localhost:8091/public/testimg.jpg","type":"image"},{ "path":"http://localhost:8091/public/testvideo.mp4","type":"video"}];
const delayByMediaType = {image: 1000, video: 5000};
Observable.from(data)
.concatMap(media => {
return Observable.of(media).delay(delayByMediaType[media.type])
}).subscribe(console.log);