Գտնել զանգվածների ընդհանուր էլեմենտները
Tags: javascript, algorithms
Published: 2021-12-20 09:31:30

## Բարև սիրելի ծրագրավորող (կամ ապագա ծրագրավորող)։

Այսօր կնայենք հարցազրույցների ժամանակ ամենատարածված խնդիրներից մեկը՝ **մի մի քանի զանգվածի ընդհանուր էլեմենտները գտնելու** խնդիրը և այդ խնդրի լուծման եղանակներից մի քանիսը։

**Սակայն մինչև առաջ անցնելը 2 կարևոր բան**
֊ Խնդիրների լուծումները կլինեն JavaScript լեզվով,
֊ Ես ներկայացնում եմ խնդիրը լուծելու գաղափարները և չեմ բացատրելու, թե որ ֆունկցիան իրենից ինչ է ներկայացնում, սակայն կտեղադրեմ համապատասխան հղումները, որպեսզի դու ինքդ ուսումնասիրես դրանք:

Եթե սիրում ես խնդիրներ լուծել, ուրեմն արդեն լուծել ես այսպիսի խնդիր։ Կամ հարցազրույցի ժամանակ առընչվել ես այսպիսի խնդրի։

---

**Նախ հասկանանք խնդիրը։**
Ո՞ր էլեմենտներն են, որ կարող ենք համարել ընդհանուր։ 
Եթե կա այնպիսի էլեմենտ, որը պարունակվում է մեզ տրված զանգվածներից յուրաքանչյուրում, ապա այն համարվումէ  ընդհանուր էլեմենտ։

Այսինքն, եթե ստացել ենք 3 զանգված՝
  ["a", "b", "a", "b", "d", "c"],
  ["a", "c", "d", "e", "e"],
  ["a", "x", "y", "c"],

Այս դեպքում մեր պատասխանը կլինի 'a','c': Որովհետև դրանք այն էլեմենտներն են, որոնք պարունակվում են մեր զանգվածներից բոլորի մեջ։

Ինչպես գրեթե ցանկացած խնդիր, այս խնդիրը նույնպես ունի իր տարատեսակները։ Այդ պատճառով հստակցնենք որոշակի պայմաններ։

Մեզ կփոխանցվի երկչափ զանգված, որի մեջի զանգվածներից պետք է գտնենք ընդհանուր էլեմենտները։ Մեր զանգավծները պարունակելու են միայն տառեր։ Զանգվածների երկարությունը չի գերազանցում 100֊ը։  Զանգվածների քանակը 1֊ից ավել է։ Զանգվածների մեջ էմենետները կարող են կրկնվել (['a', 'b', 'a', 'b', 'c']), սակայն այդ դեպքում հաշվում ենք դրանցից միայն մեկը։ Որպես պատասխան վերադարձնում ենք զանգված, որի մեջ ներառված են ընդհանուր էլեմենտները։

---

Լուծման գաղափարներից մեկը այն է, որ վերցնենք զանգվածերից մեկի էլեմենտները և ստուգենք, թե դրանցից որոնք են պարունակվում մնացած զանգվածներում։ Եթե գտնենք այնպիսի զանգված, որը չի պարունակում տվյալ էլեմենտը, կանցնենք առաջ և կստուգենք հաջորդ էլեմենտը։ Իսկ եթե հասնենք վերջին զանգվածին և այն նույնպես պարունակի տվյալ էլեմենտը, նշանակում է այն պարունակվում է բոլոր զանգվածներում։ Հակառակ դեպքում նախորդ պայմանով արդեն դուրս եկած կլինեինք ցիկլի մեջից և վերջին զանգվածին չէինք հասնի։

Սակայն, ինչպես նշեցի, զանգվածների մեջ էլեմենտները կարող են կրկնվել, իսկ զանգվածի միջից դուպլիկատները հեռացնելու համար կօգտվեմ Set-ից (Զանգվածի միջից դուպլիկատները հեռացնելու խնդրին և դրա լուծումներին [կարող ես ծանոթանալ այստեղ](https://dev.to/arsenmazmanyan1104/zangvatsits-dowplikatner-herhatsnelow-algoritmner-1gpk))։

Ստորև ներկայացրել եմ 2 լուծում, որոնք միմյանցից տարբերվում են միայն զանգվածի մեջ էլեմենտը գտնելու մեթոդով։ Մի դեպքում օգտագործվում է [Array.indexOf()](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf) մեթոդը, մյուս դեպքում [Array.includes()](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/includes)֊ը։

![javascript algorithm](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w82ubh6gdv5nazuhwhdu.png)

[Կոդը տեղադրված է այս հղման մեջ](https://codepen.io/b11rdman/pen/mdBwzxN?editors=0011)

---

Այս խնդիրը կարող ենք լուծել նաև ուրիշ ձևով։ Նախ պետք է զանգվածների միջից հեռացնենք դուպլիկատները, որից հետո մնում է հաշվենք, թե յուրաքանչյուր էլեմենտ քանի անգամ է հանդիպում մեզ տրված զանգվածների մեջ։ Եթե կա էլեմենտ, որին հանդիպում ենք այնքան, ինչքան մեր զանգվածների քանակն է, ուրեմն այդ էլեմենտը հանդիպում է բոլոր զանգվածներում։ Վստահ կարող ենք այսպիսի պնդում կատարել, քանի որ նախորդ քայլով արդեն հեռացրել էինք յուրաքանչյուր զանգվածում գտնվող դուպլիկատները։

Էլեմենտների հանդիպելու քանակը հաշվելու համար կօգտագործենք օբյեկտ, որի մեջ որպես key կպահենք այն տառը, որի քանակը հաշվելու ենք, իսկ որպես այդ key֊ի property կպահենք նրան հանդիպելու քանակը։


![javascript algorithm](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r1cbcpjyzx3irr1d8v7u.png)

[Կոդը տեղադրված է այս հղման մեջ](https://codepen.io/b11rdman/pen/abLwRqK?editors=0011)

---

Հույս ունեմ, այս նյութը քեզ օգնեց նոր գաղափարներ և նոր գիտելիք ստանալու հարցում։ Իսկ եթե ունես այնպիսի լուծման եղանակ, որը այստեղ նշված չէ, շատ ուրախ կլինեմ, [եթե քո տարբերակը ուղարկես ինձ](https://t.me/Beardman1104), այդպիսով փորձի փոխանակում կանենք։