【发布时间】: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时停止。环绕而不是复制会得到相同的结果,但代码会稍微复杂一些。