-
Notifications
You must be signed in to change notification settings - Fork 655
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Добавляет ответ на вопрос про разрежённый массив (#5613)
Co-authored-by: Vitya <9317613+vitya-ne@users.noreply.github.com> Co-authored-by: TatianaFokina <fokinatatian@gmail.com>
- Loading branch information
1 parent
3af3b9c
commit ccce4e0
Showing
2 changed files
with
127 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,121 @@ | ||
Для решения этой задачи важно понимать, что массивы в JavaScript — это объекты с числовыми ключами, которые автоматически создаются при инициализации и могут изменяться при мутации массива его методами. | ||
|
||
Как это выглядит: | ||
|
||
```js | ||
const arr = [1, 2] | ||
``` | ||
|
||
Для движка, который обрабатывает JavaScript, массив `arr` выглядит примерно так: | ||
|
||
```js | ||
const arr = { | ||
'0': 1, | ||
'1': 2, | ||
'length': 2 | ||
} | ||
``` | ||
|
||
Ключи «0» и «1» — это строки, соответствующие индексам массива. | ||
|
||
Свойство `length` указывает на наибольший индекс + 1. | ||
|
||
Как мы знаем, если обратиться к несуществующему ключу в объекте, результатом будет `undefined`. Например: | ||
|
||
```js | ||
const obj = {} | ||
console.log(obj['nonexistentKey']) // undefined | ||
``` | ||
|
||
Аналогично для массивов: | ||
|
||
```js | ||
const arr = [1, 2] | ||
console.log(arr[10]) // undefined | ||
``` | ||
|
||
В случае массивов, если между существующими индексами есть разрывы, например, `[1, , 3]`, JavaScript не создаёт ключ для пропущенного индекса. Это означает, что такие слоты считаются «пустыми». | ||
|
||
```js | ||
const sparseArr = [1, , 3] | ||
|
||
console.log(sparseArr.length) | ||
// 3 | ||
|
||
console.log(sparseArr) | ||
// [1, empty, 3] | ||
|
||
console.log(sparseArr[1]) | ||
// undefined | ||
``` | ||
|
||
Для движка массив `sparseArr` будет выглядеть так: | ||
|
||
```js | ||
{ | ||
'0': 1, | ||
'2': 3, | ||
'length': 3 | ||
} | ||
``` | ||
|
||
Важно: `empty` — это не отдельный тип данных. Это просто обозначение отсутствия ключа для индекса в массиве. | ||
|
||
Некоторые методы массива умеют отличать `empty` от хранящегося в массиве `undefined`. Например: | ||
|
||
```js | ||
const sparseArr = [1, , 3] | ||
sparseArr.forEach((element) => { | ||
console.log(element) | ||
}) | ||
// 1 | ||
// 3 | ||
``` | ||
|
||
На примере методов `sort()` и `toSorted()`, можно увидеть разницу в обработке `empty`. | ||
|
||
```js | ||
const colors = ['red', 'yellow', 'blue', undefined] | ||
colors[6] = 'purple' | ||
|
||
colors.toSorted() | ||
// ['blue', purple, 'red', 'yellow', undefined, undefined, undefined] | ||
|
||
colors.sort() | ||
// ['blue', purple, 'red', 'yellow', undefined, empty x 2] | ||
``` | ||
|
||
`toSorted()` преобразовал `empty` в `undefined`, а `sort()` сохранил их свойства, при этом переместив все `empty` в конец массива. | ||
|
||
Решение задачи: | ||
|
||
```js | ||
function countEmptySpacesInSparseArray(arr) { | ||
let count = 0 | ||
for (let i = 0; i < arr.length; i++) { | ||
// Проходясь по всей длине массива проверяем, | ||
// отсутствует ли у него ключ, равный индексу | ||
const isEmptySpace = !arr.hasOwnProperty(i) | ||
|
||
if (isEmptySpace) { | ||
// В случае отсутствия ключа, увеличиваем значение счётчика | ||
count++ | ||
} | ||
} | ||
return count | ||
} | ||
``` | ||
|
||
Так как мы знаем об особенностях методов массивов, можно переписать код так: | ||
|
||
```js | ||
function countEmptySpacesInSparseArray(arr) { | ||
let count = 0 | ||
arr.forEach(element => { | ||
count++ | ||
}) | ||
return arr.length - count | ||
} | ||
``` | ||
|
||
Примечание: у решения алгоритмическая сложность O(n). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
--- | ||
name: 'Ярослав' | ||
url: https://github.com/ZioGrape | ||
badges: | ||
- first-contribution-small | ||
--- |