DEV Community

Cover image for Զանգվածից դուպլիկատներ հեռացնելու ալգորիթմներ
Arsen Mazmanyan
Arsen Mazmanyan

Posted on • Edited on

Զանգվածից դուպլիկատներ հեռացնելու ալգորիթմներ

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

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

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

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

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

Խնդիրը հասկացանք, հիմա անցնենք լուծման եղանակներին

Եղանակ 1

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

Կոդը կունենա այսպիսի տեսք։

Վերցնում ենք առաջին էլեմենտը և այն ստուգում ենք զանգվածում իրենից հետո գտնվող մնացած էլեմենտների հետ և եթե նույն տարրից էլի կա, ապա գտածը հեռացնում ենք զանգվածից Array.splice() մեթոդի օգնությամբ։ Այստեղ պետք է մեր 2րդ ինդեքսը (j-ն) 1ով փոքրեցնենք, քանի որ զանգվածից 1 էլեմենտ հեռացնելուց հետո նշված ինդեքսից հետո գտնվող էլեմենտները վերադասավորվում են և բոլորի ինդեքսները 1ով փոքրանում են։ Այս գործողությունը անում ենք զանգվածի բոլոր էլեմենտների հետ։

Լուծման այս եղանակը մեր խնդրին բավարարում է։ Այն համապատասխանում է ES5֊ի ստանդարտներին։

Բայց արի այսքանով չսահմանափակվենք և դիտարկենք այլ տարբերակներ։

Եղանակ 2

Լուծման այս եղանակում կօգտագործենք forEach() և indexOf() մեթոդները, որպեսզի տեսնենք, արդյո՞ք նույն էլեմենտի էլի է հանդիպում զանգավծի մեջ թե ոչ։ Եթե ոչ, այն ավելացնում ենք մեր outputArr֊ի մեջ։

Եղանակ 3

Նախորդ եղանակը կարող ենք մի քիչ այլ ձևով իրականացնել։ Մեզ տրված զանգվածի մեջ դուպլիկատներ փնտրելու փոխարեն կարող ենք ստուգել, արդյո՞ք մեր outputArr֊ի մեջ արդեն կա այդ էլեմենտը թե ոչ։ Եթե չկա, ապա ավելացնում ենք։ Այս դեպքում, եթե զանգվածի մեջ դուպլիկատներ կան, ապա ավելի քիչ քայլ ենք անում, քան նախորդ դեպքում։

Եղանակ 4

Հիմա նայենք մեկ այլ լուծման եղանակի, որտեղ օգտագործվում է reduce մեթոդը։ Այս եղանակում ամեն տարրի համար ստուգում ենք, արդյո՞ք իրեն նախորդող տարրերի ենթաբազմությունում պարունակվում է իրեն հաջորդող տարրը թե ոչ։ Եթե ոչ, ապա ավելացնում ենք ստուգված էլեմենտը։ Սակայն այս դեպքում մենք ստանում ենք string տիպին համապատասխանող արժեք, որը կարող ենք զանգված դարձնել split() մեթոդի օգնությամբ։

Եղանակ 5

Իսկ հիմա քեզ ներկայացնեմ իմ ամենասիրած տարբերակը։ ES6-ում մենք ունենք Set օբյեկտը, որը իր մեջ պահում է միայն չկրկնվող էլեմենտներ։ Սակայն այն զանգված չի համարվում։ Սակայն մենք կարող ենք Set֊ի արժեքներից զանգված ստանալ Array.from() մեթոդի շնորհիվ։

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

Top comments (1)

Collapse
 
varsenyan profile image
Vlad

Nice article!