在没有 'reverse' 的情况下反转数组或复制数组
Reversing an array without 'reverse' or duplicating an array
我正在尝试解决以下练习:
Reverse an array without using the reverse method, without using a
second array, and without duplicating any of the values.
我考虑过将数组设为对象,然后从头到尾更新数组,但我认为您也可以只更新它。
尝试了一些简单的方法,例如:
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);
但这并没有真正改变它。关于如何执行此操作的任何建议或解释?
以下将在不使用 reverse
方法的情况下反转数组。它的工作原理是交换第一个和最后一个元素,然后是第二个和倒数第二个元素,然后是第三个和倒数第三个元素,依此类推,直到 i
不再小于 (<
) 比 j
.
function reverse(arr) {
for(var i = 0, j = arr.length-1; i < j; i++, j--) {
var tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
return arr;
};
var reversed = reverse(['a','b','c','d','e']);
console.log(reversed);
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。
以下是如何在没有副本、临时数组或变量的情况下保存值,或使用 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);
它将值向后插入到数组的开头,将旧值推到末尾,然后在迭代完成后通过重置数组长度将它们切片。
我必须使用交换变量,这是否违反了 "without duplicating any of the values"?
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;
}
}
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);
这是一个最小的方法。给定 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());
}
使用 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);
有人可能会争辩说数组是在这里创建的(如果引擎不优化它),就像 splice
也创建一个数组(作为它的 return 值)。
您可以使用 spread syntax ...
, rest parameters ...
和 return 具有递归和函数方法的交换项。
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; }
function printReverse(array) {
for (i = array.length-1; i > -1; i--) {
console.log(array[i]); //4,3,2,1
}
}
printReverse([1, 2, 3, 4]);
这对我有用。
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;
}
我正在尝试解决以下练习:
Reverse an array without using the reverse method, without using a second array, and without duplicating any of the values.
我考虑过将数组设为对象,然后从头到尾更新数组,但我认为您也可以只更新它。
尝试了一些简单的方法,例如:
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);
但这并没有真正改变它。关于如何执行此操作的任何建议或解释?
以下将在不使用 reverse
方法的情况下反转数组。它的工作原理是交换第一个和最后一个元素,然后是第二个和倒数第二个元素,然后是第三个和倒数第三个元素,依此类推,直到 i
不再小于 (<
) 比 j
.
function reverse(arr) {
for(var i = 0, j = arr.length-1; i < j; i++, j--) {
var tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
return arr;
};
var reversed = reverse(['a','b','c','d','e']);
console.log(reversed);
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。
以下是如何在没有副本、临时数组或变量的情况下保存值,或使用 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);
它将值向后插入到数组的开头,将旧值推到末尾,然后在迭代完成后通过重置数组长度将它们切片。
我必须使用交换变量,这是否违反了 "without duplicating any of the values"?
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;
}
}
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);
这是一个最小的方法。给定 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());
}
使用 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);
有人可能会争辩说数组是在这里创建的(如果引擎不优化它),就像 splice
也创建一个数组(作为它的 return 值)。
您可以使用 spread syntax ...
, rest parameters ...
和 return 具有递归和函数方法的交换项。
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; }
function printReverse(array) {
for (i = array.length-1; i > -1; i--) {
console.log(array[i]); //4,3,2,1
}
}
printReverse([1, 2, 3, 4]);
这对我有用。
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;
}