हमारे पास संख्याओं की दो सरणियाँ हैं, और हमें एक फ़ंक्शन लिखना है, मान लीजिए intersection(), जो उनका प्रतिच्छेदन (intersection) निकालता है और एक सरणी लौटाता है जिसमें प्रतिच्छेद करने वाले तत्व किसी भी क्रम में हों। परिणाम में प्रत्येक तत्व उतनी बार आना चाहिए जितनी बार वह दोनों सरणियों में दिखता है।
उदाहरण
यदि इनपुट है:
arr1 = ['hello', 'world', 'how', 'are', 'you']; arr2 = ['hey', 'world', 'can', 'you', 'rotate'];
तो आउटपुट होना चाहिए:
Output: ['world', 'you'];
दृष्टिकोण
यदि सरणियाँ क्रमबद्ध होतीं, तो हम दो पॉइंटर दृष्टिकोण का उपयोग कर सकते थे जिसमें दोनों शुरू में 0 पर संबंधित सरणी की शुरुआत की ओर इशारा करते और हम संबंधित पॉइंटर को बढ़ाकर आगे बढ़ सकते थे और यह समय के संदर्भ में O(m+n) जटिल होता जहाँ m और n सरणियों के आकार हैं।
लेकिन चूंकि हमारे पास असॉर्टेड सरणियाँ हैं, सरणियों को क्रमबद्ध करने और फिर इस दृष्टिकोण का उपयोग करने में कोई तर्क नहीं है, हम पहले सरणी के हर मान को दूसरी के विरुद्ध जाँचेंगे और एक प्रतिच्छेदन सरणी का निर्माण करेंगे। इसमें O(n^2) समय लगेगा।
कोड
arr1 = ['hello', 'world', 'how', 'are', 'you'];
arr2 = ['hey', 'world', 'can', 'you', 'rotate'];
const intersectElements = (arr1, arr2) => {
const res = [];
const { length: len1 } = arr1;
const { length: len2 } = arr2;
const smaller = (len1 < len2 ? arr1 : arr2).slice();
const bigger = (len1 >= len2 ? arr1 : arr2).slice();
for (let i = 0; i < smaller.length; i++) {
if (bigger.indexOf(smaller[i]) !== -1) {
res.push(smaller[i]);
bigger.splice(bigger.indexOf(smaller[i]), 1, undefined);
}
}
return res;
};
console.log(intersectElements(arr1, arr2));
आउटपुट
[ 'world', 'you' ]