Sef*_*419 3 javascript arrays sorting for-loop
为什么这个功能reverseArrayInPlace不起作用?我想简单地完成函数所说的内容 - 颠倒元素的顺序,以便结果在同一个数组中结束arr.我选择在函数中使用两个数组来做到这一点.到目前为止它只是按顺序返回元素...
var arr = ["a","b","c","d","e","f"]
var arr2 = []
var reverseArrayInPlace = function(array){
var arrLength = array.length
for (i = 0; i < arrLength; i++) {
arr2.push(array.pop())
array.push(arr2.shift())
}
}
reverseArrayInPlace(arr)
Run Code Online (Sandbox Code Playgroud)
小智 9
这是使用就地算法反转数组的更简单方法
function reverse (array) {
var i = 0,
n = array.length,
middle = Math.floor(n / 2),
temp = null;
for (; i < middle; i += 1) {
temp = array[i];
array[i] = array[n - 1 - i];
array[n - 1 - i] = temp;
}
}
Run Code Online (Sandbox Code Playgroud)
你将阵列"拆分"成两半.嗯,不是真的,你只是在上半场迭代.然后,使用公式找到与当前索引相对于中间的索引n - 1 - i,其中i是当前索引.然后使用临时变量交换元素.公式是正确的,因为它将交换:
0 <-> n - 1
1 <-> n - 2
Run Code Online (Sandbox Code Playgroud)
等等.如果元素的数量是奇数,则中间位置不会受到影响.
pop()将删除数组的最后一个元素,push()并将一个项目附加到数组的末尾。所以你只是反复弹出和推送数组的最后一个元素。
push您可以使用splice,而不是使用,它可以让您在数组中的特定位置插入一个项目:
var reverseArrayInPlace = function (array) {
var arrLength = array.length;
for (i = 0; i < arrLength; i++) {
array.splice(i, 0, array.pop());
}
}
Run Code Online (Sandbox Code Playgroud)
(请注意,您不需要中间数组来执行此操作。使用中间数组实际上并不是就地反转。只需在当前索引处弹出和插入即可。)
另外,有趣的评论——您可以跳过最后一次迭代,因为第一个元素在length - 1迭代后总是会出现在最后一个位置。所以你可以arrLength - 1安全地迭代多次。
我还想补充一点,Javascript 有一个内置的reverse()数组方法。所以["a", "b", "c"].reverse()会屈服["c", "b", "a"]。
真正的就地算法将执行交换到数组中间与另一侧的相应元素:
var reverseArrayInPlace = function (array) {
var arrLength = array.length;
for (var i = 0; i < arrLength/2; i++) {
var temp = array[i];
array[i] = array[arrLength - 1 - i];
array[arrLength - 1 - i] = temp;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6600 次 |
| 最近记录: |