我正在尝试解决以下问题:
不使用反向方法反转数组,不使用 第二个数组,没有复制任何值。
我已经考虑过将数组作为一个对象,然后从头到尾更新数组,但我想你也可以更新它。
尝试过简单的事情:
function reverseArray(array) {
for (var i = 0; i < array.length; i++) {
// var elem = array.shift();
var elem = array.shift()
array.push(elem)
}
return array
}
array = ['a', 'b','c','d','e'];
reverseArray(array);
但这并没有真正改变它。关于如何做的任何建议或解释?
答案 0 :(得分:6)
使用ES6语法,您不需要将值复制到临时变量中(这是最后一个要求是什么?)。
function reverse(arr) {
for(let i = 0, j = arr.length-1; i < j; i++, j--)
[arr[i], arr[j]] = [arr[j], arr[i]];
}
const arr = ['a','b','c','d','e'];
reverse(arr);
console.log(arr);
&#13;
有人可能会争辩说,数组是在这里创建的(如果引擎不能优化它),就像splice
也会创建一个数组(作为其返回值)。
答案 1 :(得分:3)
array = ['a', 'b', 'c', 'd', 'e'];
console.log(array);
for (var i = 0; i < Math.floor(array.length / 2); i++) {
var item = array[i];
array[i] = array[array.length - i - 1];
array[array.length - i - 1] = item;
}
console.log(array);
&#13;
答案 2 :(得分:1)
以下内容将在不使用reverse
方法的情况下反转数组。它的工作原理是交换第一个和最后一个元素,然后是第二个和倒数第二个元素,然后是第三个和第三个到最后一个元素等,直到i
不再小于({{1} })比<
。
j
&#13;
答案 3 :(得分:1)
https://jsfiddle.net/pa2fqa8n/1/
a = ['a', 'b', 'c', 'd', 'e'];
for(var i = 0; i < a.length-1; i++){
for(var j = 0; j < a.length-i-1; j++){
var k = a[j];
a[j] = a[j+1];
a[j+1] = k;
}
}
内循环的第一次迭代将第一个元素移动到结尾,其余元素向前移动一次。每次后续迭代都会做同样的事情,但比前一次迭代少1次。
答案 4 :(得分:1)
这里是如何在没有副本的情况下使用临时数组或变量来保存值,或使用Array.reverse()
。如何修改数组
function reverseArray(array) {
var len = array.length;
for (var i=len,j=-1; j++,i--;) array.unshift( array[len-1-i+(j)] );
array.length = len;
}
var array = ['a', 'b','c','d','e'];
reverseArray(array);
console.log(array);
&#13;
它将值向后插入数组的开头,将旧值推送到最后,然后通过在迭代完成后重置数组长度来对它们进行切片。
答案 5 :(得分:1)
我不得不使用交换变量,这是否违反&#34;没有重复任何值&#34;?
var test1 = [2, '5', 6, 'a', 'Z'];
var test2 = [2, '5', false, 'a', 'Z', {a: 'whatevs'}];
console.log('test1 before', JSON.stringify(test1));
console.log('test2 before', JSON.stringify(test2));
reversarooni(test1);
reversarooni(test2);
console.log('test1 after', JSON.stringify(test1));
console.log('test2 after', JSON.stringify(test2));
function reversarooni(inputArray) {
var index = 0;
var len = inputArray.length;
for(; index < len / 2; index++) {
var swap = inputArray[index];
inputArray[index] = inputArray[(len - 1) - index];
inputArray[(len - 1) - index] = swap;
}
}
&#13;
答案 6 :(得分:1)
这是一种最小的方法。给定var arr = [1,2,3,4]
,此循环会将arr
变为[4,3,2,1]
:
for (var i = 0; i < arr.length - 1; i++) {
arr.splice(i, 0, arr.pop());
}
答案 7 :(得分:0)
您可以使用spread syntax ...
,rest parameters ...
并使用递归和功能方法返回交换的项目。
const
_ = (...a) => a,
rev = (a, ...rest) => rest.length ? _(...rev(...rest), a) : _(a),
reverseArray = array => rev(...array);
console.log(reverseArray(['a', 'b', 'c', 'd', 'e']));
console.log(reverseArray(['a']));
console.log(reverseArray(['a', 'b']));
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 8 :(得分:0)
function printReverse(array) {
for (i = array.length-1; i > -1; i--) {
console.log(array[i]); //4,3,2,1
}
}
printReverse([1, 2, 3, 4]);
这对我有用。
答案 9 :(得分:0)
function reverseArray(a) {
const halfLength = a.length / 2;
for (let i = 0; i< halfLength; i++){
const start = a[i]
a[i] = a[a.length-i-1]
a[a.length-i-1] = start
}
return a;
}