मान लीजिए, हमें संख्याओं का एक ऐरे दिया गया है जिसमें पहले n प्राकृतिक संख्याएं हैं, लेकिन एक तत्व ऐरे में दो बार प्रकट होता है, इसलिए तत्वों की कुल संख्या n+1 है। हमारा काम एक फ़ंक्शन लिखना है जो ऐरे को लेता है और उस संख्या को रैखिक समय में लौटाता है जो ऐरे में दो बार प्रकट होती है।
विधि 1: Array.prototype.reduce() का उपयोग करना
यह थोड़ा पेचीदा दृष्टिकोण है लेकिन लिखे गए कोड के संदर्भ में सबसे संकुचित है। पहले, इसके लिए कोड देखते हैं -
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));
यहां हमने reduce फ़ंक्शन का उपयोग किया है, इसका कॉलबैक, जो ऐरे के प्रत्येक तत्व के लिए एक बार संचालित होता है, हमारे मामले में तीन आर्गुमेंट्स लेता है,
- acc → संचयक, पिछले पास में लौटा मान, और
- val → वर्तमान तत्व मान,
- ind → वर्तमान तत्व का इंडेक्स
अब, आइए इस ऐरे पर अपना कोड लागू करें -
[ 2, 3, 1, 2]
चूंकि इस ऐरे की लंबाई 4 है, कॉलबैक फ़ंक्शन के कुल 4 पास होने चाहिए, लेकिन चूंकि हमने reduce() फ़ंक्शन को initialValue आर्गुमेंट प्रदान नहीं किया है, पुनरावृत्तियां इंडेक्स 1 से शुरू होंगी और संचयक को प्रारंभ में शून्यवें इंडेक्स पर मान निर्दिष्ट किया जाएगा, इसलिए कुल 3 पास होंगे।
पहला पास
acc = 2, val = 3, ind = 1 return value = 2+3 - (1+1) = 3
दूसरा पास
acc = 3, val = 1, ind = 2 return value = 3+1 - (2+1) = 1
तीसरा पास
acc = 1, val = 2, ind = 3 return value = 1+2 - (3+1) = -1
ऐरे का अंत
इसलिए -1 ऐरे से लौटाया जाता है, और फिर
-1 + (4-1) = -1 + 3 = 2
duplicate() फ़ंक्शन से लौटाया जाता है, जो वास्तव में सही परिणाम है।
विधि 2: Array.prototype.forEach()
इस विधि में, हम ऐरे पर पुनरावृति करते हैं, इसका योग प्राप्त करते हैं, और इससे पहले (n-1) प्राकृतिक संख्याओं के योग को घटाते हैं, जहां n ऐरे की लंबाई है, जो बचता है वह वह संख्या है जो दो बार दोहराई गई थी, इसलिए हम इसे लौटाते हैं।
उदाहरण
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));
आउटपुट
कंसोल में आउटपुट होगा -
7