როგორ შეიძლება ოპტიმიზაცია გაუკეთდეს intersection ალგორითმს?
Frontend
რა მოგწონთ და რა არ მოგწონთ კომპანიაში მუშაობაში?
/** * რიცხვითი ობიექტისთვის განახორციელეთ times მეთოდი. * ფუნქციამ უნდა მიიღოს callback და გამოიძახოს იგი * მითითებული რაოდენობით, მიმდინარე იტერაციის ინდექსით. */ Number.prototype.times = function (callback) { const n = Number(this); for (let i = 0; i < n; i++) { callback(i); } } // მაგალითები console.clear(); (3).times(console.log) // 0 // 1 // 2
ხე არსებობს, რომელზეც სოკო და ყვავილები ზის. საჭიროა დაწეროთ ფუნქცია, რომელიც იპოვის ყველა სოკოს ხეზე და დააბრუნებს მათ სახელებს. გ_expected შედეგი: ['Acorn', 'Sirsalty', 'Macadamia', 'Kernel'].
/* ორი სორტირებული სიაა, რომელშიც მოცემულია მომხმარებლების ონლაინ ყოფნის ინტერვალები დღის განმავლობაში. ინტერვალის დასაწყისი მკაცრად ნაკლებია დასასრულს. საჭიროა გამოთვალოთ ის ინტერვალები, როდესაც ორივე მომხმარებელი იყო ონლაინ. ინტერვალები მითითებულია საათებში, განიხილება, რომ შეიძლება იყოს 0-დან 24-მდე. */ შეთავაზება( [[8, 12], [17, 22]], [[5, 11], [14, 18], [20, 23]] )// [[8, 11], [17, 18], [20, 22]] შეთავაზება( [[9, 15], [18, 21]], [[10, 14], [21, 22]] )// [[10, 14]] function შეთავაზება(მომხმარებელი1, მომხმარებელი2) { // დაწერეთ თქვენი კოდი აქ }
რამდენი ხანია კომპანიაში მუშაობთ?
/* තුන් කොටස් කේතයක් ලබා දී ඇත. සෑම console.log එකක ප්රතිඵලය ලිවිය යුතුය. */ var n = 1; function f(n) { n = 3; } f(n); console.log(n); // ?? // ---------------- var obj = { a: 1 }; function f1(o) { o.a = 5; } f1(obj); console.log(obj); // ?? // ---------------- var obj = { a: 1 }; function f2(o) { o = { hello: 1 }; } f2(obj);
/** * აუცილებელია დაწეროთ strjoin ფუნქცია, * რომელიც ხაზებს აერთიანებს გამყოფის საშუალებით. */ function strjoin() { // კოდი აქ } console.log(strjoin('a', 'b', 'c')) // 'a.b.c' console.log(strjoin('a', 'b', 'c', 'd', 'e', 'f')) // 'a-b-c-d-e-f'
რატომ არის for...of გაპრინტული წითლად TypeScript-ში, ხოლო ჩვეულებრივი for — არა?
გაწერეთ ფუნქცია strjoin-ი rest-პარამეტრების გამოყენების გარეშე, მათ ნაცვლად გამოიყენეთ arguments ობიექტი.
როგორ შეიცვლება ასიმპტოტური სირთულე და მეხსიერების მოხმარება camelCase → snake_case დავალებაში, თუ შედეგი სიმბოლოების მასივის ნაცვლად სტრიქონების კონკატენაციით იქმნება?
მოქმედეთ Array.prototype.groupBy მეთოდზე, რომელიც აბრუნებს ობიექტების მასივის სტრუქტურირებულ ვერსიას, სადაც თითოეული გასაღები არის გადაცემული ფუნქციის გამოძახების შედეგი, ხოლო მნიშვნელობა არის ამ გასაღებთან შესაბამისი ელემენტების მასივი.
// აუცილებელია განახორციელოთ groupBy მეთოდი, რომელიც განავრცობს მასივების სტანდარტულ მეთოდებს. // მეთოდი უნდა აბრუნებდეს მასივის დაჯგუფებულ ვერსიას - ობიექტს, // სადაც თითოეული გასაღები იქნება გადაცემული fn(arr[i]) ფუნქციის შედეგი, // ხოლო თითოეული მნიშვნელობა იქნება მასივი, რომელიც შეიცავს ყველა იმ ელემენტს ორიგინალ მასივიდან ამ გასაღებით. // აქ დაწერეთ კოდი // მაგალითი 1 const array1 = [ { id: 1 }, { id: 1 }, { id: 2 } ]; const fn = (item) => item.id; console.log(array1.groupBy(fn)); // { // 1: [{ id: 1 }, { id : 1 }], // 2: [{ id: 2 }] // } // მაგალითი 2 const array2 = [1, 2, 3]; console.log(array2.groupBy(String)); // { // "1": [1], // "2": [2], // "3": [3] // } // მაგალითი 3 const array3 = [3.3, 0.5, 1.4]; console.log(array3.groupBy(Math.round)); // { // 3: [3.3], // 1: [0.5, 1.4] // }
წერეთ tries(n) ფუნქცია, რომელიც იძახის aus ფუნქციას მაქსიმუმ n ჯერ: აბრუნებს პირველ წარმატებულ შედეგს, ხოლო თუ ყველა მცდელობა წარუმატებელია — აგდებს ბოლო მცდელობის შეცდომას.
// გეცოდინებათ, რომ გაცემული სტრიქონი ლათინური ასოებით, სივრცეებითა და ნიშანშესანიშნაობებით არის შედგენილი. // სტრიქონს უწოდებენ პანგრამას, თუ ის შეიცავს ყოველ 26 ასოს მინიმუმ ერთხელ. განსაზღვრეთ, არის თუ არა სტრიქონი პანგრამა. const LETTERS = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']; function isPangram(text) { // თქვენი კოდი აქ } console.log(isPangram(`A pangram or holoalphabetic sentence is a using every letter of a given alphabet at least once.`)); // => console.log(isPangram('Waltz, bad nymph, for quick jigs vex.'))
რეკლამების ქსელის პროტოტიპში, რეკლამირების ადგილების გაყიდვა ორგანიზებულია შემდეგნაირად: ყიდვად წინასწარ აცხადებენ თავიანთ ფასს, და თითოეულ რეკლამირების ადგილს პასუხობენ, მზად არიან თუ არა ის გაყიდონ ან არა. საჭიროა განახორციელოთ ფუნქცია, რომელიც გაყიდვამდე ელოდება მაღალ ფასის შეთავაზების მქონე ყიდვადთან თანხმობას ან უარყოფას, და შემდეგ გაყიდის რეკლამირების ადგილს იმ ყიდვადთან, რომელიც თანხმობას მისცემს და აქვს ყველაზე მაღალი შეთავაზება. ფუნქციის პასუხი უნდა იყოს რაც შეიძლება სწრაფი. უნდა დაბრუნდეს ყიდვადის ინდექსი. მაგალითები: ყიდვადები სთავაზობენ ფასებს 1, 5, 10 ყიდვადმა შეთავაზება 10 უარყო ყიდვადმა შეთავაზება 1 დათანხმდა // ჩვენ ჯერ კიდევ ველოდებით, რადგან შეიძლება პასუხი მისცეს ყიდვადმა შეთავაზება 5 ყიდვადმა შეთავაზება 5 დათანხმდა // ვირჩევთ ყიდვადს შეთავაზებით 5 ------------ ყიდვადები სთავაზობენ ფასებს 1, 5, 10 ყიდვადმა შეთავაზება 10 უარყო ყიდვადმა შეთავაზება 5 დათანხმდა // არ ველოდებით პასუხს შეთავაზებაზე 1 - ის ნამდვილად არ გამოვარჩევთ ------------ ყიდვადები სთავაზობენ ფასებს 1, 2 ყიდვადმა შეთავაზება 1 უარყო ყიდვადმა შეთავაზება 2 უარყო // არ ვარჩევთ არც ერთ ყიდვადს type Buyer = { price: number, accepts: () => Promise<boolean>, } async function bestBuyer(buyers) { const sorted = buyers.map((buyer, index) => ({buyer, index})) .sort((a, b) => a.buyer.price - b.buyer.price); const promise = sorted.map(({buyer}) => buyer.accepts()); for (let i = 0; i < sorted.length; i++) { const accepted = await promise[i]; if (accepted) { return sorted[i].index; } } if (await buyers[0].accepts()) { return 0; } return -1; }
რატომ არ შეიძლება გამოიყენოს arrow ფუნქცია groupBy-ისთვის? რა იქნება this-ი arrow-ში?
// და თითოეული მნიშვნელობა არის მასივი, რომელიც შეიცავს ყველა ელემენტს ორიგინალ მასივში ამ გასაღებით. // აქ დაწერეთ კოდი // მაგალითი 1 const array1 = [ { id: 1 }, { id: 1 }, { id: 2 } ]; const fn = (item) => item.id; console.log(array1.groupBy(fn)); // { // 1: [{ id: 1 }, { id: 1 }], // 2: [{ id: 2 }] // } // მაგალითი 2 const array2 = [1, 2, 3]; console.log(array2.groupBy(String));
რა შეზღუდვები არსებობს ხის რეკურსიული შემოვლაში? რა განსხვავებაა სიღრმის (DFS) და სიგანის (BFS) შემოვლას შორის? როგორ შეიძლება ხის შემოვლას რეკურსიის გარეშე განახორციელოთ?
/* სტანდარტული ნაკრებების (Set) მეთოდების გაფართოებისთვის საჭიროა შექმნათ intersection მეთოდი. ეს მეთოდი მიიღებს სხვა ნაკრებს და დაბრუნებს ახალ ნაკრებს, რომი იქნება თავდაპირველი და გადაცემული ნაკრებების გადაკვეთა, ანუ, შეიცავს მხოლოდ იმ ელემენტებს, რომლებიც ორივე ნაკრებშია. */ // თქვენი კოდი const set1 = new Set([1, 2, 3, 4]); const set2 = new Set([3, 4, 5, 6, 7, 8]); console.log(...set1.intersection(set2)) // 3 4 --- Set.prototype.intersection = function (set2) { const result = new Set(); for(const value of this) { if (set2.has(value)) result.add(value); } return result; } const set1 = new Set([1, 2, 3, 4]); const set2 = new Set([3, 4, 5, 6, 7, 8]); console.log(...set1.intersection(set2)) // 3 4