αž€αžΆαžšαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαž–αžΈαž€αžΆαžšαžŸαŸ†αž—αžΆαžŸαž“αŸαžšαž”αžŸαŸ‹ Google αž“αŸ…αž€αŸ’αž“αž»αž„ JavaScript: 4 αžœαž·αž’αžΈαž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆ

αž€αžΆαžšαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαž–αžΈαž€αžΆαžšαžŸαŸ†αž—αžΆαžŸαž“αŸαžšαž”αžŸαŸ‹ Google αž“αŸ…αž€αŸ’αž“αž»αž„ JavaScript: 4 αžœαž·αž’αžΈαž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆ

αž–αŸαž›β€‹αžαŸ’αž‰αž»αŸ†β€‹αž€αŸ†αž–αž»αž„β€‹αžŸαž·αž€αŸ’αžŸαžΆβ€‹αž€αžΆαžšβ€‹αž’αž“αž»αžœαžαŸ’αžβ€‹αž€αŸ’αž”αž½αž“β€‹αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™ αžαŸ’αž‰αž»αŸ†β€‹αž”αžΆαž“β€‹αž‡αž½αž”β€‹αžšαžΏαž„β€‹αž“αŸαŸ‡αŸ” αž“αŸαŸ‡β€‹αž‡αžΆβ€‹αžœαžΈαžŠαŸαž’αžΌβ€‹αž“αŸƒβ€‹αž€αžΆαžšβ€‹αžŸαž˜αŸ’αž—αžΆαžŸβ€‹αžšαž”αžŸαŸ‹ Google αŸ”. αžœαžΆαž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ‚αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž‚αŸ†αž“αž·αžαž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž€αžΆαžšαžŸαž˜αŸ’αž—αžΆαžŸαž“αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž‘αžΎαž„αž“αŸ…αžŸαžΆαž‡αžΈαžœαž€αž˜αŸ’αž˜αž”αž…αŸ’αž…αŸαž€αžœαž·αž‡αŸ’αž‡αžΆαž’αŸ†αŸ—αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ‚αž˜αž‘αžΆαŸ†αž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž™αž›αŸ‹αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž”αž‰αŸ’αž αžΆαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αŸ’αžšαž€αž”αžŠαŸ„αž™αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αžαžΆαž˜αžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αŸ”

αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž”αŸ’αžšαž—αŸαž‘αž“αŸƒαž€αžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αž‡αžΆαž˜αž½αž™αžœαžΈαžŠαŸαž’αžΌαŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž“αŸ„αŸ‡ αžαŸ’αž‰αž»αŸ†αž•αŸ’αžαž›αŸ‹αž™αŸ„αž”αž›αŸ‹αž›αžΎαžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰ αž”αžΌαž€αžšαž½αž˜αž‘αžΆαŸ†αž„αž€αŸ†αžŽαŸ‚αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž“αŸƒαžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„ JavaScript αŸ” nuances αž“αŸƒ algorithm αž“αžΈαž˜αž½αž™αŸ— αž€αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž•αž„αžŠαŸ‚αžšαŸ”

αž™αžΎαž„αžšαŸ†αž›αžΉαž€αŸ– αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž’αžΆαž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸƒ "Habr" - αž€αžΆαžšαž”αž‰αŸ’αž…αž»αŸ‡αžαž˜αŸ’αž›αŸƒ 10 rubles αž“αŸ…αž–αŸαž›αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αž€αŸ’αž“αž»αž„αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆ Skillbox αžŽαžΆαž˜αž½αž™αžŠαŸ„αž™αž”αŸ’αžšαžΎαž›αŸαžαž€αžΌαžŠαž•αŸ’αžŸαž–αŸ’αžœαž•αŸ’αžŸαžΆαž™ "Habr" αŸ”

Skillbox αžŽαŸ‚αž“αžΆαŸ†αŸ– αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„ "αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž…αž›αŸαž PRO".

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž”αž‰αŸ’αž αžΆ

αž™αžΎαž„β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž•αŸ’αžŠαž›αŸ‹β€‹αž’αžΆαžšαŸβ€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αž”αž‰αŸ’αž‡αžΆβ€‹αž‘αž·αž‰ αž“αž·αž„β€‹αžαž˜αŸ’αž›αŸƒβ€‹αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαŸ’αž“αžΎαž±αŸ’αž™αž”αž„αŸ’αž€αžΎαžαž’αž“αž»αž‚αž˜αž“αŸαžŠαŸ‚αž›αžαŸ’αžšαž‘αž”αŸ‹αž–αž·αž αž¬αž˜αž·αž“αž–αž·αž αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαžαžΆαžαžΎαž•αž›αž”αžΌαž€αž“αŸƒαž›αŸαžαž‘αžΆαŸ†αž„αž–αžΈαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž’αžΆαžšαŸαž’αžΆαž…αžŸαŸ’αž˜αžΎαž“αžΉαž„αžαž˜αŸ’αž›αŸƒαžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αŸ”

αž˜αŸ’αž™αŸ‰αžΆαž„αžœαž·αž‰αž‘αŸ€αž αžαžΎαž˜αžΆαž“αž…αŸ†αž“αž½αž“αž‚αžαŸ‹αž–αžΈαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž’αžΆαžšαŸ x αž“αž·αž„ y αžŠαŸ‚αž›αž“αŸ…αž–αŸαž›αž”αžΌαž€αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαžŸαŸ’αž˜αžΎαž“αžΉαž„αžαž˜αŸ’αž›αŸƒαžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžŠαŸ‚αžšαž¬αž‘αŸ?

αž§αž‘αžΆαž αžšαžŽαŸ αž€

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž•αŸ’αžαž›αŸ‹αž’αžΆαžšαŸ [1, 2, 4, 9] αž αžΎαž™αžαž˜αŸ’αž›αŸƒαž‚αžΊ 8 αž“αŸ„αŸ‡αž˜αž»αžαž„αžΆαžšαž“αžΉαž„αžαŸ’αžšαž‘αž”αŸ‹αž˜αž·αž“αž–αž·αž αž–αžΈαž–αŸ’αžšαŸ„αŸ‡αž‚αŸ’αž˜αžΆαž“αž›αŸαžαž–αžΈαžšαž€αŸ’αž“αž»αž„αž’αžΆαžšαŸαž’αžΆαž…αž”αž“αŸ’αžαŸ‚αž˜αžšαž αžΌαžαžŠαž›αŸ‹ 8 αž‘αŸαŸ”

αž§αž‘αžΆαž αžšαžŽαŸ ខ

αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžœαžΆαž‡αžΆαž’αžΆαžšαŸ [1, 2, 4, 4] αž αžΎαž™αžαž˜αŸ’αž›αŸƒαž‚αžΊ 8 αž“αŸ„αŸ‡αž˜αž»αžαž„αžΆαžšαž‚αž½αžšαžαŸ‚αžαŸ’αžšαž‘αž”αŸ‹αž–αž·αžαž–αŸ’αžšαŸ„αŸ‡ 4 + 4 = 8 αŸ”

αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‘αžΈ 1: αž€αž˜αŸ’αž›αžΆαŸ†αž„αžŸαžΆαž αžΆαžœ

αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž–αŸαž›αžœαŸαž›αžΆαŸ– O(NΒ²)αŸ”
αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸƒαž›αŸ†αž αŸ– O(1) αŸ”

αž’αžαŸ’αžαž“αŸαž™αž…αŸ’αž”αžΆαžŸαŸ‹αž”αŸ†αž•αž»αžαž‚αžΊαž€αžΆαžšαž”αŸ’αžšαžΎαžšαž„αŸ’αžœαž·αž›αž‡αž»αŸ†αžŠαŸ‚αž›αžŠαžΆαž€αŸ‹αž‡αžΆαž‚αžΌαŸ”

const findSum = (arr, val) => {
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr.length; j++) {
      if (i !== j && arr[i] + arr[j] === val) {
        return true;
      };
    };
  };
  return false;
};

αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž“αŸαŸ‡αž˜αž·αž“αž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž‘αŸαž–αŸ’αžšαŸ„αŸ‡αžœαžΆαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžšαžΆαž›αŸ‹αž•αž›αž”αžΌαž€αžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž”αžΆαž“αž“αŸƒαž’αžΆαžαž»αž–αžΈαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž’αžΆαžšαŸ αž αžΎαž™αžαŸ‚αž˜αž‘αžΆαŸ†αž„αž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αžšαžΆαž›αŸ‹αž‚αžΌαž“αŸƒαžŸαž“αŸ’αž‘αžŸαŸ’αžŸαž“αŸαž–αžΈαžšαžŠαž„αž•αž„αžŠαŸ‚αžšαŸ” (αž§αž‘αžΆαž αžšαžŽαŸ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž› i = 1 αž“αž·αž„ j = 2 αž–αž·αžαž‡αžΆαžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αžΉαž„αž€αžΆαžšαž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αž‡αžΆαž˜αž½αž™ i = 2 αž“αž·αž„ j = 1 αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž“αŸαŸ‡ αž™αžΎαž„αžŸαžΆαž€αž›αŸ’αž”αž„αž‡αž˜αŸ’αžšαžΎαžŸαž‘αžΆαŸ†αž„αž–αžΈαžš)αŸ”

αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžšαž”αžŸαŸ‹αž™αžΎαž„αž”αŸ’αžšαžΎαž‚αžΌαž“αŸƒ nested αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαž„αŸ’αžœαž·αž›αž‡αž»αŸ†, αžœαžΆαž‚αžΊαž”αž½αž“αž‡αŸ’αžšαž»αž„αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž–αŸαž›αžœαŸαž›αžΆ O (NΒ²) αŸ”


αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‘αžΈ 2: αž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‚αŸ„αž›αž–αžΈαžš

αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸƒαž–αŸαž›αžœαŸαž›αžΆαŸ– O(Nlog(N)) αŸ”
αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸƒαž›αŸ†αž αŸ– O(1)
.

αžŠαŸ„αž™αžŸαžΆαžšαž’αžΆαžšαŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αžαž˜αŸ’αžšαŸ€αž” αž™αžΎαž„αž’αžΆαž…αžŸαŸ’αžœαŸ‚αž„αžšαž€αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‚αŸ„αž›αž–αžΈαžšαŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŠαŸαž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž”αŸ†αž•αž»αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αžΆαžšαŸαžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž‘αž·αž‰αŸ” αž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‚αŸ„αž›αž–αžΈαžšαž˜αžΆαž“αž–αŸαž›αžœαŸαž›αžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš O(log(N))αŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž’αŸ’αž“αž€αž“αŸ…αžαŸ‚αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΎ a for loop αžŠαžΎαž˜αŸ’αž”αžΈαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž’αžΆαžαž»αž“αžΈαž˜αž½αž™αŸ—αž’αŸ€αž”αž“αžΉαž„αžαž˜αŸ’αž›αŸƒαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”

αž“αŸαŸ‡αž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž’αžΆαž…αž˜αžΎαž›αž‘αŸ…αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž±αŸ’αž™αž’αŸ’αžœαžΈαŸ—αž˜αžΆαž“αž—αžΆαž–αž…αŸ’αž”αžΆαžŸαŸ‹αž›αžΆαžŸαŸ‹ αž™αžΎαž„αž”αŸ’αžšαžΎαž˜αž»αžαž„αžΆαžšαžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€ αžŠαžΎαž˜αŸ’αž”αžΈαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‚αŸ„αž›αž–αžΈαžšαŸ” αž αžΎαž™β€‹αž€αŸβ€‹αž˜αž»αžαž„αžΆαžš removeIndex() αžŠαŸ‚αž›β€‹αžαŸ’αžšαž‘αž”αŸ‹β€‹αž€αŸ†αžŽαŸ‚β€‹αž“αŸƒβ€‹αž’αžΆαžšαŸβ€‹αžŠαž€β€‹αž›αž·αž”αž·αž€αŸ’αžšαž˜β€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αž•αŸ’αžαž›αŸ‹αŸ”

const findSum = (arr, val) => {
  for (let i = 0; i < arr.length; i++){
    if (binarySearch(removeIndex(arr, i), val - arr[i])) {
      return true;
    }
  };
  return false;
};
 
const removeIndex = (arr, i) => {
  return arr.slice(0, i).concat(arr.slice(i + 1, arr.length));
};
 
const binarySearch = (arr, val) => {
  let start = 0;
  let end = arr.length - 1;
  let pivot = Math.floor(arr.length / 2); 
  while (start < end) {
    if (val < arr[pivot]) {
      end = pivot - 1;
    } else if (val > arr[pivot]) {
      start = pivot + 1;
    };
    pivot = Math.floor((start + end) / 2);
    if (arr[pivot] === val) {
      return true;
    }
  };
  return false;
};

αž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž–αžΈαžŸαž“αŸ’αž‘αžŸαŸ’αžŸαž“αŸ [0] αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžœαžΆαž”αž„αŸ’αž€αžΎαžαž€αŸ†αžŽαŸ‚αž“αŸƒαž’αžΆαžšαŸαžŠαŸ‚αž›αž˜αž·αž“αžšαžΆαž”αŸ‹αž”αž‰αŸ’αž…αžΌαž›αž›αž·αž”αž·αž€αŸ’αžšαž˜αžŠαŸ†αž”αžΌαž„ αž αžΎαž™αž”αŸ’αžšαžΎαž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‚αŸ„αž›αž–αžΈαžš αžŠαžΎαž˜αŸ’αž”αžΈαž˜αžΎαž›αžαžΆαžαžΎαžαž˜αŸ’αž›αŸƒαžŽαžΆαž˜αž½αž™αžŠαŸ‚αž›αž“αŸ…αžŸαž›αŸ‹αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ…αž’αžΆαžšαŸαžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž•αž›αž”αžΌαž€αžŠαŸ‚αž›αž…αž„αŸ‹αž”αžΆαž“αŸ” αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž˜αŸ’αžαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αžΆαžαž»αž“αžΈαž˜αž½αž™αŸ—αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžΆαžšαŸαŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαž„αŸ’αžœαž·αž›αž‡αž»αŸ†αžαŸ’αž›αž½αž“αžœαžΆαž“αžΉαž„αž˜αžΆαž“αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž–αŸαž›αžœαŸαž›αžΆαž›αžΈαž“αŸαž’αŸŠαŸ‚αžšαž“αŸƒ O(N) αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αžαžΆαž„αž€αŸ’αž“αž»αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαž„αŸ’αžœαž·αž›αž‡αž»αŸ†αž™αžΎαž„αž’αŸ’αžœαžΎαž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‚αŸ„αž›αž–αžΈαžš αžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž–αŸαž›αžœαŸαž›αžΆαžŸαžšαž»αž”αž“αŸƒ O(Nlog(N))αŸ” αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž“αŸαŸ‡αž‚αžΊαž›αŸ’αž’αž‡αžΆαž„αž€αŸ†αžŽαŸ‚αž˜αž»αž“ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αžαŸ‚αž˜αžΆαž“αž€αž“αŸ’αž›αŸ‚αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ‚αž›αž˜αŸ’αž’


αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‘αžΈ 3: αž–αŸαž›αžœαŸαž›αžΆαž›αžΈαž“αŸαž’αŸŠαŸ‚αžš

αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸƒαž–αŸαž›αžœαŸαž›αžΆαŸ– O(N) αŸ”
αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸƒαž›αŸ†αž αŸ– O(1) αŸ”

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαžŠαŸ„αž™αž…αž„αž…αžΆαŸ†αžαžΆαž’αžΆαžšαŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αžαž˜αŸ’αžšαŸ€αž”αŸ” αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‚αžΊαžαŸ’αžšαžΌαžœαž™αž€αž›αŸαžαž–αžΈαžšαŸ– αž˜αž½αž™αž“αŸ…αžŠαžΎαž˜ αž“αž·αž„αž˜αž½αž™αž“αŸ…αž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž›αž‘αŸ’αž’αž•αž›αžαž»αžŸαž–αžΈαžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž…αžΆαŸ†αž”αžΆαž…αŸ‹ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž”αŸ’αžαžΌαžšαž…αŸ†αžŽαž»αž…αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž“αž·αž„αž”αž‰αŸ’αž…αž”αŸ‹αŸ”

αž“αŸ…αž‘αžΈαž”αŸ†αž•αž»αž αž™αžΎαž„αž“αžΉαž„αž‡αž½αž”αžαž˜αŸ’αž›αŸƒαžŠαŸ‚αž›αž…αž„αŸ‹αž”αžΆαž“ αž αžΎαž™αžαŸ’αžšαž‘αž”αŸ‹αž–αž·αž αž¬αž…αŸ†αžŽαž»αž…αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž“αž·αž„αž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αžΉαž„αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆ αž αžΎαž™αžαŸ’αžšαž‘αž”αŸ‹αž˜αž·αž“αž–αž·αžαŸ”

const findSum = (arr, val) => {
  let start = 0;
  let end = arr.length - 1;
  while (start < end) {
    let sum = arr[start] + arr[end];
    if (sum > val) {
      end -= 1;
    } else if (sum < val) {
      start += 1;
    } else {
      return true;
    };
  };
  return false;
};


αž₯αž‘αžΌαžœαž“αŸαŸ‡αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž‚αžΊαž›αŸ’αž’ αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαž›αŸ’αž’αž”αŸ’αžšαžŸαžΎαžšαž”αŸ†αž•αž»αžαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαžΎαž’αŸ’αž“αž€αžŽαžΆαž’αžΆαž…αž’αžΆαž“αžΆαžαžΆαž’αžΆαžšαŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΆ?

αž…αž»αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαžœαž·αž‰?

αž“αŸ…αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αžŠαŸ†αž”αžΌαž„ αž™αžΎαž„αž’αžΆαž…αž”αž‰αŸ’αž‡αžΆαž‘αž·αž‰αž’αžΆαžšαŸαž‡αžΆαž˜αž»αž“αžŸαž·αž“ αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž”αŸ’αžšαžΎαžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžαžΆαž„αž›αžΎαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚ αžαžΎβ€‹αžœαžΆβ€‹αž“αžΉαž„β€‹αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹β€‹αžŠαž›αŸ‹β€‹αž–αŸαž›β€‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·β€‹αž™αŸ‰αžΆαž„β€‹αžŽαžΆ?

αž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŠαŸαž›αŸ’αž’αž”αŸ†αž•αž»αžαž‚αžΊαžαž˜αŸ’αžšαŸ€αž”αžšαž αŸαžŸαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž–αŸαž›αžœαŸαž›αžΆ O (Nlog (N)) αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž”αŸ’αžšαžΎαžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŠαŸαž›αŸ’αž’αž”αŸ†αž•αž»αžαžšαž”αžŸαŸ‹αž™αžΎαž„ αžœαžΆαž“αžΉαž„αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžšαž”αžŸαŸ‹αžœαžΆαž–αžΈ O(N) αž‘αŸ… O(Nlog(N))αŸ” αžαžΎαžœαžΆαž’αžΆαž…αž‘αŸ…αžšαž½αž…αž‘αŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž›αžΈαž“αŸαž’αŸŠαŸ‚αžšαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž’αžΆαžšαŸαžŠαŸ‚αž›αž˜αž·αž“αž˜αžΆαž“αž›αŸ†αžŠαžΆαž”αŸ‹?

4 αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αŸ”

αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸƒαž–αŸαž›αžœαŸαž›αžΆαŸ– O(N) αŸ”
αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸƒαž›αŸ†αž αŸ– O(N) αŸ”

αž”αžΆαž‘ αž˜αžΆαž“αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž›αžΈαž“αŸαž’αŸŠαŸ‚αžš αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αž„αŸ’αž€αžΎαžαž’αžΆαžšαŸαžαŸ’αž˜αžΈαžŠαŸ‚αž›αž˜αžΆαž“αž”αž‰αŸ’αž‡αžΈαž“αŸƒαž€αžΆαžšαž”αŸ’αžšαž€αž½αžαžŠαŸ‚αž›αž™αžΎαž„αž€αŸ†αž–αž»αž„αžŸαŸ’αžœαŸ‚αž„αžšαž€αŸ” αž€αžΆαžšαžŠαŸ„αŸ‡αžŠαžΌαžšαž“αŸ…αž‘αžΈαž“αŸαŸ‡αž‚αžΊαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αžšαžΎαž“αŸ– αžœαžΆαž‡αžΆαžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ’αžšαžŠαžΆαžŸαžŠαŸ‚αž›αž˜αžΆαž“αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž€αŸ’αž“αž»αž„αž›αŸ†αž αž’αŸ†αž‡αžΆαž„ O(1)αŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžαž˜αŸ’αž›αŸƒαžŠαŸ†αž”αžΌαž„αž“αŸƒαž’αžΆαžšαŸαžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž‚αžΊ 1 αž αžΎαž™αžαž˜αŸ’αž›αŸƒαžŸαŸ’αžœαŸ‚αž„αžšαž€αž‚αžΊ 8 αž™αžΎαž„αž’αžΆαž…αž”αž“αŸ’αžαŸ‚αž˜αžαž˜αŸ’αž›αŸƒ 7 αž‘αŸ…αž’αžΆαžšαŸ "αžαž˜αŸ’αž›αŸƒαžŸαŸ’αžœαŸ‚αž„αžšαž€" αŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž“αŸ…αž–αŸαž›αž™αžΎαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αžΆαžαž»αž“αžΈαž˜αž½αž™αŸ—αž“αŸƒαž’αžΆαžšαŸ αž™αžΎαž„αž’αžΆαž…αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž’αžΆαžšαŸαž“αŸƒ "αžαž˜αŸ’αž›αŸƒαžŸαŸ’αžœαŸ‚αž„αžšαž€" αž αžΎαž™αž˜αžΎαž›αžαžΆαžαžΎαž˜αž½αž™αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž–αž½αž€αžœαžΆαžŸαŸ’αž˜αžΎαž“αžΉαž„αžαž˜αŸ’αž›αŸƒαžšαž”αžŸαŸ‹αž™αžΎαž„αž¬αž’αžαŸ‹αŸ” αž”αžΎαž”αžΆαž‘/αž…αžΆαžŸ αžαŸ’αžšαž‘αž”αŸ‹αž–αž·αžαŸ”

const findSum = (arr, val) => {
  let searchValues = [val - arr[0]];
  for (let i = 1; i < arr.length; i++) {
    let searchVal = val - arr[i];
    if (searchValues.includes(arr[i])) {
      return true;
    } else {
      searchValues.push(searchVal);
    }
  };
  return false;
};

αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž“αŸƒαžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‚αžΊαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαž„αŸ’αžœαž·αž›αž‡αž»αŸ† αžŠαŸ‚αž›αžŠαžΌαž…αžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αžƒαžΎαž‰αžαžΆαž„αž›αžΎ αž˜αžΆαž“αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸƒαž–αŸαž›αžœαŸαž›αžΆαž›αžΈαž“αŸαž’αŸŠαŸ‚αžšαž“αŸƒ O(N)αŸ”

αž•αŸ’αž“αŸ‚αž€αžŠαžŠαŸ‚αž›αŸ—αž‘αžΈαž–αžΈαžšαž“αŸƒαž˜αž»αžαž„αžΆαžšαžšαž”αžŸαŸ‹αž™αžΎαž„αž‚αžΊ Array.prototype.include() αžŠαŸ‚αž›αž‡αžΆαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš JavaScript αžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαž‘αž”αŸ‹αž–αž·αž αž¬αž˜αž·αž“αž–αž·αž αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαžαžΆαžαžΎαž’αžΆαžšαŸαž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αž–αžΈαž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸƒαž–αŸαž›αžœαŸαž›αžΆαžšαž”αžŸαŸ‹ Array.prototype.includes() αž™αžΎαž„αž’αžΆαž…αž˜αžΎαž› polyfill αžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αžŠαŸ„αž™ MDN (αž“αž·αž„αžŸαžšαžŸαŸαžšαž‡αžΆ JavaScript) αž¬αž”αŸ’αžšαžΎαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž€αŸ’αž“αž»αž„αž€αžΌαžŠαž”αŸ’αžšαž—αž–αž“αŸƒ JavaScript engine αžŠαžΌαž…αž‡αžΆ Google V8 (C++)αŸ”

// https://tc39.github.io/ecma262/#sec-array.prototype.includes
if (!Array.prototype.includes) {
  Object.defineProperty(Array.prototype, 'includes', {
    value: function(valueToFind, fromIndex) {
 
      if (this == null) {
        throw new TypeError('"this" is null or not defined');
      }
 
      // 1. Let O be ? ToObject(this value).
      var o = Object(this);
 
      // 2. Let len be ? ToLength(? Get(O, "length")).
      var len = o.length >>> 0;
 
      // 3. If len is 0, return false.
      if (len === 0) {
        return false;
      }
 
      // 4. Let n be ? ToInteger(fromIndex).
      //    (If fromIndex is undefined, this step produces the value 0.)
      var n = fromIndex | 0;
 
      // 5. If n β‰₯ 0, then
      //  a. Let k be n.
      // 6. Else n < 0,
      //  a. Let k be len + n.
      //  b. If k < 0, let k be 0.
      var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
 
      function sameValueZero(x, y) {
        return x === y || (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y));
      }
 
      // 7. Repeat, while k < len
      while (k < len) {
        // a. Let elementK be the result of ? Get(O, ! ToString(k)).
        // b. If SameValueZero(valueToFind, elementK) is true, return true.
        if (sameValueZero(o[k], valueToFind)) {
          return true;
        }
        // c. Increase k by 1.
        k++;
      }
 
      // 8. Return false
      return false;
    }
  });
}

αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž•αŸ’αž“αŸ‚αž€αžŠαžŠαŸ‚αž›αŸ—αž“αŸƒ Array.prototype.include() αž‚αžΊαž‡αžΆ while loop αž“αŸ…αž€αŸ’αž“αž»αž„αž‡αŸ†αž αžΆαž“αž‘αžΈ 7 αžŠαŸ‚αž› (αžŸαŸ’αž‘αžΎαžšαžαŸ‚) αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž”αŸ’αžšαžœαŸ‚αž„αž‘αžΆαŸ†αž„αž˜αžΌαž›αž“αŸƒαž’αžΆαžšαŸαžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αŸ” αž“αŸαŸ‡αž˜αžΆαž“αž“αŸαž™αžαžΆαž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸƒαž–αŸαž›αžœαŸαž›αžΆαžšαž”αžŸαŸ‹αžœαžΆαž€αŸαž‡αžΆαž›αžΈαž“αŸαž’αŸŠαŸ‚αžšαž•αž„αžŠαŸ‚αžšαŸ” αž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαžŽαžΆαžŸαŸ‹ αžŠαŸ„αž™αžŸαžΆαžšαžœαžΆαžαŸ‚αž„αžαŸ‚αž‡αžΆαž‡αŸ†αž αžΆαž“αž˜αž½αž™αž“αŸ…αž–αžΈαž€αŸ’αžšαŸ„αž™αž’αžΆαžšαŸαž…αž˜αŸ’αž”αž„αžšαž”αžŸαŸ‹αž™αžΎαž„ αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸƒαž–αŸαž›αžœαŸαž›αžΆαž‚αžΊ O (N + (N - 1)) αŸ” αžŠαŸ„αž™αž”αŸ’αžšαžΎ Big O Notation αž™αžΎαž„αžŸαž˜αŸ’αžšαž½αž›αžœαžΆαž‘αŸ…αž‡αžΆ O(N) - αž–αŸ’αžšαŸ„αŸ‡αžœαžΆαž‡αžΆ N αžŠαŸ‚αž›αž˜αžΆαž“αž₯αž‘αŸ’αž’αž·αž–αž›αžαŸ’αž›αžΆαŸ†αž„αž”αŸ†αž•αž»αžαž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαž“αž‘αŸ†αž αŸ†αž”αž‰αŸ’αž…αžΌαž›αŸ”

αž‘αžΆαž€αŸ‹αž‘αž„αž“αžΉαž„αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž•αŸ’αž“αŸ‚αž€αž›αŸ†αž  αž’αžΆαžšαŸαž”αž“αŸ’αžαŸ‚αž˜αž‚αžΊαžαŸ’αžšαžΌαžœαž€αžΆαžšαž‡αžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŠαŸ‚αž›αž”αŸ’αžšαžœαŸ‚αž„αžšαž”αžŸαŸ‹αžœαžΆαž†αŸ’αž›αž»αŸ‡αž”αž‰αŸ’αž…αžΆαŸ†αž„αž–αžΈαž’αžΆαžšαŸαžŠαžΎαž˜ (αžŠαž€αž˜αž½αž™ αž”αžΆαž‘/αž…αžΆαžŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž˜αž·αž“αž’αžΎαž–αžΎ) αžŠαŸ‚αž›αž”αžŽαŸ’αžαžΆαž›αž±αŸ’αž™αž˜αžΆαž“αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž•αŸ’αž“αŸ‚αž€αž›αŸ†αž  O(N)αŸ” αž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαžŽαžΆαžŸαŸ‹ αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αž’αžΆαž“αžΆαž“αžΌαžœαž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž’αžαž·αž”αžšαž˜αžΆαž“αŸƒαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αŸ”


αžαŸ’αž‰αž»αŸ†αžŸαž„αŸ’αžƒαžΉαž˜αžαžΆαž’αŸ’αž“αž€αžšαž€αžƒαžΎαž‰αž’αžαŸ’αžαž”αž‘αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸ αž‡αžΆαž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αž…αŸ†αž–αŸ„αŸ‡αž€αžΆαžšαžŸαž˜αŸ’αž—αžΆαžŸαž“αŸαžœαžΈαžŠαŸαž’αžΌαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αžœαžΆαž”αž„αŸ’αž αžΆαž‰αžαžΆαž”αž‰αŸ’αž αžΆαžŸαžΆαž˜αž‰αŸ’αž‰αž˜αž½αž™αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžαžΆαž˜αžœαž·αž’αžΈαž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž”αžšαž·αž˜αžΆαžŽαž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαž“αŸƒαž’αž“αž’αžΆαž“αžŠαŸ‚αž›αž”αžΆαž“αž”αŸ’αžšαžΎ (αž–αŸαž›αžœαŸαž›αžΆ αž€αžΆαžšαž…αž„αž…αžΆαŸ†) αŸ”

Skillbox αžŽαŸ‚αž“αžΆαŸ†αŸ–

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹