Computer >> Máy Tính >  >> Lập trình >> Javascript

Tìm phần tử trùng lặp trong tiến trình của n thuật ngữ đầu tiên JavaScript

Giả sử, chúng ta được cung cấp một mảng số có n số tự nhiên đầu tiên, nhưng một phần tử xuất hiện hai lần trong mảng, vì vậy tổng số phần tử là n + 1. Công việc của chúng ta là viết một hàm nhận trong mảng và trả về số xuất hiện hai lần trong thời gian tuyến tính.

Phương pháp 1:Sử dụng Array.prototype.reduce ()

Đây là một cách tiếp cận phức tạp hơn một chút nhưng được nén nhiều nhất về mặt mã được viết. Đầu tiên, hãy tìm mã cho nó -

const arr = [1,4,8,5,6,7,9,2,3,7];
const duplicate = a => a.reduce((acc, val, ind) => val+acc-
(ind+1))+a.length-1;
console.log(duplicate(arr));

Ở đây chúng ta đã sử dụng hàm giảm, hàm gọi lại của nó, hoạt động một lần cho mỗi phần tử của mảng, trong trường hợp của chúng ta là lấy ba đối số,

  • tài khoản → bộ tích lũy, giá trị được trả lại trong lần vượt qua trước đó và
  • val → giá trị phần tử hiện tại,
  • ind → chỉ số của phần tử hiện tại

Bây giờ, hãy áp dụng mã của chúng ta cho mảng này -

[ 2, 3, 1, 2]

Vì độ dài của mảng này là 4, nên có tổng cộng 4 lần vượt qua của hàm gọi lại, nhưng vì chúng ta chưa cung cấp đối số initialValue cho hàm Reduce (), các lần lặp sẽ bắt đầu từ chỉ mục 1 và bộ tích lũy sẽ được gán ban đầu với giá trị tại chỉ số 0, vì vậy sẽ có tổng số 3 lần vượt qua.

Thẻ đầu tiên

acc = 2, val = 3, ind = 1
return value = 2+3 - (1+1) = 3

Thẻ thứ hai

acc = 3, val = 1, ind = 2
return value = 3+1 - (2+1) = 1

Thẻ thông hành thứ ba

acc = 1, val = 2, ind = 3
return value = 1+2 - (3+1) = -1

KẾT THÚC ĐẾN

Do đó -1 được trả về từ mảng và sau đó

-1 + (4-1) = -1 + 3 = 2

được trả về từ hàm trùng lặp (), đây thực sự là kết quả chính xác.

Phương pháp 2:Array.prototype.forEach ()

Trong phương pháp này, chúng tôi lặp lại mảng, lấy tổng của nó và trừ tổng (n-1) số tự nhiên đầu tiên khỏi nó, trong đó n là độ dài của mảng, phần còn lại là số lặp lại hai lần, vì vậy chúng tôi trả về nó.

Ví dụ

const arr = [1,4,8,5,6,7,9,2,3,7];
const duplicate = a => {
   let sum = 0;
   const { length: n } = a;
   a.forEach(num => sum += num);
   return sum - ((n*(n-1))/2);
}
console.log(duplicate(arr));

Đầu ra

Đầu ra trong bảng điều khiển sẽ là -

7