如何计算循环移位的连续整数之间的距离?

时间:2015-02-16 15:05:57

标签: algorithm math modulo

例如,包含n=10元素的数组:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

3循环左移,因此第一个数字为f=3以生成数组:

[3, 4, 5, 6, 7, 8, 9, 0, 1, 2]

i=8j=1,有d=3个步骤,即从左到右的距离d。从i=8j=3d=5个步骤,因为在2之后它会循环跳转到3(将其视为一个响铃)。当di,j已知时,如何通常计算两个数字n之间的距离f,假设数组始终包含从最初开始的循环左移连续整数0

2 个答案:

答案 0 :(得分:1)

如果你想知道任何方向的距离,那么这只是减去的问题。如果您有i = 8且j = 5,则距离为|j-i|(绝对值为j-i),因此为3.

但是,如果您需要将j放在i位置的周期数,则它对应于:

if j - i < 0
    answer = j - i + n
else
    answer = j - i

因此,对于i = 8且j = 5,其中n = 10,它将是5-8 + 10 = 7。但这可能不是你想要的,问题不是很清楚。编辑:等等,我正在思考i和j在数组中的位置,而不是值。这可能令人困惑:/

答案 1 :(得分:1)

这个问题可以解决为找到字符串旋转的问题,算法一般都是这样的:

  1. 制作原始字符串 S 的副本,然后将其连接起来。 S'= SS
  2. S'中的旋转字符串 R 从0移开,并在 R S'的子字符串时返回索引
  3. 例如:

    S  = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    S' = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    然后找

    R = [3, 4, 5, 6, 7, 8, 9, 0, 1, 2]
    
    当R从S'中的索引3开始时,

    是S'的“子串”:

    S' = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
                   ^
                   | (index = 3)
                  [3, 4, 5, 6, 7, 8, 9, 0, 1, 2]
    

    所以轮换是3。