mirror of
https://github.com/krahets/hello-algo.git
synced 2026-07-22 19:36:06 +00:00
build
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
---
|
||||
comments: true
|
||||
---
|
||||
|
||||
<!-- Автоматически создано utils/exercises/publish_exercises.py; не редактируйте напрямую. -->
|
||||
|
||||
# 3.6 Упражнения
|
||||
|
||||
## 3.6.1 Вопросы для самопроверки
|
||||
|
||||
### 1. Связи между данными в повседневных ситуациях
|
||||
|
||||
Для каждого из трех примеров выберите по характеру связей между данными один вариант: «линейная структура», «древовидная структура» или «сетевая структура». Объясните свой выбор.
|
||||
|
||||
<!-- numbered-subquestions -->
|
||||
|
||||
1. Ученики стоят в ряд, и каждого интересуют только стоящие непосредственно перед ним и за ним;
|
||||
2. школа организована по уровням «школа → параллель → класс»;
|
||||
3. городские дороги соединяют множество перекрестков: из одного перекрестка можно попасть в несколько других, а дороги могут образовывать циклы.
|
||||
|
||||
??? success "Ответ"
|
||||
|
||||
1. Это линейная структура. Кроме первого и последнего в ряду, каждый ученик соседствует ровно с одним человеком впереди и одним сзади, а связи вытянуты в одну линию.
|
||||
|
||||
2. Это древовидная структура. Каждый класс относится к одной параллели, а каждая параллель — к школе; связи образуют уровни сверху вниз.
|
||||
|
||||
3. Это сетевая структура. Один перекресток может быть связан с несколькими другими, а дороги могут образовывать циклы, поэтому связи нельзя выстроить в единую последовательность или строгую иерархию.
|
||||
|
||||
Определяя структуру, сначала рассматривайте связи между элементами, а не объем памяти, который они занимают.
|
||||
|
||||
### 2. Как сохранить логический порядок в памяти
|
||||
|
||||
Логический порядок `A → B → C` можно сохранить в памяти двумя упрощенными способами:
|
||||
|
||||
- вариант 1: `A, B, C` размещены в ячейках памяти с номерами `20, 21, 22` соответственно;
|
||||
- вариант 2: `A, B, C` размещены в ячейках с номерами `20, 7, 31` соответственно, причем `A` хранит расположение `B`, а `B` — расположение `C`.
|
||||
|
||||
<!-- numbered-subquestions -->
|
||||
|
||||
1. Какой вариант использует хранение в непрерывном, а какой — в разрозненном пространстве памяти?
|
||||
2. Какой вариант ближе к массиву, а какой — к связному списку?
|
||||
3. Почему вариант 2 по-прежнему задает логический порядок `A → B → C`, хотя номера ячеек памяти не упорядочены по величине?
|
||||
|
||||
??? success "Ответ"
|
||||
|
||||
1. Вариант 1 использует соседние ячейки памяти, поэтому хранение происходит в непрерывном пространстве. Узлы в варианте 2 находятся в разных местах, поэтому они хранятся в разрозненном пространстве.
|
||||
|
||||
2. Вариант 1 ближе к массиву, а вариант 2 — к связному списку.
|
||||
|
||||
3. Логический порядок задается связями, записанными между узлами, а не величиной номеров ячеек памяти.
|
||||
По адресу, который хранит `A`, можно найти `B`, а затем по адресу из `B` найти `C`, поэтому элементы по-прежнему доступны в порядке `A, B, C`.
|
||||
|
||||
Это также показывает, что логическая и физическая структуры — два разных взгляда на одни и те же данные.
|
||||
|
||||
### 3. Типы данных и структура записей о домашних заданиях
|
||||
|
||||
Учебная группа записала в порядке рассадки, сдали ли домашнее задание 4 ученика:
|
||||
|
||||
`[true, false, true, true]`
|
||||
|
||||
<!-- numbered-subquestions -->
|
||||
|
||||
1. Какой базовый тип данных подходит для каждого элемента?
|
||||
2. Какую логическую структуру образуют эти 4 элемента, расположенные в ряд по порядку рассадки?
|
||||
3. Если затем записывать оценки за задание каждого ученика как `[90, 0, 85, 100]`, изменится «тип содержимого» или «способ организации» данных? Объясните ответ.
|
||||
|
||||
??? success "Ответ"
|
||||
|
||||
1. Каждый элемент выражает только «да» или «нет», поэтому подходит логический тип `bool`.
|
||||
|
||||
2. Элементы расположены по порядку рассадки и образуют линейную структуру, которую можно хранить в массиве.
|
||||
|
||||
3. Изменится тип содержимого: логические значения будут заменены целыми числами. Способ организации не изменится:
|
||||
данные по-прежнему расположены в ряд по порядку рассадки и могут храниться в массиве как линейная структура.
|
||||
|
||||
Базовый тип данных описывает, «что хранится», а структура данных — «как организованы данные».
|
||||
|
||||
## 3.6.2 Задачи по программированию
|
||||
|
||||
### 1. Число единиц в двоичной записи
|
||||
|
||||
Дано неотрицательное целое число `n`. Подсчитайте количество единиц в его двоичной записи.
|
||||
|
||||
Используйте побитовые операции. Не преобразовывайте двоичную запись в строку и не применяйте встроенную функцию, которая напрямую подсчитывает единицы.
|
||||
|
||||
??? tip "Подсказки"
|
||||
|
||||
1. Выражение n & 1 извлекает крайний правый бит n и позволяет проверить, равен ли он 1
|
||||
2. Сдвиг вправо на один разряд отбрасывает текущий крайний правый бит; в большинстве языков для этого используется оператор >>
|
||||
3. Реализовав проверку каждого бита со сдвигом вправо, обратите внимание: n & (n - 1) превращает в 0 крайнюю правую единицу в n
|
||||
|
||||
[LeetCode](https://leetcode.com/problems/number-of-1-bits/){ .rounded-button .exercise-button target="_blank" rel="noopener noreferrer" }
|
||||
Reference in New Issue
Block a user