我正在通过Marijn Haverbeke的Eloquent JavaScript练习并正在研究以下问题:
"编写一个函数reverseArrayInPlace,它修改作为参数给出的数组,以便反转其元素。不要使用标准
reverse
方法"
给出的解决方案如下:
function reverseArrayInPlace(array) {
for (var i = 0; i < Math.floor(array.length / 2); i++) {
var old = array[i];
array[i] = array[array.length - 1 - i];
array[array.length - 1 - i] = old;
}
return array;
}
给出的测试用例如下:
var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log(arrayValue);
// → [5, 4, 3, 2, 1]
据我所知,它使用数组的中点作为旋转点,但有人可以给我一步一步解释吗?
答案 0 :(得分:3)
function reverseArrayInPlace(array) {
//iterate thru half of original array
for (var i = 0; i < Math.floor(array.length / 2); i++) {
var old = array[i]; //cache original i value
array[i] = array[array.length - 1 - i]; //set i value to its "opposite" from end of array
array[array.length - 1 - i] = old; //set "opposite" to be original i value
}
return array;
}
当您通过数组的1/2进行迭代时,您将交换距离数组前端和末尾相等距离的2个值。例如:
原始数组:[1, 2, 3, 4, 5]
步骤i = 0:[5, 2, 3, 4, 1]
(交换1和5)
步骤i = 1:[5, 4, 3, 2, 1]
(交换2和4)
答案 1 :(得分:2)
逐行采取:
for (var i = 0; i < Math.floor(array.length / 2); i++) {
将数组从0循环到数组的一半(舍入到较小的数字),每次增加1。
var old = array[i];
暂时将数组的当前值存储在变量i
中的old
位置。
array[i] = array[array.length - 1 - i];
将i
位置的值设置为数组的最后一个元素减去当前i
的值。
array[array.length - 1 - i] = old;
将数组的最后一个元素减去当前i
的值设置为先前的值(存储在old
变量中)。
简而言之,以下是实际情况中发生的事情:
old
将存储当前的循环值。这样的值将被替换为当前索引的最后一个值MINUS。基本上,当i
为0
时,array[0]
变为array[4]
,反之亦然。当i
为1 array[1]
时array[3]
将成为[array.length - 1 - i]
,反之亦然。 array.length - 1
是必要的,因为数组中的索引从0开始,因此-i
是数组的最后一个元素,而i
将偏移移动public ActionResult index(string searchBy, string searchFirstName, string searchLastName)
{
if (searchBy == "name")
{
return View(db.members.Where(x => x.members_firstname.Contains(searchFirstName)
&& x.members_lastname.Contains(searchLastName)).ToList());
}
}
,这使得用最后一个元素切换第一个元素的值,反之亦然。
那么交易在哪里而不是定期进行循环?
嗯,诀窍是它需要一半的时间,并且会一次替换两个值,而不是循环整个数组并一次替换一个值。