Một câu hỏi phỏng vấn hoặc thử thách JavaScript điển hình liên quan đến việc đảo ngược mảng tại chỗ và không đúng chỗ. Cụ thể, hãy giải quyết vấn đề này từ Eloquent JavaScript, 2nd Edition
Write two functions reverseArray and reverseArrayInPlace. The first, reverseArray, takes an array as an argument and produces a new array that has the same elements in the inverse order. The second, reverseArrayInPlace, does what the reverse method does: it modifies the array given as argument in order to reverse its elements. Neither may use the standard reverse method.
Đó là người khởi xướng. bạn không thể sử dụng phương pháp
var array1 = ["yes", "no", "maybe", "always", "sometimes", "never", "if"];
var array2 = [5,8,2,9,5,6,3,1];
5Tôi đã giải quyết vấn đề này trước đây, nhưng bây giờ tôi đang quay lại học JavaScript sau một thời gian nghỉ ngơi, tôi phải mất một lúc để hiểu lại vấn đề này. Đặc biệt đảo ngược mảng tại chỗ. Để giúp tôi hiểu rõ hơn và suy nghĩ thấu đáo vấn đề này tôi quyết định viết bài này
Đảo ngược một mảng Out-of-Place
Để bắt đầu, hãy tạo hai mảng
var array1 = ["yes", "no", "maybe", "always", "sometimes", "never", "if"];
var array2 = [5,8,2,9,5,6,3,1];
Đối với hàm
var array1 = ["yes", "no", "maybe", "always", "sometimes", "never", "if"];
var array2 = [5,8,2,9,5,6,3,1];
6, nếu chúng ta định tạo một mảng mới, chúng ta cần một mảng trống để điền vào sauvar newArray = [];
Viết các bước ra bằng mã giả
// 1] I want to take the last element of the array, then add it to the newArray.
// 2] To do this I'll need to loop through the array from the end to the beginning, because I want the last element to be first.
// 3] I want to output the contents of 'newArray' when the for loop is finished.
Trước tiên, hãy đến với vòng lặp
var array1 = ["yes", "no", "maybe", "always", "sometimes", "never", "if"];
var array2 = [5,8,2,9,5,6,3,1];
7 của chúng tôi. Để bắt đầu ở cuối mảng, chúng tôi muốn đặt var array1 = ["yes", "no", "maybe", "always", "sometimes", "never", "if"];
var array2 = [5,8,2,9,5,6,3,1];
8 bằng độ dài của mảng trừ đi 1, vì chỉ số của một mảng luôn bắt đầu từ 0Ví dụ,
var array1 = ["yes", "no", "maybe", "always", "sometimes", "never", "if"];
var array2 = [5,8,2,9,5,6,3,1];
9 sẽ cho chúng ta 7 vì có bảy phần tử trong đó. Tuy nhiên, chỉ số của mỗi là 0, 1, 2, 3, 4, 5 và 6. Vì vậy, để bắt đầu từ phần tử có chỉ số là 6, chúng ta cần lấy độ dài của mảng và trừ đi 1Viết ra vòng lặp
var array1 = ["yes", "no", "maybe", "always", "sometimes", "never", "if"];
var array2 = [5,8,2,9,5,6,3,1];
7 đầy đủ của chúng tôi, chúng tôi nhận đượcfor [var i = arr.length - 1; i >= 0; i--]
Nói cách khác, chúng ta đang trừ 1 từ chỉ mục với mỗi vòng lặp cho đến khi
var array1 = ["yes", "no", "maybe", "always", "sometimes", "never", "if"];
var array2 = [5,8,2,9,5,6,3,1];
8 lớn hơn hoặc bằng 0, phần đầu của mảng. [Sử dụng var newArray = [];
2 làm tên tham số trong hàm bên dưới cũng giống như sử dụng var newArray = [];
3. Đừng để điều đó ném bạn. ]function reverseArray[arr] {
var newArray = [];
for [var i = arr.length - 1; i >= 0; i--] {
newArray.push[arr[i]];
}
return newArray;
}
var newArray = [];
4 đại diện cho từng phần tử tại chỉ mục tương ứng của nó. Ở vòng lặp đầu tiên, var newArray = [];
4 là phần tử var newArray = [];
6. Trên mỗi vòng lặp, chúng tôi sử dụng phương thức var newArray = [];
7 để 'đẩy' var newArray = [];
4 theo nghĩa đen đến cuối của var newArray = [];
9Truyền
// 1] I want to take the last element of the array, then add it to the newArray.
// 2] To do this I'll need to loop through the array from the end to the beginning, because I want the last element to be first.
// 3] I want to output the contents of 'newArray' when the for loop is finished.
0 vào hàm này, chúng ta sẽ nhận đượcreverseArray[array1]⊳ ["if", "never", "sometimes", "always", "maybe", "no", "yes"]
Đảo ngược một mảng tại chỗ
Mọi thứ ngay lập tức trở nên phức tạp hơn đối với tôi khi cố gắng đảo ngược một mảng tại chỗ. Ban đầu, khi tôi cố gắng giải quyết vấn đề này, tôi đã cố gắng lấy phần tử đầu tiên bằng cách sử dụng
// 1] I want to take the last element of the array, then add it to the newArray.
// 2] To do this I'll need to loop through the array from the end to the beginning, because I want the last element to be first.
// 3] I want to output the contents of 'newArray' when the for loop is finished.
1, đặt phần tử đó thành một biến có tên là // 1] I want to take the last element of the array, then add it to the newArray.
// 2] To do this I'll need to loop through the array from the end to the beginning, because I want the last element to be first.
// 3] I want to output the contents of 'newArray' when the for loop is finished.
2, sau đó sử dụng var newArray = [];
7 để thêm nó vào cuối mảng ban đầu. Nhưng vấn đề mà tôi gặp phải là tôi chỉ đảo ngược phần tử đầu tiên và phần tử cuối cùng lặp đi lặp lại với mỗi vòng lặp, bởi vì // 1] I want to take the last element of the array, then add it to the newArray.
// 2] To do this I'll need to loop through the array from the end to the beginning, because I want the last element to be first.
// 3] I want to output the contents of 'newArray' when the for loop is finished.
1 chỉ loại bỏ các phần tử ở 'chỉ số 0' và // 1] I want to take the last element of the array, then add it to the newArray.
// 2] To do this I'll need to loop through the array from the end to the beginning, because I want the last element to be first.
// 3] I want to output the contents of 'newArray' when the for loop is finished.
5 ở cuối cùngNgoài ra còn có vấn đề về nơi bắt đầu và kết thúc vòng lặp
var array1 = ["yes", "no", "maybe", "always", "sometimes", "never", "if"];
var array2 = [5,8,2,9,5,6,3,1];
7Tuy nhiên, trước khi đi xa hơn, hãy viết ra vấn đề bằng mã giả
// 1] I know I need to loop through the array. But before figuring out where to start or end I need to think about how I will actually reverse the elements in the array.
// 2] The only way I can think to do this is to switch the first element with the last element, then the second element with the second-to-last element, etc., until I reach the middle.
Vì vậy, về vòng lặp
var array1 = ["yes", "no", "maybe", "always", "sometimes", "never", "if"];
var array2 = [5,8,2,9,5,6,3,1];
7 của chúng tôi, tôi có thể bắt đầu ở đầu hoặc cuối mảng và kết thúc khi var array1 = ["yes", "no", "maybe", "always", "sometimes", "never", "if"];
var array2 = [5,8,2,9,5,6,3,1];
8 bằng một nửa chiều dài của mảngCách ban đầu tôi nghĩ để làm điều này là
for [var i = 0; i = 0; i--]
2. Cứ lặp đi lặp lại cho đến khi đến giữa mảngCố gắng nó theo cách này, có vẻ như
var array1 = ["yes", "no", "maybe", "always", "sometimes", "never", "if"];
var array2 = [5,8,2,9,5,6,3,1];
1Nhưng khi thử nghiệm điều này, có điều gì đó kỳ lạ xảy ra với các mảng có độ dài chẵn, chẳng hạn như
for [var i = arr.length - 1; i >= 0; i--]
3var array1 = ["yes", "no", "maybe", "always", "sometimes", "never", "if"];
var array2 = [5,8,2,9,5,6,3,1];
29 và 5 được đảo ngược ở giữa
Trong trường hợp mảng của chúng ta là một số lẻ, chẳng hạn như
// 1] I want to take the last element of the array, then add it to the newArray.
// 2] To do this I'll need to loop through the array from the end to the beginning, because I want the last element to be first.
// 3] I want to output the contents of 'newArray' when the for loop is finished.
0, sử dụng for [var i = arr.length - 1; i >= 0; i--]
5 sẽ hiệu quả, vì var array1 = ["yes", "no", "maybe", "always", "sometimes", "never", "if"];
var array2 = [5,8,2,9,5,6,3,1];
9 là 3. 5 và vòng lặp sẽ tiếp tục miễn là var array1 = ["yes", "no", "maybe", "always", "sometimes", "never", "if"];
var array2 = [5,8,2,9,5,6,3,1];
8 nhỏ hơn hoặc bằng 3. 5. Nhưng nếu độ dài của chúng ta là 8, như trong for [var i = arr.length - 1; i >= 0; i--]
3, thì vòng lặp sẽ dừng ở chỉ số 4, thực tế là 1 chỉ số đã qua nơi chúng ta muốn dừng. Bởi vì chỉ mục bắt đầu từ 0, chúng tôi thực sự muốn dừng lại ở 3Để khắc phục điều này, chúng ta có thể trừ 1 từ độ dài của mảng trước khi chia cho 2. Để có biện pháp tốt, chúng ta có thể ném
for [var i = arr.length - 1; i >= 0; i--]
9 ở phía trước để làm tròn số thập phân xuống số nguyên gần nhấtvar array1 = ["yes", "no", "maybe", "always", "sometimes", "never", "if"];
var array2 = [5,8,2,9,5,6,3,1];
3Xem lại
- Chúng tôi đã bắt đầu ở đầu mảng trong vòng lặp
var array1 = ["yes", "no", "maybe", "always", "sometimes", "never", "if"];
7 của chúng tôi
var array2 = [5,8,2,9,5,6,3,1]; - Chúng tôi di chuyển qua mảng cho đến khi đạt được nửa điểm
- Với mỗi vòng lặp, chúng tôi đặt phần tử tại
var array1 = ["yes", "no", "maybe", "always", "sometimes", "never", "if"];
8 — hoặc
var array2 = [5,8,2,9,5,6,3,1];var newArray = [];
4 — bằng một biến có tên là// 1] I want to take the last element of the array, then add it to the newArray.
9
// 2] To do this I'll need to loop through the array from the end to the beginning, because I want the last element to be first.
// 3] I want to output the contents of 'newArray' when the for loop is finished. - Sau đó, chúng tôi đặt phần tử đầu tiên bằng phần tử cuối cùng và phần tử cuối cùng bằng phần tử đầu tiên
- Với mỗi vòng lặp tiếp theo, khi chúng tôi di chuyển vào bên trong, chúng tôi đã làm điều tương tự
Tôi là một tân binh JavaScript, vì vậy nếu bạn có cách nào hiệu quả hơn để thực hiện việc này, tôi rất muốn nhận được phản hồi từ bạn trong phần nhận xét bên dưới