Vòng lặp for được sử dụng để lặp lại một đối tượng có thể lặp lại. Chúng ta có thể sử dụng vòng lặp for để duyệt qua các phần tử của mảng và tính tổng các giá trị của chúng
Ví dụ về mảng JavaScript tính tổng với vòng lặp for
let array = [10, 20, 30, 40, 50];
let sum = 0;
for [let i = 0; i < array.length; i++] {
sum += array[i];
}
console.log[sum];
// output: 150
Xem thêm
- Làm cách nào để kiểm tra xem một mảng có chứa giá trị trong JavaScript không?
- Làm cách nào để cắt một mảng trong JavaScript?
- Làm cách nào để đảo ngược một mảng trong JavaScript?
- Làm cách nào để sao chép và sao chép một mảng trong JavaScript?
- Làm cách nào để nối một mảng thành một chuỗi trong JavaScript?
Javascript Sum Array Các ví dụ và bài viết liên quan đến API
Làm cách nào để gửi yêu cầu POST bằng JavaScript?
Trong bài viết này, chúng ta sẽ tìm hiểu cách tìm tổng tất cả các phần tử/số của mảng đã cho. Có nhiều cách tiếp cận để giải quyết vấn đề bằng cách sử dụng vòng lặp for, phương thức forEach[] và phương thức reduce[]
Dưới đây tất cả các phương pháp được mô tả với một ví dụ thích hợp
JavaScript cho vòng lặp. Chúng tôi chỉ đơn giản là sẽ lặp lại tất cả các phần tử của mảng bằng cách sử dụng vòng lặp Javascript for để tìm tổng
Ví dụ
Javascript
Sum is 449
Sum is 440
Sum is 441
Sum is 440
Sum is 443
Sum is 444
Sum is 440
Sum is 440
Sum is 441
Sum is 440
Sum is 443
Sum is 444
Sum is 440
Sum is 440
Sum is 447
Sum is 440
Sum is 449
Sum using Reduce method: 440
Sum using Reduce method: 441
Sum using Reduce method: 442
Sum is 440
Sum using Reduce method: 444
Sum is 440
Sum is 440_______57
Sum using Reduce method: 448
Sum using Reduce method: 449
Sum is 4490
Sum is 4491
đầu ra
Sum is 44
Phương thức JavaScript forEach[]. Chúng ta sẽ sử dụng phương thức Javascript forEach[] của mảng để tính tổng
Javascript
Sum is 449
Sum is 440
Sum is 441
Sum is 440
Sum is 443
Sum is 444
Sum is 440
Sum is 440
Sum is 441
Sum is 440
Sum is 443
Sum is 444
Sum is 440
Sum is 440
Sum is 4406
Sum is 440
Sum is 4408
Sum using Reduce method: 441____210
Sum is 440
Sum is 4412
Sum is 440
Sum is 440
Sum is 4490
Sum is 440
Sum using Reduce method: 447
Sum using Reduce method: 448
Sum is 4419
Sum is 4491
đầu ra
Sum is 44
JavaScript giảm [] Phương pháp. Chúng ta sẽ sử dụng phương thức Javascript reduce[] để tìm tổng của mảng
Hai tổng — Đây có thể là một trong những câu hỏi thuật toán phong phú nhất hiện có và do đó, nên được thực hành rộng rãi
Mặc dù đây là một câu hỏi phổ biến, nhưng có nhiều biến thể của vấn đề này có thể khiến nhà phát triển gặp khó khăn trong một cuộc phỏng vấn
Một hạn chế có thể được sử dụng trong một cuộc phỏng vấn là không cho phép sắp xếp mảng đầu vào. Ràng buộc này là một cách tuyệt vời để đánh giá xem ứng viên có hiểu biết thấu đáo về cấu trúc dữ liệu và độ phức tạp về thời gian có thể có của chúng hay không
Bài viết này sẽ đi sâu vào vấn đề Hai Sum. Sau đây là mô tả vấn đề mà chúng tôi sẽ sử dụng
Đưa ra một mảng các số nguyên, trả về một mảng chứa các chỉ số của hai số cộng với một mục tiêu cụ thể. Có thể giả định rằng mỗi đầu vào sẽ có chính xác một giải pháp và cùng một phần tử có thể không được sử dụng hai lần. Cuối cùng, mảng không thể được sắp xếp
Hiểu vấn đề
Dòng đầu tiên của mô tả vấn đề rất cụ thể. đã cho một mảng, trả về các chỉ mục của hai số cộng với một mục tiêu nhất định. Ngoài ra, rõ ràng là giá trị trả về phải là một mảng bao gồm cả hai chỉ mục
Chắc chắn rằng một mảng các số nguyên được đưa ra, nhưng mô tả này không rõ ràng về việc mục tiêu có thể là
Sum using Reduce method: 441 hay một loại dữ liệu bên cạnh
Sum using Reduce method: 442 hay không. Chẳng hạn, mục tiêu có thể là
Sum using Reduce method: 443, là một
Sum using Reduce method: 444 nhưng có thể bị ép buộc thành một
Sum using Reduce method: 442
Trong một cuộc phỏng vấn, đây sẽ là những câu hỏi tuyệt vời để hỏi một người phỏng vấn. Đối với mục đích của câu hỏi này, giả sử rằng mục tiêu sẽ luôn là một số nguyên của kiểu dữ liệu
Sum using Reduce method: 442
Câu thứ hai giải thích rằng chỉ có một giải pháp trong một mảng nhất định cho một số mục tiêu đã đặt. Vì vậy, cặp số đầu tiên có tổng bằng số mục tiêu có thể được trả về mà không gây ra ngoại lệ
Ngoài ra, cùng một yếu tố không thể được sử dụng hai lần. Điều này có nghĩa là một yếu tố không thể được thêm vào chính nó để đạt được số mục tiêu
Cuối cùng, dòng cuối cùng chỉ ra rằng mảng không thể được sắp xếp
Bây giờ vấn đề đã được giải thích, hãy chia nó thành các yêu cầu nhỏ. Điều này sẽ hữu ích cho việc tạo ra một thuật toán
- Cho một mảng các số nguyên và một số nguyên
- Tìm hai số có tổng bằng đầu vào số nguyên, rồi trả về chỉ số của chúng
- Giá trị trả về phải là một mảng với các chỉ mục được lưu trữ bên trong nó
- Không thể sử dụng cùng một phần tử tại một chỉ mục nhất định hai lần
- Chỉ có một giải pháp cho mảng đã cho và số nguyên đích
- Không cho phép sắp xếp
Các trường hợp thử nghiệm
Vấn đề này thực sự khá đơn giản, vì vậy không cần thiết phải bao gồm nhiều trường hợp cạnh; . số nguyên âm
Mô tả vấn đề không nói rằng các số nguyên phải dương. Vì vậy, một trường hợp thử nghiệm có các phần tử âm trong mảng và một trường hợp có số mục tiêu âm sẽ là khôn ngoan khi đưa vào bộ thử nghiệm
Người ta có thể bao gồm nhiều bài kiểm tra nếu cần, nhưng đây là những trường hợp kiểm tra cho bài viết này
Sum using Reduce method: 44
7Sum using Reduce method: 44
8Sum using Reduce method: 44
9
Đã đến lúc lên kế hoạch cho một thuật toán
Ghi chú.
Sum using Reduce method: 440 sẽ đại diện cho tài sảnSum using Reduce method: 4420 củaSum using Reduce method: 4421
Thuật toán Brute Force không đầy đủ
Vì bản chất của bài toán này là tìm cặp phần tử có tổng bằng một số nào đó nên logic của bài toán này rất dễ hiểu
- Đối với
Sum using Reduce method: 44
22 trongSum using Reduce method: 44
21, hãy kiểm tra tổng củaSum using Reduce method: 44
22 vàSum using Reduce method: 44
25 so với mục tiêu. NếuSum using Reduce method: 44
26, trả về các chỉ số củaSum using Reduce method: 44
22 vàSum using Reduce method: 44
25 - Lặp lại qua
Sum using Reduce method: 44
21, kiểm tra từng phần tử cộng với mọi phần tử có chỉ số cao hơn cho đến khi tìm thấy cặp chính xác
Đây là một giải pháp vũ phu. Đây không phải là một giải pháp hiệu quả, vì nó yêu cầu lặp đi lặp lại trên
Sum using Reduce method: 4421 nhiều lần trước khi tìm thấy cặp mong muốn
Trong hầu hết các trường hợp, sẽ có một trường hợp thử nghiệm có một mảng có hàng nghìn phần tử. Bây giờ, hãy tưởng tượng rằng các phần tử có
Sum using Reduce method: 4426 nằm ở chỉ mục
Sum using Reduce method: 4432
Để đạt được hai phần tử đó, các phần tử
Sum using Reduce method: 4433 từ
Sum using Reduce method: 4421 phải được lặp lại trên mỗi lần lặp của vòng lặp cho
Sum using Reduce method: 4422
Hãy nhớ rằng,
Sum using Reduce method: 4422 phải được tính tổng với mọi phần tử sau nó trongSum using Reduce method: 4421, vì các phần tử trướcSum using Reduce method: 4422 đã được kiểm tra
Vòng lặp lồng nhau này sẽ dẫn đến hàng nghìn lần lặp không cần thiết
Đây là sơ đồ mô tả chi tiết số lần lặp lại cần thiết để kiểm tra toàn bộ
Sum using Reduce method: 4421. Hãy ghi nhớ, đây là một đầu vào rất nhỏ;
Cửa sổ màu đỏ đại diện cho
Sum using Reduce method: 4422. Cửa sổ màu xanh lá cây đại diện cho tất cả các yếu tố phải được thêm vào bằng
Sum using Reduce method: 4422 để kiểm tra
Sum using Reduce method: 4426. Đối với mỗi phần tử trong cửa sổ màu xanh lá cây, có một lần lặp
Thể hiện bằng thuật ngữ toán học, có
Sum using Reduce method: 4443 cặp khả dĩ trong một
Sum using Reduce method: 4421. Vì vậy, thời gian dài nhất [trường hợp xấu nhất] mà thuật toán này có thể mất là __645 thời gian, cực kỳ kém hiệu quả
Như mọi người có thể thấy, giải pháp brute force không lý tưởng cho các đầu vào
Sum using Reduce method: 4421 lớn
Phải có một cách để giảm thiểu số lần lặp lại cần thiết để tìm đúng cặp. Có cấu trúc dữ liệu nào cho phép thời gian tra cứu
Sum using Reduce method: 4447 liên tục không?
Bảng băm
Bảng băm là tập hợp các cặp khóa và giá trị. Hàm băm được sử dụng để ánh xạ giá trị tới chỉ mục, còn được gọi là khóa. Các cặp khóa và giá trị này cho phép thời gian tra cứu liên tục
Trong JavaScript, chúng ta có thể sử dụng một
Sum using Reduce method: 4448 để tạo một bảng băm. Đây là một ví dụ về bảng băm đơn giản
Như được hiển thị trong các dòng 6–9, có thể truy cập
Sum using Reduce method: 4449 của từng phần tử từ
Sum using Reduce method: 4420 bằng cách tham chiếu
Sum using Reduce method: 4421 trong
Sum using Reduce method: 4422
Lợi ích chính của việc sử dụng bảng băm là thời gian tra cứu
Sum using Reduce method: 4447. Thay vì cần lặp qua danh sách các giá trị để tìm giá trị chính xác, khi các giá trị được ánh xạ tới một số loại khóa duy nhất, giá trị có thể được tham chiếu ngay lập tức bằng cách sử dụng khóa của nóTạo một thuật toán hiệu quả hơn
Vì vậy, một ý tưởng khôn ngoan là sử dụng bảng băm cho Hai tổng;
Giải pháp brute force có hai vòng lặp, một vòng lồng vào bên trong vòng kia. Vòng lặp mất nhiều thời gian hơn là vòng lặp lồng nhau vì nó đi qua
Sum using Reduce method: 4421 nhiều lần. Vòng lặp lồng nhau được tô màu xanh lá cây trong hình trên
Nếu chỉ có vòng lặp đầu tiên, được biểu thị bằng cửa sổ màu đỏ trong hình trên, thì độ phức tạp về thời gian sẽ là
Sum using Reduce method: 4425, vì trong trường hợp xấu nhất,
Sum using Reduce method: 4421 sẽ cần được lặp lại hoàn toàn để tìm đúng cặp
Đó là một ý tưởng tốt để loại bỏ vòng lặp lồng nhau. Vòng lặp lồng nhau có thể được thay thế bằng bảng băm không?
Có - một bảng băm thực sự hoạt động hoàn hảo cùng với vòng lặp đơn
Vì vậy, vòng lặp sẽ lặp qua
Sum using Reduce method: 4421 một phần tử tại một thời điểm. Điều đó có nghĩa là
Sum using Reduce method: 4422 phải được kiểm tra đối với mọi phần tử khác trong
Sum using Reduce method: 4421. Làm thế nào điều này có thể được thực hiện với một bảng băm?
Số sẽ ghép với
Sum using Reduce method: 4422 là sự khác biệt giữa
Sum using Reduce method: 4422 và
Sum using Reduce method: 4422. Vì vậy, lưu trữ
Sum using Reduce method: 4423 trong
Sum using Reduce method: 4424. Sử dụng tính năng tra cứu của bảng băm, kiểm tra xem
Sum using Reduce method: 4424 có phải là khóa trong bảng băm không
Nếu nó tồn tại trong bảng băm, điều đó có nghĩa là nó là một phần tử của
Sum using Reduce method: 4421
Đây là một bản vẽ chi tiết bước này của thuật toán. Đối với mục đích của bản vẽ này, các đầu vào là.
Sum using Reduce method: 447. Ngoài ra,
Sum using Reduce method: 4428 trong vòng lặp
Đôi khi, bút và giấy là cần thiết
Câu trả lời cho các đầu vào này là
Sum using Reduce method: 4429, vì
Sum using Reduce method: 4470 và
Sum using Reduce method: 4471 tại các chỉ số
Sum using Reduce method: 4472 và
Sum using Reduce method: 4470 tương ứng bao gồm cặp số có tổng bằng
Sum using Reduce method: 4474
Thuật toán được tán thành ở trên đã tìm thành công phần tử chính xác bằng cách tra cứu
Sum using Reduce method: 4424 trong
Sum using Reduce method: 4422 để tìm phần tử đó nếu nó tồn tại. Sau đó, nó trả về chỉ mục của
Sum using Reduce method: 4477 và được sử dụng trong giá trị trả về,
Sum using Reduce method: 4429.
Sum using Reduce method: 4472 đại diện cho chỉ số của
Sum using Reduce method: 4422 trong
Sum using Reduce method: 4421
Tuy nhiên, lưu ý duy nhất đối với thuật toán này là phần tử không được kết hợp với chính nó để khớp với
Sum using Reduce method: 4422. Tuy nhiên, một kiểm tra đơn giản của
Sum using Reduce method: 4483 sẽ loại bỏ trường hợp cạnh đó
Vì vậy, thuật toán cuối cùng là
- Tạo một đối tượng chứa các cặp khóa-giá trị của phần tử và chỉ mục của nó, tương ứng
- Lặp lại thông qua
Sum using Reduce method: 44
21. Đối vớiSum using Reduce method: 44
22, tính toánSum using Reduce method: 44
24 - Nếu
Sum using Reduce method: 44
24 tồn tại trongSum using Reduce method: 44
22 vàSum using Reduce method: 44
83, hãy trả về các chỉ số của từng phần tử - Nếu
Sum using Reduce method: 44
24 không tồn tại hoặc chỉ số của cả hai phần tử bằng nhau, hãy chuyển sang phần tử tiếp theo trongSum using Reduce method: 44
21
Triển khai thuật toán
Đầu tiên, khai báo một hàm
Sum using Reduce method: 4492 và khai báo một biến để lưu trữ đối tượng trong
Bước tiếp theo là lặp qua mảng
Sum using Reduce method: 4493. Thực hiện việc này trong vòng lặp
Sum using Reduce method: 4494 để có thể thực hiện sớm
Sum using Reduce method: 4495
Trong vòng lặp này, hãy kiểm tra xem
Sum using Reduce method: 4424 có tồn tại trong bảng băm không. nếu có,
Sum using Reduce method: 4497 các chỉ số chính xác. Trong trường hợp
Sum using Reduce method: 4498, gán phần tử hiện tại làm thuộc tính trên
Sum using Reduce method: 4499 và trỏ giá trị của nó vào chỉ mục,
Sum using Reduce method: 4400
Đã đến lúc thử nghiệm giải pháp này trên LeetCode, để đảm bảo rằng các trường hợp thử nghiệm lớn có thể được thực thi thành công
Gần như 100%
99. 51%. Điều đó khá nhanh. Ngoài ra, toàn bộ bộ thử nghiệm đã được thực hiện thành công
Phần kết luận
Bài viết này nặng về thông tin và thuật toán, vì vậy bạn đã làm rất tốt để đi đến điểm này
Như mọi người có thể thấy, việc sử dụng bảng băm trong thuật toán của một người có thể làm giảm đáng kể độ phức tạp về thời gian của nó. Chiến lược sử dụng bảng băm trong bài toán này có thể áp dụng tốt cho nhiều bài toán khác, vì vậy hãy luôn áp dụng nó khi giải các câu hỏi khó