例如,包含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=8
到j=1
,有d=3
个步骤,即从左到右的距离d
。从i=8
到j=3
有d=5
个步骤,因为在2
之后它会循环跳转到3
(将其视为一个响铃)。当d
和i,j
已知时,如何通常计算两个数字n
之间的距离f
,假设数组始终包含从最初开始的循环左移连续整数0
?
答案 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)
这个问题可以解决为找到字符串旋转的问题,算法一般都是这样的:
例如:
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。