【问题标题】:Find the number of rotations in a cyclic sequence查找循环序列中的旋转次数
【发布时间】:2013-09-08 02:01:36
【问题描述】:

用户给了我两个数组。我的代码应该找出它向左或向右旋转了多少次。我们可以放心地假设元素不会重复。

我/p:

数组 (arr1) 2, 6, 4, 10, 8 ,12 ,11

旋转数组(arr2) 4, 10, 8, 12, 11, 2, 6

o/p: 2

方法一:

我解决这个问题的方法是这样的:

1.从旋转数组中取出第一个元素,并从旋转数组中取出最后一个元素。分别将它们命名为“first”和“last”。并将计数初始化为 0

2.从头开始比较“first”和arr1的元素,直到到达arr1中的“first”。同时开始将“last”与arr1的元素从末尾开始比较,并不断递减,直到达到与arr1中的“last”等价的数字。

3.我们可以在步骤2的同一个for循环中对上面的步骤2进行递增和递减。并且还可以递增计数变量。

3.就是这样,无论是“第一个”还是“最后一个”,都会尽早找到它的等价物,然后打破并打印计数。

方法二:

取 arr2 的第一个元素并开始将它与 arr1 元素从 end 进行比较,直到找到匹配项。我们把arr1递减的次数就相当于旋转的次数

还有比以上两种更好的方法吗?

【问题讨论】:

  • 如果一个数字重复怎么办?
  • 乍一看,我会为每个数组维护一个索引,并在每个数组的开头都启动它们。 (注意,第二个数组可能被移动了零位,因此最好检查一下。)然后设置一个循环,该循环遍历数组的长度,比较每个索引处的每个元素。如果在循环结束之前遇到不匹配,则仅增加第二个索引并重新开始循环。在循环中的比较中,将其设为“环绕”比较(如果您位于 10 元素数组中的元素 11,则它会环绕到第一个元素)。
  • 将第一个数组的大小加倍,然后复制它。循环遍历它,每次找到4 时,比较下一个n-1 元素是否匹配。存储找到4 必须执行的步骤。如果您知道没有重复项,请在找到 4 时停止。环绕而不是复制会得到相同的结果,但代码会稍微复杂一些。

标签: c algorithm


【解决方案1】:

如果您“可以放心地假设元素不会重复”,那么没有比遍历arr1 的元素更好的方法了,直到找到arr2 的第一个元素。你必须做的步数是你的左旋转。您可以通过从任一数组的长度中减去左旋转并减去 1 来计算右旋转。

【讨论】:

  • 即使有重复,@Paul Griffiths 的方法也会对我们有所帮助。
猜你喜欢
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
相关资源
最近更新 更多