dushaoshuai / dushaoshuai.github.io

https://www.shuai.host
0 stars 0 forks source link

uses of modulus #59

Open dushaoshuai opened 1 year ago

dushaoshuai commented 1 year ago

Do something every nth time

for i := 0; i < 100; i++ {
    if i%7 == 0 {
        // do something.
    }
}

Assign tasks evenly

runners := []runner{
    new(runner),
    new(runner),
    new(runner),
}

for i, task := range tasks {
    runner := runners[i%len(runners]
    runner.AddTask(task)
}

wrap around

例如,在从 0 到 9 的范围内 wrap around:

flowchart LR
    0 -- +1 --> 1 -- +1 --> 2 -- +1 --> 3 -- +1 --> 4 -- +1 --> 5 -- +1 --> 6 -- +1 --> 7 -- +1 --> 8 -- +1 --> 9 -- +1 --> 0
    0 -- -1 --> 9 -- -1 --> 8 -- -1 --> 7 -- -1 --> 6 -- -1 --> 5 -- -1 --> 4 -- -1 --> 3 -- -1 --> 2 -- -1 --> 1 -- -1 --> 0

仅针对这种情况,公式为 (v + 1) % (9 - 0 + 1)((v - 1) + (9 - 0 + 1)) % (9 - 0 + 1)

将适用面扩大一下,设当前值为 v,变动为 delta, wrap around 范围为 [rangeStart, rangeEnd],则:

implement a Circular Queue

主要是用数组实现一个环形结构,将数组的首尾连接起来。

https://leetcode.com/explore/learn/card/queue-stack/228/first-in-first-out-data-structure/1395/