<?xml version="1.0" encoding="utf-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Форум программистов и сисадминов Киберфорум - Блоги - alhaos</title>
		<link>https://www.cyberforum.ru/blogs/1422596/</link>
		<description>КиберФорум - форум программистов, системных администраторов, администраторов баз данных, компьютерный форум, форум по электронике и бытовой технике, обсуждение софта. Бесплатная помощь в решении задач по программированию и наукам, решение проблем с компьютером, операционными системам</description>
		<language>ru</language>
		<lastBuildDate>Fri, 29 May 2026 15:56:40 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>60</ttl>
		<image>
			<url>https://www.cyberforum.ru//cyberstatic.net/images/misc/rss.jpg</url>
			<title>Форум программистов и сисадминов Киберфорум - Блоги - alhaos</title>
			<link>https://www.cyberforum.ru/blogs/1422596/</link>
		</image>
		<item>
			<title><![CDATA[[golang] Linked list]]></title>
			<link>https://www.cyberforum.ru/blogs/1422596/10896.html</link>
			<pubDate>Fri, 22 May 2026 11:05:16 GMT</pubDate>
			<description>Связный список / Linked list 
 
Связный список структура данных позволяющая хранить список...</description>
			<content:encoded><![CDATA[<div><h2>Связный список / Linked list</h2><br />
<br />
Связный список структура данных позволяющая хранить список значений, в отличии от массива в памяти хранится не сплошным куском, а отдельными частями которые ссылаются на другие части, что позволяет менее затратно осуществлять операции вставки и удаления элементов.<br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="708534449"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="708534449" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
</pre></td><td class="de1"><pre class="de1"><span class="co1">// Здесь реализован односвязный список в таком случае родительский элемент ссылается на дочерний,</span>
<span class="co1">// зная родительский элемент мы можем получить дочерний, но зная дочерний не можем получить родительский</span>
<span class="co1">// не обойдя весь список сначала.</span>
&nbsp;
<span class="kw1">package</span> linkedlist
&nbsp;
<span class="kw1">import</span> <span class="sy1">(</span>
&nbsp; &nbsp; <span class="st0">&quot;fmt&quot;</span>
<span class="sy1">)</span>
&nbsp;
<span class="co1">// compile-time проверка что LinkedList реализует List</span>
<span class="co1">// Это хитрый трюк Go — присваивание в _ (blank identifier)</span>
<span class="co1">// которое компилятор проверяет но не выполняет в runtime.</span>
<span class="co1">// компилятор видит присваивание и проверяет что правая часть</span>
<span class="co1">// реализует интерфейс левой части. Если какой-то метод не реализован — ошибка компиляции</span>
<span class="kw1">var</span> _ List<span class="sy1">[</span><span class="kw4">struct</span><span class="sy1">{}]</span> <span class="sy2">=</span> <span class="sy1">(</span><span class="sy3">*</span>LinkedList<span class="sy1">[</span><span class="kw4">struct</span><span class="sy1">{}])(</span><span class="kw2">nil</span><span class="sy1">)</span>
&nbsp;
<span class="co1">// List — интерфейс односвязного списка</span>
<span class="kw1">type</span> List<span class="sy1">[</span>T comparable<span class="sy1">]</span> <span class="kw4">interface</span> <span class="sy1">{</span>
&nbsp; &nbsp; <span class="co1">// PushFront добавляет элемент в начало списка — O(1)</span>
&nbsp; &nbsp; PushFront<span class="sy1">(</span>val T<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// PushBack добавляет элемент в конец списка — O(n)</span>
&nbsp; &nbsp; PushBack<span class="sy1">(</span>val T<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// PopFront удаляет и возвращает первый элемент — O(1)</span>
&nbsp; &nbsp; <span class="co1">// Возвращает false если список пуст</span>
&nbsp; &nbsp; PopFront<span class="sy1">()</span> <span class="sy1">(</span>T<span class="sy1">,</span> <span class="kw4">bool</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// PopBack удаляет и возвращает последний элемент — O(n)</span>
&nbsp; &nbsp; <span class="co1">// Возвращает false если список пуст</span>
&nbsp; &nbsp; PopBack<span class="sy1">()</span> <span class="sy1">(</span>T<span class="sy1">,</span> <span class="kw4">bool</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// PeekFront возвращает первый элемент без удаления — O(1)</span>
&nbsp; &nbsp; PeekFront<span class="sy1">()</span> <span class="sy1">(</span>T<span class="sy1">,</span> <span class="kw4">bool</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// PeekBack возвращает последний элемент без удаления — O(n)</span>
&nbsp; &nbsp; PeekBack<span class="sy1">()</span> <span class="sy1">(</span>T<span class="sy1">,</span> <span class="kw4">bool</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Insert вставляет элемент по индексу — O(n)</span>
&nbsp; &nbsp; Insert<span class="sy1">(</span>index <span class="kw4">int</span><span class="sy1">,</span> val T<span class="sy1">)</span> error
&nbsp;
&nbsp; &nbsp; <span class="co1">// Remove удаляет элемент по индексу — O(n)</span>
&nbsp; &nbsp; Remove<span class="sy1">(</span>index <span class="kw4">int</span><span class="sy1">)</span> <span class="sy1">(</span>T<span class="sy1">,</span> error<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Len возвращает количество элементов — O(1)</span>
&nbsp; &nbsp; Len<span class="sy1">()</span> <span class="kw4">int</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Contains проверяет наличие элемента — O(n)</span>
&nbsp; &nbsp; Contains<span class="sy1">(</span>val T<span class="sy1">)</span> <span class="kw4">bool</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// ToSlice возвращает все элементы в виде среза — O(n)</span>
&nbsp; &nbsp; ToSlice<span class="sy1">()</span> <span class="sy1">[]</span>T
<span class="sy1">}</span>
&nbsp;
<span class="co1">// Node — элемент односвязного списка</span>
<span class="kw1">type</span> Node<span class="sy1">[</span>T comparable<span class="sy1">]</span> <span class="kw4">struct</span> <span class="sy1">{</span>
&nbsp; &nbsp; <span class="co1">// Значение для хранения</span>
&nbsp; &nbsp; val T
&nbsp; &nbsp; <span class="co1">// Ссылка на последующий элемент</span>
&nbsp; &nbsp; next <span class="sy3">*</span>Node<span class="sy1">[</span>T<span class="sy1">]</span>
<span class="sy1">}</span>
&nbsp;
<span class="co1">// LinkedList — односвязный список</span>
<span class="kw1">type</span> LinkedList<span class="sy1">[</span>T comparable<span class="sy1">]</span> <span class="kw4">struct</span> <span class="sy1">{</span>
&nbsp; &nbsp; <span class="co1">// Ссылка на головной элемент</span>
&nbsp; &nbsp; head <span class="sy3">*</span>Node<span class="sy1">[</span>T<span class="sy1">]</span>
&nbsp; &nbsp; <span class="co1">// Ссылка на хвостовой элемент</span>
&nbsp; &nbsp; tail <span class="sy3">*</span>Node<span class="sy1">[</span>T<span class="sy1">]</span>
&nbsp; &nbsp; <span class="co1">// Длинна списка</span>
&nbsp; &nbsp; <span class="kw3">len</span> <span class="kw4">int</span>
<span class="sy1">}</span>
&nbsp;
<span class="co1">// Вставляем значение в начало списка</span>
<span class="kw4">func</span> <span class="sy1">(</span>l <span class="sy3">*</span>LinkedList<span class="sy1">[</span>T<span class="sy1">])</span> PushFront<span class="sy1">(</span>val T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Инициируем новый элемент списка</span>
&nbsp; &nbsp; node <span class="sy2">:=</span> Node<span class="sy1">[</span>T<span class="sy1">]{</span>
&nbsp; &nbsp; &nbsp; &nbsp; val<span class="sy1">:</span> val<span class="sy1">,</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Ошибок мы не предполагаем поэтому счетчик увеличиваем сразу</span>
&nbsp; &nbsp; l<span class="sy3">.</span><span class="kw3">len</span><span class="sy2">++</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Если список пустой</span>
&nbsp; &nbsp; <span class="kw1">if</span> l<span class="sy3">.</span>head <span class="sy3">==</span> <span class="kw2">nil</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Устанавливаем в head ссылку на инициированный элемент</span>
&nbsp; &nbsp; &nbsp; &nbsp; l<span class="sy3">.</span><span class="me1">head</span> <span class="sy2">=</span> <span class="sy3">&amp;</span>node
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Устанавливаем в tail ссылку на инициированный элемент</span>
&nbsp; &nbsp; &nbsp; &nbsp; l<span class="sy3">.</span><span class="me1">tail</span> <span class="sy2">=</span> <span class="sy3">&amp;</span>node
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Закончили упражнение</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Если код дошел до сюда список не пуст</span>
&nbsp; &nbsp; <span class="co1">// Полю next нового элемента присваиваем ссылку на текущий элемент head</span>
&nbsp; &nbsp; node<span class="sy3">.</span><span class="me1">next</span> <span class="sy2">=</span> l<span class="sy3">.</span><span class="me1">head</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Заменяем элемент head новым элементом</span>
&nbsp; &nbsp; l<span class="sy3">.</span><span class="me1">head</span> <span class="sy2">=</span> <span class="sy3">&amp;</span>node
<span class="sy1">}</span>
&nbsp;
<span class="co1">// Вставляем значение в конец списка</span>
<span class="kw4">func</span> <span class="sy1">(</span>l <span class="sy3">*</span>LinkedList<span class="sy1">[</span>T<span class="sy1">])</span> PushBack<span class="sy1">(</span>val T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Увеличиваем счетчик элементов</span>
&nbsp; &nbsp; l<span class="sy3">.</span><span class="kw3">len</span><span class="sy2">++</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Инициируем новый элемент списка</span>
&nbsp; &nbsp; node <span class="sy2">:=</span> Node<span class="sy1">[</span>T<span class="sy1">]{</span>
&nbsp; &nbsp; &nbsp; &nbsp; val<span class="sy1">:</span> val<span class="sy1">,</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Если список пустой</span>
&nbsp; &nbsp; <span class="kw1">if</span> l<span class="sy3">.</span>head <span class="sy3">==</span> <span class="kw2">nil</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Устанавливаем в head ссылку на инициированный элемент</span>
&nbsp; &nbsp; &nbsp; &nbsp; l<span class="sy3">.</span><span class="me1">head</span> <span class="sy2">=</span> <span class="sy3">&amp;</span>node
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Устанавливаем в tail ссылку на инициированный элемент</span>
&nbsp; &nbsp; &nbsp; &nbsp; l<span class="sy3">.</span><span class="me1">tail</span> <span class="sy2">=</span> <span class="sy3">&amp;</span>node
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Закончили упражнение</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Значению поля next хвостового элемента присваиваем ссылку на новый элемент</span>
&nbsp; &nbsp; l<span class="sy3">.</span><span class="me1">tail</span><span class="sy3">.</span><span class="me1">next</span> <span class="sy2">=</span> <span class="sy3">&amp;</span>node
&nbsp;
&nbsp; &nbsp; <span class="co1">// Значению поля tail списка присваиваем ссылку на новый хвостовой элемент</span>
&nbsp; &nbsp; l<span class="sy3">.</span><span class="me1">tail</span> <span class="sy2">=</span> <span class="sy3">&amp;</span>node
&nbsp;
<span class="sy1">}</span>
&nbsp;
<span class="co1">// Извлекаем значение головного элемента</span>
<span class="kw4">func</span> <span class="sy1">(</span>l <span class="sy3">*</span>LinkedList<span class="sy1">[</span>T<span class="sy1">])</span> PopFront<span class="sy1">()</span> <span class="sy1">(</span>T<span class="sy1">,</span> <span class="kw4">bool</span><span class="sy1">)</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Если список пуст возвращаем Т, false</span>
&nbsp; &nbsp; <span class="kw1">if</span> l<span class="sy3">.</span>head <span class="sy3">==</span> <span class="kw2">nil</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">var</span> zero T
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> zero<span class="sy1">,</span> <span class="kw2">false</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Если код дошел сюда то список не пуст</span>
&nbsp; &nbsp; value <span class="sy2">:=</span> l<span class="sy3">.</span><span class="me1">head</span><span class="sy3">.</span><span class="me1">val</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Уменьшаем счетчик элементов</span>
&nbsp; &nbsp; l<span class="sy3">.</span><span class="me1">len</span><span class="sy2">--</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Если это был крайний элемент</span>
&nbsp; &nbsp; <span class="kw1">if</span> l<span class="sy3">.</span>head<span class="sy3">.</span>next <span class="sy3">==</span> <span class="kw2">nil</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// В head устанавливаем ссылку на nil</span>
&nbsp; &nbsp; &nbsp; &nbsp; l<span class="sy3">.</span>head <span class="sy2">=</span> <span class="kw2">nil</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// В tail устанавливаем ссылку на nil</span>
&nbsp; &nbsp; &nbsp; &nbsp; l<span class="sy3">.</span>tail <span class="sy2">=</span> <span class="kw2">nil</span>
&nbsp; &nbsp; <span class="sy1">}</span> <span class="kw1">else</span> <span class="sy1">{</span> <span class="co1">// В этом случае есть еще элементы</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Меняем ссылку головного элемента списка на ссылку на следующий элемент</span>
&nbsp; &nbsp; &nbsp; &nbsp; l<span class="sy3">.</span><span class="me1">head</span> <span class="sy2">=</span> l<span class="sy3">.</span><span class="me1">head</span><span class="sy3">.</span><span class="me1">next</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Возвращаем значение и true</span>
&nbsp; &nbsp; <span class="kw1">return</span> value<span class="sy1">,</span> <span class="kw2">true</span>
<span class="sy1">}</span>
&nbsp;
<span class="co1">// Извлекаем значение хвостового элемента</span>
<span class="kw4">func</span> <span class="sy1">(</span>l <span class="sy3">*</span>LinkedList<span class="sy1">[</span>T<span class="sy1">])</span> PopBack<span class="sy1">()</span> <span class="sy1">(</span>T<span class="sy1">,</span> <span class="kw4">bool</span><span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; <span class="co1">// Если список пуст возвращаем Т, false</span>
&nbsp; &nbsp; <span class="kw1">if</span> l<span class="sy3">.</span>head <span class="sy3">==</span> <span class="kw2">nil</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">var</span> zero T
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> zero<span class="sy1">,</span> <span class="kw2">false</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Если код дошел сюда то список не пуст</span>
&nbsp; &nbsp; value <span class="sy2">:=</span> l<span class="sy3">.</span><span class="me1">tail</span><span class="sy3">.</span><span class="me1">val</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Уменьшаем счетчик элементов</span>
&nbsp; &nbsp; l<span class="sy3">.</span><span class="me1">len</span><span class="sy2">--</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Если в списке один элемент</span>
&nbsp; &nbsp; <span class="kw1">if</span> l<span class="sy3">.</span>head<span class="sy3">.</span>next <span class="sy3">==</span> <span class="kw2">nil</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Удаляем головной элемент</span>
&nbsp; &nbsp; &nbsp; &nbsp; l<span class="sy3">.</span>head <span class="sy2">=</span> <span class="kw2">nil</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Удаляем хвостовой элемент</span>
&nbsp; &nbsp; &nbsp; &nbsp; l<span class="sy3">.</span>tail <span class="sy2">=</span> <span class="kw2">nil</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Возвращаем значение и true</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> value<span class="sy1">,</span> <span class="kw2">true</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Тут надо перебрать весь список чтобы получить адрес предпоследнего элемента</span>
&nbsp; &nbsp; <span class="co1">// ересь конечно, но оставлю этот метод</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// currentNode содержит текущий элемент при обходе</span>
&nbsp; &nbsp; <span class="co1">// начинаем с головного элемента</span>
&nbsp; &nbsp; currentNode <span class="sy2">:=</span> l<span class="sy3">.</span><span class="me1">head</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// обходим список пока у следующего за текущим элементом поле next не окажется пустым</span>
&nbsp; &nbsp; <span class="kw1">for</span> currentNode<span class="sy3">.</span>next<span class="sy3">.</span>next <span class="sy2">!=</span> <span class="kw2">nil</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Присваиваем текущему элементу обхода следующий элемент</span>
&nbsp; &nbsp; &nbsp; &nbsp; currentNode <span class="sy2">=</span> currentNode<span class="sy3">.</span><span class="me1">next</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Когда цикл будет пройден до конца currentNode будет содержать предпоследний элемент,</span>
&nbsp; &nbsp; <span class="co1">// Удаляем в нем ссылку на последний элемент</span>
&nbsp; &nbsp; currentNode<span class="sy3">.</span>next <span class="sy2">=</span> <span class="kw2">nil</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Присваиваем его хвостовому элементу</span>
&nbsp; &nbsp; l<span class="sy3">.</span><span class="me1">tail</span> <span class="sy2">=</span> currentNode
&nbsp;
&nbsp; &nbsp; <span class="co1">// Возвращаем значение и true</span>
&nbsp; &nbsp; <span class="kw1">return</span> value<span class="sy1">,</span> <span class="kw2">true</span>
<span class="sy1">}</span>
&nbsp;
<span class="co1">// PeekFront возвращает значение головного элемента не извлекая его</span>
<span class="kw4">func</span> <span class="sy1">(</span>l <span class="sy3">*</span>LinkedList<span class="sy1">[</span>T<span class="sy1">])</span> PeekFront<span class="sy1">()</span> <span class="sy1">(</span>T<span class="sy1">,</span> <span class="kw4">bool</span><span class="sy1">)</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Если список пуст возвращаем Т, false</span>
&nbsp; &nbsp; <span class="kw1">if</span> l<span class="sy3">.</span>head <span class="sy3">==</span> <span class="kw2">nil</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">var</span> zero T
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> zero<span class="sy1">,</span> <span class="kw2">false</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Возвращаем значение головного элемента</span>
&nbsp; &nbsp; <span class="kw1">return</span> l<span class="sy3">.</span>head<span class="sy3">.</span>val<span class="sy1">,</span> <span class="kw2">true</span>
<span class="sy1">}</span>
&nbsp;
<span class="co1">// PeekBack возвращает значение хвостового элемента не извлекая его</span>
<span class="kw4">func</span> <span class="sy1">(</span>l <span class="sy3">*</span>LinkedList<span class="sy1">[</span>T<span class="sy1">])</span> PeekBack<span class="sy1">()</span> <span class="sy1">(</span>T<span class="sy1">,</span> <span class="kw4">bool</span><span class="sy1">)</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Если список пуст возвращаем Т, false</span>
&nbsp; &nbsp; <span class="kw1">if</span> l<span class="sy3">.</span>head <span class="sy3">==</span> <span class="kw2">nil</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">var</span> zero T
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> zero<span class="sy1">,</span> <span class="kw2">false</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Возвращаем значение хвостового элемента</span>
&nbsp; &nbsp; <span class="kw1">return</span> l<span class="sy3">.</span>tail<span class="sy3">.</span>val<span class="sy1">,</span> <span class="kw2">true</span>
<span class="sy1">}</span>
&nbsp;
<span class="co1">// Insert вставляет значение на определенный индекс списка</span>
<span class="kw4">func</span> <span class="sy1">(</span>l <span class="sy3">*</span>LinkedList<span class="sy1">[</span>T<span class="sy1">])</span> Insert<span class="sy1">(</span>index <span class="kw4">int</span><span class="sy1">,</span> val T<span class="sy1">)</span> error <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Проверяем что индекс вписывается в диапазон существующих значений</span>
&nbsp; &nbsp; <span class="kw1">if</span> index &lt; <span class="nu0">0</span> <span class="sy3">||</span> index &gt; l<span class="sy3">.</span><span class="kw3">len</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> ErrIndexOutOfRange
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Если индекс 0 пользуемся методом PushFront</span>
&nbsp; &nbsp; <span class="kw1">if</span> index <span class="sy3">==</span> <span class="nu0">0</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; l<span class="sy3">.</span>PushFront<span class="sy1">(</span>val<span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">nil</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// если индекс равен длине списка то используем PushBack</span>
&nbsp; &nbsp; <span class="kw1">if</span> index <span class="sy3">==</span> l<span class="sy3">.</span><span class="kw3">len</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span>val<span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">nil</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Если код дошел до сюда то индекс внутри списка</span>
&nbsp; &nbsp; <span class="co1">// Получаем предыдущий элемент</span>
&nbsp; &nbsp; currentNode <span class="sy2">:=</span> l<span class="sy3">.</span>nodeAt<span class="sy1">(</span>index <span class="sy3">-</span> <span class="nu0">1</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Создаем новый элемент</span>
&nbsp; &nbsp; newNode <span class="sy2">:=</span> Node<span class="sy1">[</span>T<span class="sy1">]{</span>
&nbsp; &nbsp; &nbsp; &nbsp; val<span class="sy1">:</span> &nbsp;val<span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; next<span class="sy1">:</span> currentNode<span class="sy3">.</span><span class="me1">next</span><span class="sy1">,</span> <span class="co1">// тут ссылка на элемент который нашли при обходе</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Меняем ссылку</span>
&nbsp; &nbsp; currentNode<span class="sy3">.</span><span class="me1">next</span> <span class="sy2">=</span> <span class="sy3">&amp;</span>newNode
&nbsp;
&nbsp; &nbsp; <span class="co1">// Увеличиваем счетчик</span>
&nbsp; &nbsp; l<span class="sy3">.</span><span class="kw3">len</span><span class="sy2">++</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Возвращаем nil</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">nil</span>
<span class="sy1">}</span>
&nbsp;
<span class="co1">// Remove удаляет элемент из списка</span>
<span class="kw4">func</span> <span class="sy1">(</span>l <span class="sy3">*</span>LinkedList<span class="sy1">[</span>T<span class="sy1">])</span> Remove<span class="sy1">(</span>index <span class="kw4">int</span><span class="sy1">)</span> <span class="sy1">(</span>T<span class="sy1">,</span> error<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Проверяем корректность индекса</span>
&nbsp; &nbsp; <span class="kw1">if</span> index &lt; <span class="nu0">0</span> <span class="sy3">||</span> index &gt;<span class="sy2">=</span> l<span class="sy3">.</span><span class="kw3">len</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">var</span> zero T
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> zero<span class="sy1">,</span> ErrIndexOutOfRange
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// При индексе 0 выполняем PopFront</span>
&nbsp; &nbsp; <span class="kw1">if</span> index <span class="sy3">==</span> <span class="nu0">0</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; val<span class="sy1">,</span> _ <span class="sy2">:=</span> l<span class="sy3">.</span>PopFront<span class="sy1">()</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> val<span class="sy1">,</span> <span class="kw2">nil</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// При хвостовом индексе удаляем PopBack</span>
&nbsp; &nbsp; <span class="kw1">if</span> index <span class="sy3">==</span> l<span class="sy3">.</span>len<span class="sy3">-</span><span class="nu0">1</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; val<span class="sy1">,</span> _ <span class="sy2">:=</span> l<span class="sy3">.</span>PopBack<span class="sy1">()</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> val<span class="sy1">,</span> <span class="kw2">nil</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// В списке больше одного элемента, индекс в середине</span>
&nbsp; &nbsp; prevNode <span class="sy2">:=</span> l<span class="sy3">.</span>nodeAt<span class="sy1">(</span>index <span class="sy3">-</span> <span class="nu0">1</span><span class="sy1">)</span>
&nbsp; &nbsp; val <span class="sy2">:=</span> prevNode<span class="sy3">.</span>next<span class="sy3">.</span>val
&nbsp; &nbsp; prevNode<span class="sy3">.</span>next <span class="sy2">=</span> prevNode<span class="sy3">.</span>next<span class="sy3">.</span>next
&nbsp; &nbsp; l<span class="sy3">.</span>len<span class="sy2">--</span>
&nbsp; &nbsp; <span class="kw1">return</span> val<span class="sy1">,</span> <span class="kw2">nil</span>
<span class="sy1">}</span>
&nbsp;
<span class="co1">// nodeAt возвращает узел по индексу</span>
<span class="kw4">func</span> <span class="sy1">(</span>l <span class="sy3">*</span>LinkedList<span class="sy1">[</span>T<span class="sy1">])</span> nodeAt<span class="sy1">(</span>index <span class="kw4">int</span><span class="sy1">)</span> <span class="sy3">*</span>Node<span class="sy1">[</span>T<span class="sy1">]</span> <span class="sy1">{</span>
&nbsp; &nbsp; currentNode <span class="sy2">:=</span> l<span class="sy3">.</span>head
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span> <span class="sy2">:=</span> <span class="nu0">0</span><span class="sy1">;</span> <span class="nu2">i</span> &lt; index<span class="sy1">;</span> <span class="nu2">i</span><span class="sy2">++</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; currentNode <span class="sy2">=</span> currentNode<span class="sy3">.</span>next
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="kw1">return</span> currentNode
<span class="sy1">}</span>
&nbsp;
<span class="co1">// Len возвращает длину списка</span>
<span class="kw4">func</span> <span class="sy1">(</span>l <span class="sy3">*</span>LinkedList<span class="sy1">[</span>T<span class="sy1">])</span> Len<span class="sy1">()</span> <span class="kw4">int</span> <span class="sy1">{</span>
&nbsp; &nbsp; <span class="kw1">return</span> l<span class="sy3">.</span><span class="kw3">len</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> <span class="sy1">(</span>l <span class="sy3">*</span>LinkedList<span class="sy1">[</span>T<span class="sy1">])</span> Contains<span class="sy1">(</span>val T<span class="sy1">)</span> <span class="kw4">bool</span> <span class="sy1">{</span>
&nbsp; &nbsp; <span class="kw1">if</span> l<span class="sy3">.</span><span class="kw3">len</span> <span class="sy3">==</span> <span class="nu0">0</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="kw1">for</span> currentNode <span class="sy2">:=</span> l<span class="sy3">.</span>head<span class="sy1">;</span> currentNode <span class="sy2">!=</span> <span class="kw2">nil</span><span class="sy1">;</span> currentNode <span class="sy2">=</span> currentNode<span class="sy3">.</span>next <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> currentNode<span class="sy3">.</span>val <span class="sy3">==</span> val <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> <span class="sy1">(</span>l <span class="sy3">*</span>LinkedList<span class="sy1">[</span>T<span class="sy1">])</span> ToSlice<span class="sy1">()</span> <span class="sy1">[]</span>T <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; slice <span class="sy2">:=</span> <span class="kw3">make</span><span class="sy1">([]</span>T<span class="sy1">,</span> <span class="nu0">0</span><span class="sy1">,</span> l<span class="sy3">.</span><span class="kw3">len</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">for</span> currentNode <span class="sy2">:=</span> l<span class="sy3">.</span>head<span class="sy1">;</span> currentNode <span class="sy2">!=</span> <span class="kw2">nil</span><span class="sy1">;</span> currentNode <span class="sy2">=</span> currentNode<span class="sy3">.</span>next <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; slice <span class="sy2">=</span> append<span class="sy1">(</span>slice<span class="sy1">,</span> currentNode<span class="sy3">.</span>val<span class="sy1">)</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">return</span> slice
<span class="sy1">}</span>
&nbsp;
<span class="co1">// sentinel error-ы</span>
<span class="kw1">var</span> <span class="sy1">(</span>
&nbsp; &nbsp; ErrEmptyList &nbsp; &nbsp; &nbsp; <span class="sy2">=</span> fmt<span class="sy3">.</span>Errorf<span class="sy1">(</span><span class="st0">&quot;linkedlist: list is empty&quot;</span><span class="sy1">)</span>
&nbsp; &nbsp; ErrIndexOutOfRange <span class="sy2">=</span> fmt<span class="sy3">.</span><span class="me1">Errorf</span><span class="sy1">(</span><span class="st0">&quot;linkedlist: index out of range&quot;</span><span class="sy1">)</span>
<span class="sy1">)</span></pre></td></tr></table></div></td></tr></tbody></table></div>Тесты:<br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="649752829"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="649752829" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
</pre></td><td class="de1"><pre class="de1"><span class="kw1">package</span> linkedlist
&nbsp;
<span class="kw1">import</span> <span class="sy1">(</span>
&nbsp; &nbsp; <span class="st0">&quot;testing&quot;</span>
&nbsp;
&nbsp; &nbsp; <span class="st0">&quot;github.com/stretchr/testify/assert&quot;</span>
<span class="sy1">)</span>
&nbsp;
<span class="kw4">func</span> TestPushFrontAndToSlice<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; l <span class="sy2">:=</span> &amp;LinkedList<span class="sy1">[</span><span class="kw4">int</span><span class="sy1">]{}</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushFront<span class="sy1">(</span><span class="nu0">3</span><span class="sy1">)</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushFront<span class="sy1">(</span><span class="nu0">2</span><span class="sy1">)</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushFront<span class="sy1">(</span><span class="nu0">1</span><span class="sy1">)</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>Equal<span class="sy1">(</span>t<span class="sy1">,</span> <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">},</span> l<span class="sy3">.</span>ToSlice<span class="sy1">())</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestPushBack<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; l <span class="sy2">:=</span> &amp;LinkedList<span class="sy1">[</span><span class="kw4">int</span><span class="sy1">]{}</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">1</span><span class="sy1">)</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">2</span><span class="sy1">)</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">3</span><span class="sy1">)</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>Equal<span class="sy1">(</span>t<span class="sy1">,</span> <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">},</span> l<span class="sy3">.</span>ToSlice<span class="sy1">())</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestPopFront<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; l <span class="sy2">:=</span> &amp;LinkedList<span class="sy1">[</span><span class="kw4">int</span><span class="sy1">]{}</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">1</span><span class="sy1">)</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">2</span><span class="sy1">)</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">3</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; val<span class="sy1">,</span> ok <span class="sy2">:=</span> l<span class="sy3">.</span>PopFront<span class="sy1">()</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>True<span class="sy1">(</span>t<span class="sy1">,</span> ok<span class="sy1">)</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>Equal<span class="sy1">(</span>t<span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">,</span> val<span class="sy1">)</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>Equal<span class="sy1">(</span>t<span class="sy1">,</span> <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">},</span> l<span class="sy3">.</span>ToSlice<span class="sy1">())</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestPopFrontEmpty<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; l <span class="sy2">:=</span> &amp;LinkedList<span class="sy1">[</span><span class="kw4">int</span><span class="sy1">]{}</span>
&nbsp; &nbsp; _<span class="sy1">,</span> ok <span class="sy2">:=</span> l<span class="sy3">.</span>PopFront<span class="sy1">()</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>False<span class="sy1">(</span>t<span class="sy1">,</span> ok<span class="sy1">)</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestPopBack<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; l <span class="sy2">:=</span> &amp;LinkedList<span class="sy1">[</span><span class="kw4">int</span><span class="sy1">]{}</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">1</span><span class="sy1">)</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">2</span><span class="sy1">)</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">3</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; val<span class="sy1">,</span> ok <span class="sy2">:=</span> l<span class="sy3">.</span>PopBack<span class="sy1">()</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>True<span class="sy1">(</span>t<span class="sy1">,</span> ok<span class="sy1">)</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>Equal<span class="sy1">(</span>t<span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">,</span> val<span class="sy1">)</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>Equal<span class="sy1">(</span>t<span class="sy1">,</span> <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">},</span> l<span class="sy3">.</span>ToSlice<span class="sy1">())</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestPopBackEmpty<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; l <span class="sy2">:=</span> &amp;LinkedList<span class="sy1">[</span><span class="kw4">int</span><span class="sy1">]{}</span>
&nbsp; &nbsp; _<span class="sy1">,</span> ok <span class="sy2">:=</span> l<span class="sy3">.</span>PopBack<span class="sy1">()</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>False<span class="sy1">(</span>t<span class="sy1">,</span> ok<span class="sy1">)</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestPeekFront<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; l <span class="sy2">:=</span> &amp;LinkedList<span class="sy1">[</span><span class="kw4">int</span><span class="sy1">]{}</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">1</span><span class="sy1">)</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">2</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; val<span class="sy1">,</span> ok <span class="sy2">:=</span> l<span class="sy3">.</span>PeekFront<span class="sy1">()</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>True<span class="sy1">(</span>t<span class="sy1">,</span> ok<span class="sy1">)</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>Equal<span class="sy1">(</span>t<span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">,</span> val<span class="sy1">)</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>Equal<span class="sy1">(</span>t<span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> l<span class="sy3">.</span>Len<span class="sy1">())</span> <span class="co1">// peek не удаляет</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestPeekBack<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; l <span class="sy2">:=</span> &amp;LinkedList<span class="sy1">[</span><span class="kw4">int</span><span class="sy1">]{}</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">1</span><span class="sy1">)</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">2</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; val<span class="sy1">,</span> ok <span class="sy2">:=</span> l<span class="sy3">.</span>PeekBack<span class="sy1">()</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>True<span class="sy1">(</span>t<span class="sy1">,</span> ok<span class="sy1">)</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>Equal<span class="sy1">(</span>t<span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> val<span class="sy1">)</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>Equal<span class="sy1">(</span>t<span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> l<span class="sy3">.</span>Len<span class="sy1">())</span> <span class="co1">// peek не удаляет</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestInsert<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; l <span class="sy2">:=</span> &amp;LinkedList<span class="sy1">[</span><span class="kw4">int</span><span class="sy1">]{}</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">1</span><span class="sy1">)</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">3</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; err <span class="sy2">:=</span> l<span class="sy3">.</span>Insert<span class="sy1">(</span><span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">)</span> <span class="co1">// [1, 2, 3]</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>NoError<span class="sy1">(</span>t<span class="sy1">,</span> err<span class="sy1">)</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>Equal<span class="sy1">(</span>t<span class="sy1">,</span> <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">},</span> l<span class="sy3">.</span>ToSlice<span class="sy1">())</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestInsertAtHead<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; l <span class="sy2">:=</span> &amp;LinkedList<span class="sy1">[</span><span class="kw4">int</span><span class="sy1">]{}</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">2</span><span class="sy1">)</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">3</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; err <span class="sy2">:=</span> l<span class="sy3">.</span>Insert<span class="sy1">(</span><span class="nu0">0</span><span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">)</span> <span class="co1">// [1, 2, 3]</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>NoError<span class="sy1">(</span>t<span class="sy1">,</span> err<span class="sy1">)</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>Equal<span class="sy1">(</span>t<span class="sy1">,</span> <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">},</span> l<span class="sy3">.</span>ToSlice<span class="sy1">())</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestInsertAtTail<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; l <span class="sy2">:=</span> &amp;LinkedList<span class="sy1">[</span><span class="kw4">int</span><span class="sy1">]{}</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">1</span><span class="sy1">)</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">2</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; err <span class="sy2">:=</span> l<span class="sy3">.</span>Insert<span class="sy1">(</span><span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">)</span> <span class="co1">// [1, 2, 3]</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>NoError<span class="sy1">(</span>t<span class="sy1">,</span> err<span class="sy1">)</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>Equal<span class="sy1">(</span>t<span class="sy1">,</span> <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">},</span> l<span class="sy3">.</span>ToSlice<span class="sy1">())</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestInsertOutOfRange<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; l <span class="sy2">:=</span> &amp;LinkedList<span class="sy1">[</span><span class="kw4">int</span><span class="sy1">]{}</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">1</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; err <span class="sy2">:=</span> l<span class="sy3">.</span>Insert<span class="sy1">(</span><span class="nu0">5</span><span class="sy1">,</span> <span class="nu0">99</span><span class="sy1">)</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>ErrorIs<span class="sy1">(</span>t<span class="sy1">,</span> err<span class="sy1">,</span> ErrIndexOutOfRange<span class="sy1">)</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestRemove<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; l <span class="sy2">:=</span> &amp;LinkedList<span class="sy1">[</span><span class="kw4">int</span><span class="sy1">]{}</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">1</span><span class="sy1">)</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">2</span><span class="sy1">)</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">3</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; val<span class="sy1">,</span> err <span class="sy2">:=</span> l<span class="sy3">.</span>Remove<span class="sy1">(</span><span class="nu0">1</span><span class="sy1">)</span> <span class="co1">// удаляем 2</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>NoError<span class="sy1">(</span>t<span class="sy1">,</span> err<span class="sy1">)</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>Equal<span class="sy1">(</span>t<span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> val<span class="sy1">)</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>Equal<span class="sy1">(</span>t<span class="sy1">,</span> <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">},</span> l<span class="sy3">.</span>ToSlice<span class="sy1">())</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestRemoveHead<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; l <span class="sy2">:=</span> &amp;LinkedList<span class="sy1">[</span><span class="kw4">int</span><span class="sy1">]{}</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">1</span><span class="sy1">)</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">2</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; val<span class="sy1">,</span> err <span class="sy2">:=</span> l<span class="sy3">.</span>Remove<span class="sy1">(</span><span class="nu0">0</span><span class="sy1">)</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>NoError<span class="sy1">(</span>t<span class="sy1">,</span> err<span class="sy1">)</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>Equal<span class="sy1">(</span>t<span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">,</span> val<span class="sy1">)</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>Equal<span class="sy1">(</span>t<span class="sy1">,</span> <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">2</span><span class="sy1">},</span> l<span class="sy3">.</span>ToSlice<span class="sy1">())</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestRemoveOutOfRange<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; l <span class="sy2">:=</span> &amp;LinkedList<span class="sy1">[</span><span class="kw4">int</span><span class="sy1">]{}</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">1</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; _<span class="sy1">,</span> err <span class="sy2">:=</span> l<span class="sy3">.</span>Remove<span class="sy1">(</span><span class="nu0">5</span><span class="sy1">)</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>ErrorIs<span class="sy1">(</span>t<span class="sy1">,</span> err<span class="sy1">,</span> ErrIndexOutOfRange<span class="sy1">)</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestLen<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; l <span class="sy2">:=</span> &amp;LinkedList<span class="sy1">[</span><span class="kw4">int</span><span class="sy1">]{}</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>Equal<span class="sy1">(</span>t<span class="sy1">,</span> <span class="nu0">0</span><span class="sy1">,</span> l<span class="sy3">.</span>Len<span class="sy1">())</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">1</span><span class="sy1">)</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">2</span><span class="sy1">)</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>Equal<span class="sy1">(</span>t<span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> l<span class="sy3">.</span>Len<span class="sy1">())</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PopFront<span class="sy1">()</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>Equal<span class="sy1">(</span>t<span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">,</span> l<span class="sy3">.</span>Len<span class="sy1">())</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestContains<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; l <span class="sy2">:=</span> &amp;LinkedList<span class="sy1">[</span><span class="kw4">int</span><span class="sy1">]{}</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">1</span><span class="sy1">)</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">2</span><span class="sy1">)</span>
&nbsp; &nbsp; l<span class="sy3">.</span>PushBack<span class="sy1">(</span><span class="nu0">3</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; assert<span class="sy3">.</span>True<span class="sy1">(</span>t<span class="sy1">,</span> l<span class="sy3">.</span>Contains<span class="sy1">(</span><span class="nu0">2</span><span class="sy1">))</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>False<span class="sy1">(</span>t<span class="sy1">,</span> l<span class="sy3">.</span>Contains<span class="sy1">(</span><span class="nu0">99</span><span class="sy1">))</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestToSliceEmpty<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; l <span class="sy2">:=</span> &amp;LinkedList<span class="sy1">[</span><span class="kw4">int</span><span class="sy1">]{}</span>
&nbsp; &nbsp; assert<span class="sy3">.</span>Equal<span class="sy1">(</span>t<span class="sy1">,</span> <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{},</span> l<span class="sy3">.</span>ToSlice<span class="sy1">())</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="911193591"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="911193591" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
</pre></td><td class="de1"><pre class="de1">go test -v
=== RUN &nbsp; TestPushFrontAndToSlice
--- PASS: TestPushFrontAndToSlice <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestPushBack
--- PASS: TestPushBack <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestPopFront
--- PASS: TestPopFront <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestPopFrontEmpty
--- PASS: TestPopFrontEmpty <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestPopBack
--- PASS: TestPopBack <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestPopBackEmpty
--- PASS: TestPopBackEmpty <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestPeekFront
--- PASS: TestPeekFront <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestPeekBack
--- PASS: TestPeekBack <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestInsert
--- PASS: TestInsert <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestInsertAtHead
--- PASS: TestInsertAtHead <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestInsertAtTail
--- PASS: TestInsertAtTail <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestInsertOutOfRange
--- PASS: TestInsertOutOfRange <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestRemove
--- PASS: TestRemove <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestRemoveHead
--- PASS: TestRemoveHead <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestRemoveOutOfRange
--- PASS: TestRemoveOutOfRange <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestLen
--- PASS: TestLen <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestContains
--- PASS: TestContains <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestToSliceEmpty
--- PASS: TestToSliceEmpty <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
PASS
ok &nbsp;&nbsp; &nbsp; github.com/alhaos/problems/dataStructures/linkedList&nbsp; &nbsp; 0.267s</pre></td></tr></table></div></td></tr></tbody></table></div></div>

]]></content:encoded>
			<dc:creator>alhaos</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1422596/10896.html</guid>
		</item>
		<item>
			<title><![CDATA[[golang] Двоичная куча, min-heap]]></title>
			<link>https://www.cyberforum.ru/blogs/1422596/10895.html</link>
			<pubDate>Wed, 20 May 2026 15:57:16 GMT</pubDate>
			<description>Двоичная куча 
 
Двоичная куча — структура данных, которая всегда держит самый важный элемент...</description>
			<content:encoded><![CDATA[<div><h2>Двоичная куча</h2><br />
<br />
Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове.<br />
<br />
Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше всего HP.<br />
<br />
Как она устроена внутри<br />
<br />
Куча хранится в обычном массиве, но если смотреть на неё как на дерево — каждый узел имеет двух детей. Отсюда название: двоичная (два ребёнка) куча.<br />
<br />
Главное правило — каждый родитель меньше своих детей (в min-heap). Это значит, что самый маленький элемент всегда сидит в корне — на нулевом индексе массива. Не где-то в середине, не в конце — всегда в начале.<br />
<br />
<h4>Реализация на го:</h4><br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="865656611"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="865656611" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
</pre></td><td class="de1"><pre class="de1"><span class="kw1">package</span> binaryHeap
&nbsp;
<span class="kw1">import</span> <span class="st0">&quot;errors&quot;</span>
&nbsp;
<span class="kw1">var</span> ErrEmptyHeap <span class="sy2">=</span> errors<span class="sy3">.</span>New<span class="sy1">(</span><span class="st0">&quot;heap is empty&quot;</span><span class="sy1">)</span>
&nbsp;
<span class="co1">// Интерфейс двоичной кучи</span>
<span class="kw1">type</span> BinaryHeap <span class="kw4">interface</span> <span class="sy1">{</span>
&nbsp; &nbsp; Push<span class="sy1">(</span>n <span class="kw4">int</span><span class="sy1">)</span>
&nbsp; &nbsp; Pop<span class="sy1">()</span> <span class="sy1">(</span><span class="kw4">int</span><span class="sy1">,</span> error<span class="sy1">)</span>
&nbsp; &nbsp; Peek<span class="sy1">()</span> <span class="sy1">(</span><span class="kw4">int</span><span class="sy1">,</span> error<span class="sy1">)</span>
&nbsp; &nbsp; Len<span class="sy1">()</span> <span class="kw4">int</span>
&nbsp; &nbsp; IsEmpty<span class="sy1">()</span> <span class="kw4">bool</span>
<span class="sy1">}</span>
&nbsp;
<span class="co1">// binaryHeap структура двоичной кучи</span>
<span class="kw1">type</span> binaryHeap <span class="kw4">struct</span> <span class="sy1">{</span>
&nbsp; &nbsp; data <span class="sy1">[]</span><span class="kw4">int</span>
<span class="sy1">}</span>
&nbsp;
<span class="co1">// NewBinaryHeap возвращает новый экземпляр структуры BinaryHeap</span>
<span class="kw4">func</span> NewBinaryHeap<span class="sy1">()</span> BinaryHeap <span class="sy1">{</span>
&nbsp; &nbsp; <span class="kw1">return</span> &amp;binaryHeap<span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; data<span class="sy1">:</span> <span class="kw3">make</span><span class="sy1">([]</span><span class="kw4">int</span><span class="sy1">,</span> <span class="nu0">0</span><span class="sy1">,</span> <span class="nu0">16</span><span class="sy1">),</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span>
&nbsp;
<span class="co1">// Push добавляет элемент в двоичную кучу</span>
<span class="kw4">func</span> <span class="sy1">(</span>h <span class="sy3">*</span>binaryHeap<span class="sy1">)</span> Push<span class="sy1">(</span>n <span class="kw4">int</span><span class="sy1">)</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Добавляем в конец массива элемент</span>
&nbsp; &nbsp; h<span class="sy3">.</span><span class="me1">data</span> <span class="sy2">=</span> append<span class="sy1">(</span>h<span class="sy3">.</span><span class="me1">data</span><span class="sy1">,</span> n<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Фиксируем индекс элемента для просеивания вверх</span>
&nbsp; &nbsp; currentIndex <span class="sy2">:=</span> <span class="kw3">len</span><span class="sy1">(</span>h<span class="sy3">.</span>data<span class="sy1">)</span> <span class="sy3">-</span> <span class="nu0">1</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Цикл к корню кучи</span>
&nbsp; &nbsp; <span class="kw1">for</span> currentIndex &gt; <span class="nu0">0</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Находим индекс родительского элемента</span>
&nbsp; &nbsp; &nbsp; &nbsp; parentIndex <span class="sy2">:=</span> <span class="sy1">(</span>currentIndex <span class="sy3">-</span> <span class="nu0">1</span><span class="sy1">)</span> <span class="sy3">/</span> <span class="nu0">2</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Если родительский элемент больше</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> h<span class="sy3">.</span>data<span class="sy1">[</span>parentIndex<span class="sy1">]</span> &gt; h<span class="sy3">.</span>data<span class="sy1">[</span>currentIndex<span class="sy1">]</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Меняем местами с текущим</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; h<span class="sy3">.</span><span class="me1">data</span><span class="sy1">[</span>parentIndex<span class="sy1">],</span> h<span class="sy3">.</span><span class="me1">data</span><span class="sy1">[</span>currentIndex<span class="sy1">]</span> <span class="sy2">=</span> h<span class="sy3">.</span><span class="me1">data</span><span class="sy1">[</span>currentIndex<span class="sy1">],</span> h<span class="sy3">.</span><span class="me1">data</span><span class="sy1">[</span>parentIndex<span class="sy1">]</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Изменяем индекс текущего элемента на индекс родительского элемента</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currentIndex <span class="sy2">=</span> parentIndex
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span> <span class="kw1">else</span> <span class="sy1">{</span> <span class="co1">// Если родительский элемент не больше</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span> <span class="co1">// прерываем цикл</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span>
&nbsp;
<span class="co1">// Pop извлекает корневой элемент из бинарной кучи</span>
<span class="kw4">func</span> <span class="sy1">(</span>h <span class="sy3">*</span>binaryHeap<span class="sy1">)</span> Pop<span class="sy1">()</span> <span class="sy1">(</span><span class="kw4">int</span><span class="sy1">,</span> error<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Если куча пуста возвращаем 0 и ошибку</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="kw3">len</span><span class="sy1">(</span>h<span class="sy3">.</span>data<span class="sy1">)</span> <span class="sy3">==</span> <span class="nu0">0</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy1">,</span> ErrEmptyHeap
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Забираем элемент для возврата</span>
&nbsp; &nbsp; returnValue <span class="sy2">:=</span> h<span class="sy3">.</span>data<span class="sy1">[</span><span class="nu0">0</span><span class="sy1">]</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// На его место вставляем крайний элемент</span>
&nbsp; &nbsp; h<span class="sy3">.</span>data<span class="sy1">[</span><span class="nu0">0</span><span class="sy1">]</span> <span class="sy2">=</span> h<span class="sy3">.</span>data<span class="sy1">[</span><span class="kw3">len</span><span class="sy1">(</span>h<span class="sy3">.</span>data<span class="sy1">)</span><span class="sy3">-</span><span class="nu0">1</span><span class="sy1">]</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Обрезаем слайс</span>
&nbsp; &nbsp; h<span class="sy3">.</span>data <span class="sy2">=</span> h<span class="sy3">.</span>data<span class="sy1">[:</span><span class="kw3">len</span><span class="sy1">(</span>h<span class="sy3">.</span>data<span class="sy1">)</span><span class="sy3">-</span><span class="nu0">1</span><span class="sy1">]</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Устанавливаем 0 как индекс просматриваемого элемента</span>
&nbsp; &nbsp; currentIndex <span class="sy2">:=</span> <span class="nu0">0</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Просеиваем вниз</span>
&nbsp; &nbsp; <span class="kw1">for</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; leftChildIndex <span class="sy2">:=</span> <span class="nu0">2</span><span class="sy3">*</span>currentIndex <span class="sy3">+</span> <span class="nu0">1</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> leftChildIndex &gt;<span class="sy2">=</span> <span class="kw3">len</span><span class="sy1">(</span>h<span class="sy3">.</span>data<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; &nbsp; &nbsp; rightChildIndex <span class="sy2">:=</span> <span class="nu0">2</span><span class="sy3">*</span>currentIndex <span class="sy3">+</span> <span class="nu0">2</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// выбираем наименьшего ребёнка</span>
&nbsp; &nbsp; &nbsp; &nbsp; smallestIndex <span class="sy2">:=</span> leftChildIndex
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> rightChildIndex &lt; <span class="kw3">len</span><span class="sy1">(</span>h<span class="sy3">.</span>data<span class="sy1">)</span> &amp;&amp; h<span class="sy3">.</span>data<span class="sy1">[</span>rightChildIndex<span class="sy1">]</span> &lt; h<span class="sy3">.</span>data<span class="sy1">[</span>leftChildIndex<span class="sy1">]</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; smallestIndex <span class="sy2">=</span> rightChildIndex
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// если текущий элемент уже меньше — стоп</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> h<span class="sy3">.</span>data<span class="sy1">[</span>currentIndex<span class="sy1">]</span> &lt;<span class="sy2">=</span> h<span class="sy3">.</span>data<span class="sy1">[</span>smallestIndex<span class="sy1">]</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; h<span class="sy3">.</span>data<span class="sy1">[</span>currentIndex<span class="sy1">],</span> h<span class="sy3">.</span>data<span class="sy1">[</span>smallestIndex<span class="sy1">]</span> <span class="sy2">=</span> h<span class="sy3">.</span>data<span class="sy1">[</span>smallestIndex<span class="sy1">],</span> h<span class="sy3">.</span>data<span class="sy1">[</span>currentIndex<span class="sy1">]</span>
&nbsp; &nbsp; &nbsp; &nbsp; currentIndex <span class="sy2">=</span> smallestIndex
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">return</span> returnValue<span class="sy1">,</span> <span class="kw2">nil</span>
<span class="sy1">}</span>
&nbsp;
<span class="co1">// Peek Возвращает элемент в корне кучи</span>
<span class="kw4">func</span> <span class="sy1">(</span>h <span class="sy3">*</span>binaryHeap<span class="sy1">)</span> Peek<span class="sy1">()</span> <span class="sy1">(</span><span class="kw4">int</span><span class="sy1">,</span> error<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="kw3">len</span><span class="sy1">(</span>h<span class="sy3">.</span>data<span class="sy1">)</span> <span class="sy3">==</span> <span class="nu0">0</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy1">,</span> ErrEmptyHeap
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="kw1">return</span> h<span class="sy3">.</span>data<span class="sy1">[</span><span class="nu0">0</span><span class="sy1">],</span> <span class="kw2">nil</span>
<span class="sy1">}</span>
&nbsp;
<span class="co1">// Len возвращает длину двоичной кучи</span>
<span class="kw4">func</span> <span class="sy1">(</span>h <span class="sy3">*</span>binaryHeap<span class="sy1">)</span> Len<span class="sy1">()</span> <span class="kw4">int</span> <span class="sy1">{</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw3">len</span><span class="sy1">(</span>h<span class="sy3">.</span>data<span class="sy1">)</span>
<span class="sy1">}</span>
&nbsp;
<span class="co1">// IsEmpty возвращает true если куча пуста, иначе false</span>
<span class="kw4">func</span> <span class="sy1">(</span>h <span class="sy3">*</span>binaryHeap<span class="sy1">)</span> IsEmpty<span class="sy1">()</span> <span class="kw4">bool</span> <span class="sy1">{</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw3">len</span><span class="sy1">(</span>h<span class="sy3">.</span>data<span class="sy1">)</span> <span class="sy3">==</span> <span class="nu0">0</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div><h4>Тесты:</h4><br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="595868143"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="595868143" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
</pre></td><td class="de1"><pre class="de1"><span class="kw1">package</span> binaryHeap
&nbsp;
<span class="kw1">import</span> <span class="sy1">(</span>
&nbsp; &nbsp; <span class="st0">&quot;errors&quot;</span>
&nbsp; &nbsp; <span class="st0">&quot;testing&quot;</span>
<span class="sy1">)</span>
&nbsp;
<span class="kw4">func</span> TestPeekOnEmptyHeap<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; h <span class="sy2">:=</span> NewBinaryHeap<span class="sy1">()</span>
&nbsp; &nbsp; _<span class="sy1">,</span> err <span class="sy2">:=</span> h<span class="sy3">.</span>Peek<span class="sy1">()</span>
&nbsp; &nbsp; <span class="kw1">if</span> err <span class="sy3">==</span> <span class="kw2">nil</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Error<span class="sy1">(</span><span class="st0">&quot;expected error on empty heap&quot;</span><span class="sy1">)</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestPopOnEmptyHeap<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; h <span class="sy2">:=</span> NewBinaryHeap<span class="sy1">()</span>
&nbsp; &nbsp; _<span class="sy1">,</span> err <span class="sy2">:=</span> h<span class="sy3">.</span>Pop<span class="sy1">()</span>
&nbsp; &nbsp; <span class="kw1">if</span> err <span class="sy3">==</span> <span class="kw2">nil</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Error<span class="sy1">(</span><span class="st0">&quot;expected error on empty heap&quot;</span><span class="sy1">)</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestIsEmptyOnNewHeap<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; h <span class="sy2">:=</span> NewBinaryHeap<span class="sy1">()</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="sy3">!</span>h<span class="sy3">.</span>IsEmpty<span class="sy1">()</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Error<span class="sy1">(</span><span class="st0">&quot;expected new heap to be empty&quot;</span><span class="sy1">)</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestLenOnNewHeap<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; h <span class="sy2">:=</span> NewBinaryHeap<span class="sy1">()</span>
&nbsp; &nbsp; <span class="kw1">if</span> h<span class="sy3">.</span>Len<span class="sy1">()</span> <span class="sy2">!=</span> <span class="nu0">0</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Errorf<span class="sy1">(</span><span class="st0">&quot;expected len 0, got %d&quot;</span><span class="sy1">,</span> h<span class="sy3">.</span>Len<span class="sy1">())</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestPushSingleElement<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; h <span class="sy2">:=</span> NewBinaryHeap<span class="sy1">()</span>
&nbsp; &nbsp; h<span class="sy3">.</span>Push<span class="sy1">(</span><span class="nu0">42</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">if</span> h<span class="sy3">.</span>IsEmpty<span class="sy1">()</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Error<span class="sy1">(</span><span class="st0">&quot;expected heap to be non-empty after Push&quot;</span><span class="sy1">)</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="kw1">if</span> h<span class="sy3">.</span>Len<span class="sy1">()</span> <span class="sy2">!=</span> <span class="nu0">1</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Errorf<span class="sy1">(</span><span class="st0">&quot;expected len 1, got %d&quot;</span><span class="sy1">,</span> h<span class="sy3">.</span>Len<span class="sy1">())</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; val<span class="sy1">,</span> err <span class="sy2">:=</span> h<span class="sy3">.</span>Peek<span class="sy1">()</span>
&nbsp; &nbsp; <span class="kw1">if</span> err <span class="sy2">!=</span> <span class="kw2">nil</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Fatalf<span class="sy1">(</span><span class="st0">&quot;unexpected error: %v&quot;</span><span class="sy1">,</span> err<span class="sy1">)</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="kw1">if</span> val <span class="sy2">!=</span> <span class="nu0">42</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Errorf<span class="sy1">(</span><span class="st0">&quot;expected 42, got %d&quot;</span><span class="sy1">,</span> val<span class="sy1">)</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestPushMultipleElementsPeekReturnsMin<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; h <span class="sy2">:=</span> NewBinaryHeap<span class="sy1">()</span>
&nbsp; &nbsp; h<span class="sy3">.</span>Push<span class="sy1">(</span><span class="nu0">30</span><span class="sy1">)</span>
&nbsp; &nbsp; h<span class="sy3">.</span>Push<span class="sy1">(</span><span class="nu0">10</span><span class="sy1">)</span>
&nbsp; &nbsp; h<span class="sy3">.</span>Push<span class="sy1">(</span><span class="nu0">20</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; val<span class="sy1">,</span> err <span class="sy2">:=</span> h<span class="sy3">.</span>Peek<span class="sy1">()</span>
&nbsp; &nbsp; <span class="kw1">if</span> err <span class="sy2">!=</span> <span class="kw2">nil</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Fatalf<span class="sy1">(</span><span class="st0">&quot;unexpected error: %v&quot;</span><span class="sy1">,</span> err<span class="sy1">)</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="kw1">if</span> val <span class="sy2">!=</span> <span class="nu0">10</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Errorf<span class="sy1">(</span><span class="st0">&quot;expected min 10, got %d&quot;</span><span class="sy1">,</span> val<span class="sy1">)</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestPopReturnsSortedOrder<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; h <span class="sy2">:=</span> NewBinaryHeap<span class="sy1">()</span>
&nbsp; &nbsp; input <span class="sy2">:=</span> <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">50</span><span class="sy1">,</span> <span class="nu0">10</span><span class="sy1">,</span> <span class="nu0">40</span><span class="sy1">,</span> <span class="nu0">20</span><span class="sy1">,</span> <span class="nu0">30</span><span class="sy1">}</span>
&nbsp; &nbsp; <span class="kw1">for</span> _<span class="sy1">,</span> v <span class="sy2">:=</span> <span class="kw1">range</span> input <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; h<span class="sy3">.</span>Push<span class="sy1">(</span>v<span class="sy1">)</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; expected <span class="sy2">:=</span> <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">10</span><span class="sy1">,</span> <span class="nu0">20</span><span class="sy1">,</span> <span class="nu0">30</span><span class="sy1">,</span> <span class="nu0">40</span><span class="sy1">,</span> <span class="nu0">50</span><span class="sy1">}</span>
&nbsp; &nbsp; <span class="kw1">for</span> _<span class="sy1">,</span> want <span class="sy2">:=</span> <span class="kw1">range</span> expected <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; got<span class="sy1">,</span> err <span class="sy2">:=</span> h<span class="sy3">.</span>Pop<span class="sy1">()</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> err <span class="sy2">!=</span> <span class="kw2">nil</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Fatalf<span class="sy1">(</span><span class="st0">&quot;unexpected error: %v&quot;</span><span class="sy1">,</span> err<span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> got <span class="sy2">!=</span> want <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Errorf<span class="sy1">(</span><span class="st0">&quot;expected %d, got %d&quot;</span><span class="sy1">,</span> want<span class="sy1">,</span> got<span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestPopDecreasesLen<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; h <span class="sy2">:=</span> NewBinaryHeap<span class="sy1">()</span>
&nbsp; &nbsp; h<span class="sy3">.</span>Push<span class="sy1">(</span><span class="nu0">1</span><span class="sy1">)</span>
&nbsp; &nbsp; h<span class="sy3">.</span>Push<span class="sy1">(</span><span class="nu0">2</span><span class="sy1">)</span>
&nbsp; &nbsp; h<span class="sy3">.</span>Push<span class="sy1">(</span><span class="nu0">3</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; h<span class="sy3">.</span>Pop<span class="sy1">()</span>
&nbsp; &nbsp; <span class="kw1">if</span> h<span class="sy3">.</span>Len<span class="sy1">()</span> <span class="sy2">!=</span> <span class="nu0">2</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Errorf<span class="sy1">(</span><span class="st0">&quot;expected len 2, got %d&quot;</span><span class="sy1">,</span> h<span class="sy3">.</span>Len<span class="sy1">())</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestIsEmptyAfterPopAll<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; h <span class="sy2">:=</span> NewBinaryHeap<span class="sy1">()</span>
&nbsp; &nbsp; h<span class="sy3">.</span>Push<span class="sy1">(</span><span class="nu0">1</span><span class="sy1">)</span>
&nbsp; &nbsp; h<span class="sy3">.</span>Pop<span class="sy1">()</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">if</span> <span class="sy3">!</span>h<span class="sy3">.</span>IsEmpty<span class="sy1">()</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Error<span class="sy1">(</span><span class="st0">&quot;expected heap to be empty after popping all elements&quot;</span><span class="sy1">)</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestPeekDoesNotRemoveElement<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; h <span class="sy2">:=</span> NewBinaryHeap<span class="sy1">()</span>
&nbsp; &nbsp; h<span class="sy3">.</span>Push<span class="sy1">(</span><span class="nu0">5</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; h<span class="sy3">.</span>Peek<span class="sy1">()</span>
&nbsp; &nbsp; <span class="kw1">if</span> h<span class="sy3">.</span>Len<span class="sy1">()</span> <span class="sy2">!=</span> <span class="nu0">1</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Errorf<span class="sy1">(</span><span class="st0">&quot;expected len 1 after Peek, got %d&quot;</span><span class="sy1">,</span> h<span class="sy3">.</span>Len<span class="sy1">())</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> TestErrorType<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; h <span class="sy2">:=</span> NewBinaryHeap<span class="sy1">()</span>
&nbsp; &nbsp; _<span class="sy1">,</span> err <span class="sy2">:=</span> h<span class="sy3">.</span>Pop<span class="sy1">()</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="sy3">!</span>errors<span class="sy3">.</span>Is<span class="sy1">(</span>err<span class="sy1">,</span> ErrEmptyHeap<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Errorf<span class="sy1">(</span><span class="st0">&quot;expected ErrEmptyHeap, got %v&quot;</span><span class="sy1">,</span> err<span class="sy1">)</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="209235653"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="209235653" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="de1"><pre class="de1">go test -v
=== RUN &nbsp; TestPeekOnEmptyHeap
--- PASS: TestPeekOnEmptyHeap <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestPopOnEmptyHeap
--- PASS: TestPopOnEmptyHeap <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestIsEmptyOnNewHeap
--- PASS: TestIsEmptyOnNewHeap <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestLenOnNewHeap
--- PASS: TestLenOnNewHeap <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestPushSingleElement
--- PASS: TestPushSingleElement <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestPushMultipleElementsPeekReturnsMin
--- PASS: TestPushMultipleElementsPeekReturnsMin <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestPopReturnsSortedOrder
--- PASS: TestPopReturnsSortedOrder <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestPopDecreasesLen
--- PASS: TestPopDecreasesLen <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestIsEmptyAfterPopAll
--- PASS: TestIsEmptyAfterPopAll <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestPeekDoesNotRemoveElement
--- PASS: TestPeekDoesNotRemoveElement <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
=== RUN &nbsp; TestErrorType
--- PASS: TestErrorType <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
PASS
ok &nbsp;&nbsp; &nbsp; github.com/alhaos/problems/dataStructures/binaryHeap&nbsp; &nbsp; 0.338s</pre></td></tr></table></div></td></tr></tbody></table></div></div>

]]></content:encoded>
			<dc:creator>alhaos</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1422596/10895.html</guid>
		</item>
		<item>
			<title><![CDATA[[golang] Breadth-First Search]]></title>
			<link>https://www.cyberforum.ru/blogs/1422596/10894.html</link>
			<pubDate>Tue, 19 May 2026 11:47:28 GMT</pubDate>
			<description>BFS (Breadth-First Search) — это базовый алгоритм обхода графа в ширину, который поуровнево...</description>
			<content:encoded><![CDATA[<div>BFS (Breadth-First Search) — это базовый алгоритм обхода графа в ширину, который поуровнево исследует все связанные вершины. Он начинает с выбранной точки и проверяет всех соседей, прежде чем переходить на следующий уровень. Алгоритм идеально подходит для поиска кратчайшего пути в невзвешенных графах.<br />
<br />
Очередь (Queue): Используется для упорядочивания вершин по принципу «первым вошел — первым вышел» (FIFO).<br />
Массив посещенных: Предотвращает зацикливание и повторную обработку уже пройденных вершин.<br />
<br />
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/9/91/Petersen1_tiny.svg/960px-Petersen1_tiny.svg.png" border="0" alt="" style="max-width: 800px; margin: 5px 0px 5px 0px;" /><br />
<br />
Граф задаётся в формате adjacency list (список смежности).<br />
<br />
Тип: map[int][]int<br />
  - Ключ (int): вершина графа (например, 0, 1, 2...)<br />
  - Значение ([]int): срез вершин, в которые можно перейти напрямую из текущей<br />
<br />
Данный граф:<br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="862347086"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="862347086" style="height: 222px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="de1"><pre class="de1">graph <span class="sy2">:=</span> <span class="kw4">map</span><span class="sy1">[</span><span class="kw4">int</span><span class="sy1">][]</span><span class="kw4">int</span><span class="sy1">{</span>
&nbsp; &nbsp; <span class="nu0">0</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">5</span><span class="sy1">},</span> &nbsp;<span class="co1">// Из вершины 0 можно перейти в вершины 1 и 5</span>
&nbsp; &nbsp; <span class="nu0">1</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">6</span><span class="sy1">},</span> &nbsp;<span class="co1">// Из вершины 1 можно перейти в вершины 2 и 6</span>
&nbsp; &nbsp; <span class="nu0">2</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">3</span><span class="sy1">,</span> <span class="nu0">7</span><span class="sy1">},</span> &nbsp;<span class="co1">// Из вершины 2 можно перейти в вершины 3 и 7</span>
&nbsp; &nbsp; <span class="nu0">3</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">4</span><span class="sy1">,</span> <span class="nu0">8</span><span class="sy1">},</span> &nbsp;<span class="co1">// Из вершины 3 можно перейти в вершины 4 и 8</span>
&nbsp; &nbsp; <span class="nu0">4</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">0</span><span class="sy1">,</span> <span class="nu0">9</span><span class="sy1">},</span> &nbsp;<span class="co1">// Из вершины 4 можно перейти в вершины 0 и 9</span>
&nbsp; &nbsp; <span class="nu0">5</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">7</span><span class="sy1">},</span> &nbsp; &nbsp; <span class="co1">// Из вершины 5 можно перейти в вершину 7</span>
&nbsp; &nbsp; <span class="nu0">7</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">9</span><span class="sy1">},</span> &nbsp; &nbsp; <span class="co1">// Из вершины 7 можно перейти в вершину 9</span>
&nbsp; &nbsp; <span class="nu0">9</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">6</span><span class="sy1">},</span> &nbsp; &nbsp; <span class="co1">// Из вершины 9 можно перейти в вершину 6</span>
&nbsp; &nbsp; <span class="nu0">6</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">8</span><span class="sy1">},</span> &nbsp; &nbsp; <span class="co1">// Из вершины 6 можно перейти в вершину 8</span>
&nbsp; &nbsp; <span class="nu0">8</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">5</span><span class="sy1">},</span> &nbsp; &nbsp; <span class="co1">// Из вершины 8 можно перейти в вершину 5</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div>Особенности формата:<br />
1. Неориентированный граф: если есть ребро 0-&gt;1, то должно быть и 1-&gt;0.<br />
  В данном графе рёбра направленные? Проверим: 0-&gt;1 есть, но 1-&gt;0 НЕТ!<br />
  Значит, граф ориентированный (directed graph).<br />
2. Если вершина отсутствует как ключ — у неё нет исходящих рёбер (но могут быть входящие).<br />
3. Порядок соседей в срезе определяет порядок обхода (важно для детерминированного BFS).<br />
4. Граф может содержать циклы: 0→1→2→3→4→0 образует цикл длиной 5.<br />
  Также есть цикл 5→7→9→6→8→5 (длиной 5).<br />
Преимущества такого представления:<br />
- Экономия памяти: хранятся только существующие рёбра O(V+E)<br />
- Быстрый доступ ко всем соседям: O(1) по ключу<br />
- Удобно для BFS/DFS: достаточно пройтись по graph[currentNode]<br />
<br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="825399679"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="825399679" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
</pre></td><td class="de1"><pre class="de1"><span class="co1">// breadthFirstSearch выполняет обход графа в ширину (BFS), начиная с указанной вершины.</span>
<span class="co1">//</span>
<span class="co1">// Параметры:</span>
<span class="co1">// &nbsp; - graph: граф, представленный в виде map[int][]int, где ключ — вершина,</span>
<span class="co1">// &nbsp; &nbsp; а значение — срез смежных вершин (направленные или ненаправленные рёбра).</span>
<span class="co1">// &nbsp; - start: начальная вершина, с которой начинается обход.</span>
<span class="co1">//</span>
<span class="co1">// Возвращаемое значение:</span>
<span class="co1">// &nbsp; - []int: порядок обхода вершин в ширину.</span>
<span class="co1">//</span>
<span class="co1">// Особенности:</span>
<span class="co1">// &nbsp; - Функция использует множество visited (map[int]struct{}{}) для отслеживания</span>
<span class="co1">// &nbsp; &nbsp; уже посещённых вершин, что предотвращает зацикливание и повторный обход.</span>
<span class="co1">// &nbsp; - Обход выполняется итеративно с использованием очереди (queue).</span>
<span class="co1">// &nbsp; - Если граф содержит недостижимые из start вершины, они не будут включены в результат.</span>
<span class="co1">// &nbsp; - Функция корректно работает как с направленными, так и с ненаправленными графами</span>
<span class="co1">// &nbsp; &nbsp; (при условии корректного задания смежных вершин).</span>
<span class="kw4">func</span> breadthFirstSearch<span class="sy1">(</span>graph <span class="kw4">map</span><span class="sy1">[</span><span class="kw4">int</span><span class="sy1">][]</span><span class="kw4">int</span><span class="sy1">,</span> start <span class="kw4">int</span><span class="sy1">)</span> <span class="sy1">[]</span><span class="kw4">int</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// visited — Heshset посещённых вершин.</span>
&nbsp; &nbsp; <span class="co1">// Используем map[int]struct{}{}, а не map[int]bool, потому что:</span>
&nbsp; &nbsp; <span class="co1">// - struct{}{} занимает 0 байт (экономия памяти)</span>
&nbsp; &nbsp; <span class="co1">// - это идиоматичный способ реализации set в Go</span>
&nbsp; &nbsp; <span class="co1">// - явно показывает, что значение не имеет смысла, важен только ключ</span>
&nbsp; &nbsp; visited <span class="sy2">:=</span> <span class="kw4">map</span><span class="sy1">[</span><span class="kw4">int</span><span class="sy1">]</span><span class="kw4">struct</span><span class="sy1">{}{}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// queue — очередь для обхода в ширину (BFS).</span>
&nbsp; &nbsp; <span class="co1">// Используем срез []int как очередь FIFO (First-In-First-Out):</span>
&nbsp; &nbsp; <span class="co1">// - добавление в конец: queue = append(queue, node)</span>
&nbsp; &nbsp; <span class="co1">// - извлечение из начала: currentNode := queue[0]; queue = queue[1:]</span>
&nbsp; &nbsp; queue <span class="sy2">:=</span> <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span>start<span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// visited[start] = struct{}{} — отмечаем начальную вершину как посещённую.</span>
&nbsp; &nbsp; <span class="co1">// Добавляем в множество (hash set) до помещения в очередь, чтобы избежать повторного добавления.</span>
&nbsp; &nbsp; <span class="co1">// struct{}{} — пустая структура, занимающая 0 байт (экономия памяти).</span>
&nbsp; &nbsp; <span class="co1">// Альтернатива с true была бы visited[start] = true, но struct{}{} — идиоматичный способ для set в Go.</span>
&nbsp; &nbsp; visited<span class="sy1">[</span>start<span class="sy1">]</span> <span class="sy2">=</span> <span class="kw4">struct</span><span class="sy1">{}{}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// path — результирующий срез для хранения вершин в порядке обхода BFS.</span>
&nbsp; &nbsp; <span class="co1">// Nil-срез (нулевое значение), память выделится динамически при первом append.</span>
&nbsp; &nbsp; <span class="kw1">var</span> path <span class="sy1">[]</span><span class="kw4">int</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Продолжаем обход, пока очередь не опустеет.</span>
&nbsp; &nbsp; <span class="co1">// Условие len(queue) &gt; 0 — идиоматичный способ проверить, есть ли элементы в очереди на основе среза.</span>
&nbsp; &nbsp; <span class="co1">// Пустая очередь означает, что все достижимые вершины обработаны.</span>
&nbsp; &nbsp; <span class="kw1">for</span> <span class="kw3">len</span><span class="sy1">(</span>queue<span class="sy1">)</span> &gt; <span class="nu0">0</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Берём вершину из начала очереди (принцип FIFO для BFS).</span>
&nbsp; &nbsp; &nbsp; &nbsp; currentNode <span class="sy2">:=</span> queue<span class="sy1">[</span><span class="nu0">0</span><span class="sy1">]</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Удаляем первый элемент из очереди (сдвигаем начало среза).</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// queue[1:] создаёт новый срез, указывающий на те же данные, но без первого элемента.</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Это эквивалент операции &quot;dequeue&quot; в очереди FIFO.</span>
&nbsp; &nbsp; &nbsp; &nbsp; queue <span class="sy2">=</span> queue<span class="sy1">[</span><span class="nu0">1</span><span class="sy1">:]</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Добавляем текущую вершину в результат обхода.</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Порядок добавления соответствует порядку посещения вершин (BFS order).</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// append автоматически расширит срез при необходимости.</span>
&nbsp; &nbsp; &nbsp; &nbsp; path <span class="sy2">=</span> append<span class="sy1">(</span>path<span class="sy1">,</span> currentNode<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Перебираем всех соседей (смежные вершины) текущей вершины.</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// graph[currentNode] возвращает срез всех вершин, в которые можно перейти из currentNode.</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// _ — игнорируем индекс, используем только значение (саму вершину-соседа).</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> _<span class="sy1">,</span> childNode <span class="sy2">:=</span> <span class="kw1">range</span> graph<span class="sy1">[</span>currentNode<span class="sy1">]</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Проверяем, не посещали ли мы уже эту вершину.</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// _, ok — comma ok идиома для проверки существования ключа в map.</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// ok == true — вершина уже в множестве (посещена).</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// !ok — вершина ещё не посещена, значит можно добавить в очередь.</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> _<span class="sy1">,</span> ok <span class="sy2">:=</span> visited<span class="sy1">[</span>childNode<span class="sy1">];</span> <span class="sy3">!</span>ok <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Отмечаем соседнюю вершину как посещённую.</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Делаем это ДО добавления в очередь, чтобы избежать дублирования.</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Если отметить после добавления, вершина может попасть в очередь несколько раз.</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; visited<span class="sy1">[</span>childNode<span class="sy1">]</span> <span class="sy2">=</span> <span class="kw4">struct</span><span class="sy1">{}{}</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Добавляем не посещённого соседа в конец очереди.</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Теперь он будет обработан после всех текущих вершин (FIFO).</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Это и есть суть BFS — сначала обрабатываем вершины на текущем уровне, потом на следующем.</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; queue <span class="sy2">=</span> append<span class="sy1">(</span>queue<span class="sy1">,</span> childNode<span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="kw1">return</span> path
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div><br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="791442500"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="791442500" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
</pre></td><td class="de1"><pre class="de1"><span class="kw4">func</span> TestBreadthFirstSearch<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; testCases <span class="sy2">:=</span> <span class="sy1">[]</span><span class="kw4">struct</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; desc &nbsp; &nbsp; <span class="kw4">string</span>
&nbsp; &nbsp; &nbsp; &nbsp; graph &nbsp; &nbsp;<span class="kw4">map</span><span class="sy1">[</span><span class="kw4">int</span><span class="sy1">][]</span><span class="kw4">int</span>
&nbsp; &nbsp; &nbsp; &nbsp; start &nbsp; &nbsp;<span class="kw4">int</span>
&nbsp; &nbsp; &nbsp; &nbsp; expected <span class="sy1">[]</span><span class="kw4">int</span>
&nbsp; &nbsp; <span class="sy1">}{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; desc<span class="sy1">:</span> <span class="st0">&quot;binary tree&quot;</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; graph<span class="sy1">:</span> <span class="kw4">map</span><span class="sy1">[</span><span class="kw4">int</span><span class="sy1">][]</span><span class="kw4">int</span><span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">3</span><span class="sy1">,</span> <span class="nu0">4</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">2</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">5</span><span class="sy1">,</span> <span class="nu0">6</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">3</span><span class="sy1">:</span> <span class="sy1">{},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">4</span><span class="sy1">:</span> <span class="sy1">{},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">5</span><span class="sy1">:</span> <span class="sy1">{},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">6</span><span class="sy1">:</span> <span class="sy1">{},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; start<span class="sy1">:</span> &nbsp; &nbsp;<span class="nu0">0</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; expected<span class="sy1">:</span> <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">0</span><span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">,</span> <span class="nu0">4</span><span class="sy1">,</span> <span class="nu0">5</span><span class="sy1">,</span> <span class="nu0">6</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; desc<span class="sy1">:</span> <span class="st0">&quot;peterson graph&quot;</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; graph<span class="sy1">:</span> <span class="kw4">map</span><span class="sy1">[</span><span class="kw4">int</span><span class="sy1">][]</span><span class="kw4">int</span><span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">5</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">6</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">2</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">3</span><span class="sy1">,</span> <span class="nu0">7</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">3</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">4</span><span class="sy1">,</span> <span class="nu0">8</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">4</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">0</span><span class="sy1">,</span> <span class="nu0">9</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">5</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">7</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">7</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">9</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">9</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">6</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">6</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">8</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">8</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">5</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; start<span class="sy1">:</span> &nbsp; &nbsp;<span class="nu0">0</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; expected<span class="sy1">:</span> <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">0</span><span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">,</span> <span class="nu0">4</span><span class="sy1">,</span> <span class="nu0">5</span><span class="sy1">,</span> <span class="nu0">6</span><span class="sy1">,</span> <span class="nu0">7</span><span class="sy1">,</span> <span class="nu0">8</span><span class="sy1">,</span> <span class="nu0">9</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; desc<span class="sy1">:</span> <span class="st0">&quot;single node&quot;</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; graph<span class="sy1">:</span> <span class="kw4">map</span><span class="sy1">[</span><span class="kw4">int</span><span class="sy1">][]</span><span class="kw4">int</span><span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span><span class="sy1">:</span> <span class="sy1">{},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; start<span class="sy1">:</span> &nbsp; &nbsp;<span class="nu0">0</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; expected<span class="sy1">:</span> <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">0</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; desc<span class="sy1">:</span> <span class="st0">&quot;linear chain&quot;</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; graph<span class="sy1">:</span> <span class="kw4">map</span><span class="sy1">[</span><span class="kw4">int</span><span class="sy1">][]</span><span class="kw4">int</span><span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">0</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">1</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">2</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">2</span><span class="sy1">:</span> <span class="sy1">{</span><span class="nu0">3</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">3</span><span class="sy1">:</span> <span class="sy1">{},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; start<span class="sy1">:</span> &nbsp; &nbsp;<span class="nu0">0</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; expected<span class="sy1">:</span> <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">0</span><span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="kw1">for</span> _<span class="sy1">,</span> tC <span class="sy2">:=</span> <span class="kw1">range</span> testCases <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Run<span class="sy1">(</span>tC<span class="sy3">.</span>desc<span class="sy1">,</span> <span class="kw4">func</span><span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result <span class="sy2">:=</span> breadthFirstSearch<span class="sy1">(</span>tC<span class="sy3">.</span>graph<span class="sy1">,</span> tC<span class="sy3">.</span>start<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; got <span class="sy2">:=</span> <span class="kw3">make</span><span class="sy1">([]</span><span class="kw4">int</span><span class="sy1">,</span> <span class="kw3">len</span><span class="sy1">(</span>result<span class="sy1">))</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">copy</span><span class="sy1">(</span>got<span class="sy1">,</span> result<span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exp <span class="sy2">:=</span> <span class="kw3">make</span><span class="sy1">([]</span><span class="kw4">int</span><span class="sy1">,</span> <span class="kw3">len</span><span class="sy1">(</span>tC<span class="sy3">.</span>expected<span class="sy1">))</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">copy</span><span class="sy1">(</span>exp<span class="sy1">,</span> tC<span class="sy3">.</span>expected<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; slices<span class="sy3">.</span>Sort<span class="sy1">(</span>got<span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; slices<span class="sy3">.</span>Sort<span class="sy1">(</span>exp<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="sy3">!</span>reflect<span class="sy3">.</span>DeepEqual<span class="sy1">(</span>got<span class="sy1">,</span> exp<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Errorf<span class="sy1">(</span><span class="st0">&quot;breadthFirstSearch (%v, start=%d): expected %v, got %v&quot;</span><span class="sy1">,</span> tC<span class="sy3">.</span><span class="me1">graph</span><span class="sy1">,</span> tC<span class="sy3">.</span><span class="me1">start</span><span class="sy1">,</span> tC<span class="sy3">.</span><span class="me1">expected</span><span class="sy1">,</span> result<span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">})</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="678366180"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="678366180" style="height: 238px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="de1"><pre class="de1">go test -run TestBreadthFirstSearch -v
=== RUN &nbsp; TestBreadthFirstSearch
=== RUN &nbsp; TestBreadthFirstSearch/binary_tree
=== RUN &nbsp; TestBreadthFirstSearch/peterson_graph
=== RUN &nbsp; TestBreadthFirstSearch/single_node
=== RUN &nbsp; TestBreadthFirstSearch/linear_chain
--- PASS: TestBreadthFirstSearch <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
&nbsp; &nbsp; --- PASS: TestBreadthFirstSearch/binary_tree <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
&nbsp; &nbsp; --- PASS: TestBreadthFirstSearch/peterson_graph <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
&nbsp; &nbsp; --- PASS: TestBreadthFirstSearch/single_node <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
&nbsp; &nbsp; --- PASS: TestBreadthFirstSearch/linear_chain <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
PASS
ok &nbsp;&nbsp; &nbsp; github.com/alhaos/problems/misc 0.292s</pre></td></tr></table></div></td></tr></tbody></table></div>В процессе разбора работы алгоритма и написания поста импользовал claude.ai и deepseek<br />
<br />
код доступен <a rel="nofollow noopener noreferrer" href="https://github.com/alhaos/problems/tree/main/misc" target="_blank" title="https://github.com/alhaos/problems/tree/main/misc">тут</a><br />
<br />
А надо мне это было для решения вот этой задачи<br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="757431670"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="757431670" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
</pre></td><td class="de1"><pre class="de1"><span class="co1">// ConcurrentBFSQueries обходит граф конкурентно из нескольких вершин queries</span>
<span class="kw4">func</span> ConcurrentBFSQueries<span class="sy1">(</span>graph <span class="kw4">map</span><span class="sy1">[</span><span class="kw4">int</span><span class="sy1">][]</span><span class="kw4">int</span><span class="sy1">,</span> queries <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">,</span> numWorkers <span class="kw4">int</span><span class="sy1">)</span> <span class="kw4">map</span><span class="sy1">[</span><span class="kw4">int</span><span class="sy1">][]</span><span class="kw4">int</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// К заданию был тест с нулевым количеством воркунов который должен вернуть map[int][]int{}</span>
&nbsp; &nbsp; <span class="co1">// поэтому просто оставлю это тут</span>
&nbsp; &nbsp; <span class="kw1">if</span> numWorkers <span class="sy3">==</span> <span class="nu0">0</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw4">map</span><span class="sy1">[</span><span class="kw4">int</span><span class="sy1">][]</span><span class="kw4">int</span><span class="sy1">{}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Приметив синхронизации WaitGroup</span>
&nbsp; &nbsp; <span class="co1">// используется для того чтобы дождаться выполнения всех параллельных</span>
&nbsp; &nbsp; <span class="co1">// горутин и двигаться дальше</span>
&nbsp; &nbsp; <span class="kw1">var</span> wg sync<span class="sy3">.</span>WaitGroup
&nbsp;
&nbsp; &nbsp; <span class="co1">// Приметив синхронизации Mutex, реализация дефолтного map потоко не безопасна</span>
&nbsp; &nbsp; <span class="co1">// использую Mutex для безлопастной конкурентной работы с map </span>
&nbsp; &nbsp; <span class="kw1">var</span> mu <span class="kw5">sync.<span class="me1">Mutex</span></span>
&nbsp; &nbsp; 
&nbsp; &nbsp; <span class="co1">// Map для результатов</span>
&nbsp; &nbsp; result <span class="sy2">:=</span> <span class="kw3">make</span><span class="sy1">(</span><span class="kw4">map</span><span class="sy1">[</span><span class="kw4">int</span><span class="sy1">][]</span><span class="kw4">int</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Шаблон семафор реализуется в go через канал буферизированный канал в который пишется</span>
&nbsp; &nbsp; <span class="co1">// пустая структура для экономии памяти, когда буфер заполнен следующая горутина</span>
&nbsp; &nbsp; <span class="co1">// пытающаяся записать в канал выхватывает блокировку до момента пока кто то не вычитает из канала</span>
&nbsp; &nbsp; semaphore <span class="sy2">:=</span> <span class="kw3">make</span><span class="sy1">(</span><span class="kw4">chan</span> <span class="kw4">struct</span><span class="sy1">{},</span> numWorkers<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Цикл по узлам с которых начинается поиск в ширину</span>
&nbsp; &nbsp; <span class="kw1">for</span> _<span class="sy1">,</span> query <span class="sy2">:=</span> <span class="kw1">range</span> queries <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// занимаем один слот в WaitGroup</span>
&nbsp; &nbsp; &nbsp; &nbsp; wg<span class="sy3">.</span>Add<span class="sy1">(</span><span class="nu0">1</span><span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// занимаем слот в семафоре</span>
&nbsp; &nbsp; &nbsp; &nbsp; semaphore &lt;<span class="sy3">-</span> <span class="kw4">struct</span><span class="sy1">{}{}</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// конкурентно запускаем функцию</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">go</span> <span class="kw4">func</span><span class="sy1">(</span>q <span class="kw4">int</span><span class="sy1">)</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// это выполнится в конце функции независимо от того где из нее вышли</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// высвобождаем слот в WaitGroup</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">defer</span> wg<span class="sy3">.</span>Done<span class="sy1">()</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// это выполнится в конце функции независимо от того где из нее вышли</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// высвобождаем слот в семафоре</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">defer</span> <span class="kw4">func</span><span class="sy1">()</span> <span class="sy1">{</span> &lt;<span class="sy3">-</span>semaphore <span class="sy1">}()</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// получаем результат поиска </span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bfsResult <span class="sy2">:=</span> breadthFirstSearch<span class="sy1">(</span>graph<span class="sy1">,</span> q<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// вешаем блокировку</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mu<span class="sy3">.</span><span class="me1">Lock</span><span class="sy1">()</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// безопасно добавляем результат</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result<span class="sy1">[</span>q<span class="sy1">]</span> <span class="sy2">=</span> bfsResult
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// снимаем блокировку</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mu<span class="sy3">.</span><span class="me1">Unlock</span><span class="sy1">()</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}(</span>query<span class="sy1">)</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// тут ждем пока все слоты в WaitGroup высвободятся </span>
&nbsp; &nbsp; wg<span class="sy3">.</span><span class="me1">Wait</span><span class="sy1">()</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// возвращаем result</span>
&nbsp; &nbsp; <span class="kw1">return</span> result
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div></div>

]]></content:encoded>
			<dc:creator>alhaos</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1422596/10894.html</guid>
		</item>
		<item>
			<title><![CDATA[[golang] Алгоритм «Хак Госпера»]]></title>
			<link>https://www.cyberforum.ru/blogs/1422596/10892.html</link>
			<pubDate>Sun, 17 May 2026 16:17:17 GMT</pubDate>
			<description><![CDATA[Алгоритм «Хак Госпера» 
 
Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине...]]></description>
			<content:encoded><![CDATA[<div><h2>Алгоритм «Хак Госпера»</h2><br />
<br />
Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит.<br />
<br />
Придуман Биллом Госпером в 1970-х, опубликован в HAKMEM — легендарном сборнике MIT AI Lab с математическими и программистскими трюками.<br />
<br />
продвинуть одну единицу левее — число вырастет<br />
<br />
вернуть оставшиеся единицы в самые младшие позиции — число будет наименьшим из возможных<br />
<br />
<h3>Реализация на Go</h3><br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="547418650"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="547418650" style="height: 174px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
</pre></td><td class="de1"><pre class="de1"><span class="kw4">func</span> NextCombination<span class="sy1">(</span>x <span class="kw4">uint8</span><span class="sy1">)</span> <span class="kw4">uint8</span> <span class="sy1">{</span>
&nbsp; c <span class="sy2">:=</span> x &amp; <span class="sy3">-</span>x &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// шаг 1: младший установленный бит</span>
&nbsp; r <span class="sy2">:=</span> x <span class="sy3">+</span> c &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">// шаг 2: сдвигаем правый блок единиц влево</span>
&nbsp; changed <span class="sy2">:=</span> r <span class="sy3">^</span> x &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">// шаг 3: биты которые изменились</span>
&nbsp; shifted <span class="sy2">:=</span> changed &gt;&gt; <span class="nu0">2</span> <span class="co1">// шаг 4: убираем два лишних бита</span>
&nbsp; tail <span class="sy2">:=</span> shifted <span class="sy3">/</span> c &nbsp; &nbsp; <span class="co1">// шаг 5: нормализуем к нулевой позиции</span>
&nbsp; next <span class="sy2">:=</span> tail <span class="sy3">|</span> r &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">// шаг 6: собираем результат</span>
&nbsp; <span class="kw1">return</span> next
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div><h3>Тесты</h3><br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="194250904"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="194250904" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="de1"><pre class="de1"><span class="kw1">import</span> <span class="sy1">(</span>
&nbsp; <span class="st0">&quot;testing&quot;</span>
<span class="sy1">)</span>
&nbsp;
<span class="kw4">func</span> TestNextCombination<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; tests <span class="sy2">:=</span> <span class="sy1">[]</span><span class="kw4">struct</span> <span class="sy1">{</span>
&nbsp; &nbsp; name <span class="kw4">string</span>
&nbsp; &nbsp; x &nbsp; &nbsp;<span class="kw4">uint8</span>
&nbsp; &nbsp; want <span class="kw4">uint8</span>
&nbsp; <span class="sy1">}{</span>
&nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot;6 -&gt; 9 (биты 1,2 -&gt; биты 0,3)&quot;</span><span class="sy1">,</span> <span class="nu0">6</span><span class="sy1">,</span> <span class="nu0">9</span><span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot;9 -&gt; 10 (биты 0,3 -&gt; биты 1,3)&quot;</span><span class="sy1">,</span> <span class="nu0">9</span><span class="sy1">,</span> <span class="nu0">10</span><span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot;10 -&gt; 12 (биты 1,3 -&gt; биты 2,3)&quot;</span><span class="sy1">,</span> <span class="nu0">10</span><span class="sy1">,</span> <span class="nu0">12</span><span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot;12 -&gt; 17 (биты 2,3 -&gt; биты 0,4)&quot;</span><span class="sy1">,</span> <span class="nu0">12</span><span class="sy1">,</span> <span class="nu0">17</span><span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot;7 -&gt; 11 (биты 0,1,2 -&gt; биты 0,1,3)&quot;</span><span class="sy1">,</span> <span class="nu0">7</span><span class="sy1">,</span> <span class="nu0">11</span><span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot;11 -&gt; 13&quot;</span><span class="sy1">,</span> <span class="nu0">11</span><span class="sy1">,</span> <span class="nu0">13</span><span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot;13 -&gt; 14&quot;</span><span class="sy1">,</span> <span class="nu0">13</span><span class="sy1">,</span> <span class="nu0">14</span><span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot;14 -&gt; 19&quot;</span><span class="sy1">,</span> <span class="nu0">14</span><span class="sy1">,</span> <span class="nu0">19</span><span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot;1 -&gt; 2 (один бит)&quot;</span><span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot;2 -&gt; 4&quot;</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">4</span><span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot;4 -&gt; 8&quot;</span><span class="sy1">,</span> <span class="nu0">4</span><span class="sy1">,</span> <span class="nu0">8</span><span class="sy1">},</span>
&nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; <span class="kw1">for</span> _<span class="sy1">,</span> tt <span class="sy2">:=</span> <span class="kw1">range</span> tests <span class="sy1">{</span>
&nbsp; &nbsp; t<span class="sy3">.</span>Run<span class="sy1">(</span>tt<span class="sy3">.</span>name<span class="sy1">,</span> <span class="kw4">func</span><span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; got <span class="sy2">:=</span> NextCombination<span class="sy1">(</span>tt<span class="sy3">.</span>x<span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> got <span class="sy2">!=</span> tt<span class="sy3">.</span>want <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Errorf<span class="sy1">(</span><span class="st0">&quot;NextCombination(%d) = %d, want %d&quot;</span><span class="sy1">,</span> tt<span class="sy3">.</span><span class="me1">x</span><span class="sy1">,</span> got<span class="sy1">,</span> tt<span class="sy3">.</span><span class="me1">want</span><span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">})</span>
&nbsp; <span class="sy1">}</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="707658088"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="707658088" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="de1"><pre class="de1">PS C:\repo\problems\utils&gt; go test -v
=== RUN &nbsp; TestNextCombination
=== RUN &nbsp; TestNextCombination/<span class="nu0">6</span>_-&gt;_9_<span class="br0">&#40;</span>биты_1,<span class="nu0">2</span>_-&gt;_биты_0,<span class="nu0">3</span><span class="br0">&#41;</span>
=== RUN &nbsp; TestNextCombination/<span class="nu0">9</span>_-&gt;_10_<span class="br0">&#40;</span>биты_0,<span class="nu0">3</span>_-&gt;_биты_1,<span class="nu0">3</span><span class="br0">&#41;</span>
=== RUN &nbsp; TestNextCombination/<span class="nu0">10</span>_-&gt;_12_<span class="br0">&#40;</span>биты_1,<span class="nu0">3</span>_-&gt;_биты_2,<span class="nu0">3</span><span class="br0">&#41;</span>
=== RUN &nbsp; TestNextCombination/<span class="nu0">12</span>_-&gt;_17_<span class="br0">&#40;</span>биты_2,<span class="nu0">3</span>_-&gt;_биты_0,<span class="nu0">4</span><span class="br0">&#41;</span>
=== RUN &nbsp; TestNextCombination/<span class="nu0">7</span>_-&gt;_11_<span class="br0">&#40;</span>биты_0,<span class="nu0">1</span>,<span class="nu0">2</span>_-&gt;_биты_0,<span class="nu0">1</span>,<span class="nu0">3</span><span class="br0">&#41;</span>
=== RUN &nbsp; TestNextCombination/<span class="nu0">11</span>_-&gt;_13
=== RUN &nbsp; TestNextCombination/<span class="nu0">13</span>_-&gt;_14
=== RUN &nbsp; TestNextCombination/<span class="nu0">14</span>_-&gt;_19
=== RUN &nbsp; TestNextCombination/<span class="nu0">1</span>_-&gt;_2_<span class="br0">&#40;</span>один_бит<span class="br0">&#41;</span>
=== RUN &nbsp; TestNextCombination/<span class="nu0">2</span>_-&gt;_4
=== RUN &nbsp; TestNextCombination/<span class="nu0">4</span>_-&gt;_8
--- PASS: TestNextCombination <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
&nbsp; &nbsp; --- PASS: TestNextCombination/<span class="nu0">6</span>_-&gt;_9_<span class="br0">&#40;</span>биты_1,<span class="nu0">2</span>_-&gt;_биты_0,<span class="nu0">3</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
&nbsp; &nbsp; --- PASS: TestNextCombination/<span class="nu0">9</span>_-&gt;_10_<span class="br0">&#40;</span>биты_0,<span class="nu0">3</span>_-&gt;_биты_1,<span class="nu0">3</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
&nbsp; &nbsp; --- PASS: TestNextCombination/<span class="nu0">10</span>_-&gt;_12_<span class="br0">&#40;</span>биты_1,<span class="nu0">3</span>_-&gt;_биты_2,<span class="nu0">3</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
&nbsp; &nbsp; --- PASS: TestNextCombination/<span class="nu0">12</span>_-&gt;_17_<span class="br0">&#40;</span>биты_2,<span class="nu0">3</span>_-&gt;_биты_0,<span class="nu0">4</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
&nbsp; &nbsp; --- PASS: TestNextCombination/<span class="nu0">7</span>_-&gt;_11_<span class="br0">&#40;</span>биты_0,<span class="nu0">1</span>,<span class="nu0">2</span>_-&gt;_биты_0,<span class="nu0">1</span>,<span class="nu0">3</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
&nbsp; &nbsp; --- PASS: TestNextCombination/<span class="nu0">11</span>_-&gt;_13 <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
&nbsp; &nbsp; --- PASS: TestNextCombination/<span class="nu0">13</span>_-&gt;_14 <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
&nbsp; &nbsp; --- PASS: TestNextCombination/<span class="nu0">14</span>_-&gt;_19 <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
&nbsp; &nbsp; --- PASS: TestNextCombination/<span class="nu0">1</span>_-&gt;_2_<span class="br0">&#40;</span>один_бит<span class="br0">&#41;</span> <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
&nbsp; &nbsp; --- PASS: TestNextCombination/<span class="nu0">2</span>_-&gt;_4 <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
&nbsp; &nbsp; --- PASS: TestNextCombination/<span class="nu0">4</span>_-&gt;_8 <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
PASS
ok &nbsp; &nbsp;github.com/alhaos/problems/utils &nbsp;0.179s</pre></td></tr></table></div></td></tr></tbody></table></div><h3>Разбор на примере `x = 6`</h3><br />
<br />
<h3>Шаг 1: Младший установленный бит</h3><br />
<br />
Необходимо установить младший из установленных бит, для этого совершаем<br />
логическое сложение числа с его отрицательным значением.<br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="8140466"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="8140466" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">c <span class="sy2">:=</span> x <span class="sy3">&amp;</span> <span class="sy3">-</span>x</pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="637261636"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="637261636" style="height: 94px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
</pre></td><td class="de1"><pre class="de1">&nbsp; 00000110 &nbsp;<span class="br0">&#40;</span><span class="nu0">6</span><span class="br0">&#41;</span>
&amp; <span class="nu0">11111010</span> &nbsp;<span class="br0">&#40;</span>-<span class="nu0">6</span><span class="br0">&#41;</span>
&nbsp; --------
&nbsp; 00000010 &nbsp;<span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span></pre></td></tr></table></div></td></tr></tbody></table></div><h3>Шаг 2: Сдвигаем правый блок единиц влево</h3><br />
<br />
Это главное действие алгоритма. Прибавление c к x вызывает цепочку переносов<br />
через весь правый блок единиц — они все гасятся и появляется одна новая единица<br />
левее блока. Так мы «продвигаем» комбинацию вперёд.<br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="764721166"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="764721166" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">r <span class="sy2">:=</span> x <span class="sy3">+</span> c</pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="682789726"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="682789726" style="height: 94px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
</pre></td><td class="de1"><pre class="de1">&nbsp; 00000110 &nbsp;<span class="br0">&#40;</span><span class="nu0">6</span><span class="br0">&#41;</span>
+ 00000010 &nbsp;<span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span>
----------
&nbsp; 00001000 &nbsp;<span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span></pre></td></tr></table></div></td></tr></tbody></table></div><h3>Шаг 3: Биты которые изменились</h3><br />
<br />
Отслеживаем что поменялось<br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="461140062"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="461140062" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">changed <span class="sy2">:=</span> r <span class="sy3">^</span> x</pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="47054126"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="47054126" style="height: 94px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
</pre></td><td class="de1"><pre class="de1">&nbsp; 00001000 &nbsp;<span class="br0">&#40;</span><span class="nu0">8</span><span class="br0">&#41;</span>
^ 00000110 &nbsp;<span class="br0">&#40;</span><span class="nu0">6</span><span class="br0">&#41;</span>
----------
&nbsp; 00001110 &nbsp;<span class="br0">&#40;</span><span class="nu0">14</span><span class="br0">&#41;</span></pre></td></tr></table></div></td></tr></tbody></table></div><h3>Шаг 4: Убираем два лишних бита</h3><br />
<br />
В результате XOR есть два «служебных» бита которые нас не интересуют: новая<br />
единица в r и позиция самого c. Сдвиг на 2 убирает их, оставляя только счётчик<br />
потерянных единиц.<br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="957688882"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="957688882" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">shifted <span class="sy2">:=</span> changed &gt;&gt; <span class="nu0">2</span></pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="474208692"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="474208692" style="height: 94px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
</pre></td><td class="de1"><pre class="de1">&nbsp; 00001110 &nbsp;<span class="br0">&#40;</span><span class="nu0">14</span><span class="br0">&#41;</span>
&gt;&gt;<span class="nu0">2</span>
----------
&nbsp; 00000011 &nbsp;<span class="br0">&#40;</span><span class="nu0">3</span><span class="br0">&#41;</span></pre></td></tr></table></div></td></tr></tbody></table></div><h3>Шаг 5: Нормализуем к нулевой позиции</h3><br />
<br />
После сдвига на 2 потерянные единицы ещё находятся не на своём месте — они<br />
смещены на k позиций вправо где k — позиция бита c. Деление на c = 2^k это<br />
просто правый сдвиг на k, который опускает их к нулевому биту. Теперь хвост<br />
готов к вставке.<br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="137181200"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="137181200" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">tail <span class="sy2">:=</span> shifted <span class="sy3">/</span> c</pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="476809350"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="476809350" style="height: 94px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
</pre></td><td class="de1"><pre class="de1">&nbsp; 00000011 &nbsp;<span class="br0">&#40;</span><span class="nu0">3</span><span class="br0">&#41;</span>
/ <span class="nu0">2</span>
----------
&nbsp; 00000001 &nbsp;<span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span></pre></td></tr></table></div></td></tr></tbody></table></div><h3>Шаг 6: Собираем результат</h3><br />
<br />
Объединяем два независимых куска: r содержит продвинутую левую часть, tail<br />
содержит восстановленный правый хвост. OR склеивает их в финальное число с тем<br />
же количеством единиц.<br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="359198657"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="359198657" style="height: 46px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
</pre></td><td class="de1"><pre class="de1">next <span class="sy2">:=</span> tail <span class="sy3">|</span> r</pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="848205302"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="848205302" style="height: 94px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
</pre></td><td class="de1"><pre class="de1">&nbsp; 00001000 &nbsp;<span class="br0">&#40;</span><span class="nu0">8</span><span class="br0">&#41;</span>
| 00000001 &nbsp;<span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>
----------
&nbsp; 00001001 &nbsp;<span class="br0">&#40;</span><span class="nu0">9</span><span class="br0">&#41;</span></pre></td></tr></table></div></td></tr></tbody></table></div></div>

]]></content:encoded>
			<dc:creator>alhaos</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1422596/10892.html</guid>
		</item>
		<item>
			<title><![CDATA[[golang] Угол между стрелками часов]]></title>
			<link>https://www.cyberforum.ru/blogs/1422596/10888.html</link>
			<pubDate>Tue, 12 May 2026 10:05:21 GMT</pubDate>
			<description>По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками...</description>
			<content:encoded><![CDATA[<div>По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов.<br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="865953347"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="865953347" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="de1"><pre class="de1"><span class="kw1">import</span> <span class="st0">&quot;math&quot;</span>
&nbsp;
<span class="kw4">func</span> angleClock<span class="sy1">(</span>hour <span class="kw4">int</span><span class="sy1">,</span> minutes <span class="kw4">int</span><span class="sy1">)</span> <span class="kw4">float64</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">const</span> <span class="sy1">(</span>
&nbsp; &nbsp; &nbsp; &nbsp; oneMinuteAngle <span class="sy2">=</span> <span class="nu0">6</span><span class="sy3">.</span><span class="nu0">0</span>
&nbsp; &nbsp; &nbsp; &nbsp; oneHourAngle <span class="sy2">=</span> <span class="nu0">30</span><span class="sy3">.</span><span class="nu0">0</span>
&nbsp; &nbsp; &nbsp; &nbsp; oneMinuteForHourAngle <span class="sy2">=</span> <span class="sy3">.</span><span class="nu0">5</span>
&nbsp; &nbsp; <span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">if</span> hour &gt;<span class="sy2">=</span> <span class="nu0">12</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; hour <span class="sy2">-=</span> <span class="nu0">12</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; minutesAngle <span class="sy2">:=</span> <span class="kw4">float64</span><span class="sy1">(</span>minutes<span class="sy1">)</span> <span class="sy3">*</span> oneMinuteAngle
&nbsp; &nbsp; hourAngle <span class="sy2">:=</span> <span class="kw4">float64</span><span class="sy1">(</span>hour<span class="sy1">)</span> <span class="sy3">*</span> oneHourAngle <span class="sy3">+</span> <span class="kw4">float64</span><span class="sy1">(</span>minutes<span class="sy1">)</span> <span class="sy3">*</span> oneMinuteForHourAngle
&nbsp;
&nbsp; &nbsp; angle <span class="sy2">:=</span> math<span class="sy3">.</span>Abs<span class="sy1">(</span>hourAngle <span class="sy3">-</span> minutesAngle<span class="sy1">)</span>
&nbsp; &nbsp; <span class="kw1">if</span> angle &gt; <span class="nu0">180</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; angle <span class="sy2">=</span> <span class="nu0">360</span> <span class="sy3">-</span> angle
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">return</span> angle
&nbsp;
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="689360289"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="689360289" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
</pre></td><td class="de1"><pre class="de1"><span class="kw4">func</span> TestAngleClock<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; testCases <span class="sy2">:=</span> <span class="sy1">[]</span><span class="kw4">struct</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; desc &nbsp; &nbsp; <span class="kw4">string</span>
&nbsp; &nbsp; &nbsp; &nbsp; hour &nbsp; &nbsp; <span class="kw4">int</span>
&nbsp; &nbsp; &nbsp; &nbsp; minutes &nbsp;<span class="kw4">int</span>
&nbsp; &nbsp; &nbsp; &nbsp; expected <span class="kw4">float64</span>
&nbsp; &nbsp; <span class="sy1">}{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; desc<span class="sy1">:</span> &nbsp; &nbsp; <span class="st0">&quot;#1&quot;</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hour<span class="sy1">:</span> &nbsp; &nbsp; <span class="nu0">12</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; minutes<span class="sy1">:</span> &nbsp;<span class="nu0">30</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; expected<span class="sy1">:</span> <span class="nu0">165</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; desc<span class="sy1">:</span> &nbsp; &nbsp; <span class="st0">&quot;#2&quot;</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hour<span class="sy1">:</span> &nbsp; &nbsp; <span class="nu0">3</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; minutes<span class="sy1">:</span> &nbsp;<span class="nu0">30</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; expected<span class="sy1">:</span> <span class="nu0">75</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; desc<span class="sy1">:</span> &nbsp; &nbsp; <span class="st0">&quot;#3&quot;</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hour<span class="sy1">:</span> &nbsp; &nbsp; <span class="nu0">3</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; minutes<span class="sy1">:</span> &nbsp;<span class="nu0">15</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; expected<span class="sy1">:</span> <span class="nu0">7</span><span class="sy3">.</span><span class="nu0">5</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; desc<span class="sy1">:</span> &nbsp; &nbsp; <span class="st0">&quot;#4&quot;</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hour<span class="sy1">:</span> &nbsp; &nbsp; <span class="nu0">1</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; minutes<span class="sy1">:</span> &nbsp;<span class="nu0">57</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; expected<span class="sy1">:</span> <span class="nu0">76</span><span class="sy3">.</span><span class="nu0">5</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="kw1">for</span> _<span class="sy1">,</span> tC <span class="sy2">:=</span> <span class="kw1">range</span> testCases <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Run<span class="sy1">(</span>tC<span class="sy3">.</span>desc<span class="sy1">,</span> <span class="kw4">func</span><span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result <span class="sy2">:=</span> angleClock<span class="sy1">(</span>tC<span class="sy3">.</span>hour<span class="sy1">,</span> tC<span class="sy3">.</span>minutes<span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> result <span class="sy2">!=</span> tC<span class="sy3">.</span>expected <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Errorf<span class="sy1">(</span><span class="st0">&quot;Unexpected result for test %s, expected: %g, but got: %g&quot;</span><span class="sy1">,</span> tC<span class="sy3">.</span><span class="me1">desc</span><span class="sy1">,</span> tC<span class="sy3">.</span><span class="me1">expected</span><span class="sy1">,</span> result<span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">})</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div>
<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
	        </div>
	        <div class="message"><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="617064765"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="617064765" style="height: 206px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="de1"><pre class="de1">=== RUN &nbsp; TestAngleClock
=== RUN &nbsp; TestAngleClock/#<span class="nu0">1</span>
=== RUN &nbsp; TestAngleClock/#<span class="nu0">2</span>
=== RUN &nbsp; TestAngleClock/#<span class="nu0">3</span>
=== RUN &nbsp; TestAngleClock/#<span class="nu0">4</span>
--- PASS: TestAngleClock <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
&nbsp; &nbsp; --- PASS: TestAngleClock/#<span class="nu0">1</span> <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
&nbsp; &nbsp; --- PASS: TestAngleClock/#<span class="nu0">2</span> <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
&nbsp; &nbsp; --- PASS: TestAngleClock/#<span class="nu0">3</span> <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
&nbsp; &nbsp; --- PASS: TestAngleClock/#<span class="nu0">4</span> <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
PASS</pre></td></tr></table></div></td></tr></tbody></table></div></div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table></div>

]]></content:encoded>
			<dc:creator>alhaos</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1422596/10888.html</guid>
		</item>
		<item>
			<title>Модель заражения группы наркоманов</title>
			<link>https://www.cyberforum.ru/blogs/1422596/10875.html</link>
			<pubDate>Fri, 17 Apr 2026 12:33:35 GMT</pubDate>
			<description>Условия задачи сформулированы тут (https://www.instagram.com/reels/DW32UWAjG0g/) 
 
Суть: 
- Группа...</description>
			<content:encoded><![CDATA[<div>Условия задачи сформулированы <a rel="nofollow noopener noreferrer" href="https://www.instagram.com/reels/DW32UWAjG0g/" target="_blank" title="https://www.instagram.com/reels/DW32UWAjG0g/">тут</a><br />
<br />
Суть:<br />
- Группа наркоманов из 10 человек.<br />
- Только один инфицирован ВИЧ.<br />
- Колются одной иглой.<br />
- Колются раз в день.<br />
- Колются последовательно через минимальный промежуток времени.<br />
- После инфицированного наркомана игла становится грязной.<br />
- Укол грязной иглой вызывает заражение в 2% случаях.<br />
- За ночь игла становится чистой.<br />
<br />
Интересует сколько в среднем дней нужно чтобы заразилась вся группа.<br />
<br />
смоделировал <a rel="nofollow noopener noreferrer" href="https://github.com/alhaos/junkiesInfection" target="_blank" title="https://github.com/alhaos/junkiesInfection">Так</a><br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="149868594"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="149868594" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
</pre></td><td class="de1"><pre class="de1"><span class="co1">// Наркоман</span>
<span class="kw1">type</span> Junkie <span class="kw4">struct</span> <span class="sy1">{</span>
&nbsp; &nbsp; ID &nbsp; &nbsp; &nbsp; <span class="kw4">int</span>
&nbsp; &nbsp; Infected <span class="kw4">bool</span>
<span class="sy1">}</span>
&nbsp;
<span class="co1">// Эксперимент</span>
<span class="kw1">type</span> Trial <span class="kw4">struct</span> <span class="sy1">{</span>
&nbsp; &nbsp; Junkies <span class="sy1">[]</span>Junkie
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> NewDefaultTrial<span class="sy1">()</span> <span class="sy3">*</span>Trial <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; t <span class="sy2">:=</span> Trial<span class="sy1">{}</span>
&nbsp;
&nbsp; &nbsp; t<span class="sy3">.</span>Junkies <span class="sy2">=</span> append<span class="sy1">(</span>t<span class="sy3">.</span>Junkies<span class="sy1">,</span> Junkie<span class="sy1">{</span>Infected<span class="sy1">:</span> <span class="kw2">true</span><span class="sy1">,</span> ID<span class="sy1">:</span> <span class="nu0">0</span><span class="sy1">})</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span> <span class="sy2">:=</span> <span class="kw1">range</span> <span class="nu0">9</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Junkies <span class="sy2">=</span> append<span class="sy1">(</span>t<span class="sy3">.</span>Junkies<span class="sy1">,</span> Junkie<span class="sy1">{</span>Infected<span class="sy1">:</span> <span class="kw2">false</span><span class="sy1">,</span> ID<span class="sy1">:</span> <span class="nu2">i</span> <span class="sy3">+</span> <span class="nu0">1</span><span class="sy1">})</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">return</span> &amp;t
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> <span class="sy1">(</span>t <span class="sy3">*</span>Trial<span class="sy1">)</span> ShootUpJunkies<span class="sy1">()</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; rand<span class="sy3">.</span>Shuffle<span class="sy1">(</span><span class="kw3">len</span><span class="sy1">(</span>t<span class="sy3">.</span>Junkies<span class="sy1">),</span> <span class="kw4">func</span><span class="sy1">(</span><span class="nu2">i</span><span class="sy1">,</span> j <span class="kw4">int</span><span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Junkies<span class="sy1">[</span><span class="nu2">i</span><span class="sy1">],</span> t<span class="sy3">.</span>Junkies<span class="sy1">[</span>j<span class="sy1">]</span> <span class="sy2">=</span> t<span class="sy3">.</span>Junkies<span class="sy1">[</span>j<span class="sy1">],</span> t<span class="sy3">.</span>Junkies<span class="sy1">[</span><span class="nu2">i</span><span class="sy1">]</span>
&nbsp; &nbsp; <span class="sy1">})</span>
&nbsp;
&nbsp; &nbsp; isNeedleInfected <span class="sy2">:=</span> <span class="kw2">false</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span><span class="sy1">,</span> junkie <span class="sy2">:=</span> <span class="kw1">range</span> t<span class="sy3">.</span>Junkies <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> junkie<span class="sy3">.</span>Infected <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; isNeedleInfected <span class="sy2">=</span> <span class="kw2">true</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> isNeedleInfected <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Junkies<span class="sy1">[</span><span class="nu2">i</span><span class="sy1">]</span><span class="sy3">.</span>Infected <span class="sy2">=</span> t<span class="sy3">.</span>Junkies<span class="sy1">[</span><span class="nu2">i</span><span class="sy1">]</span><span class="sy3">.</span>Infected <span class="sy3">||</span> <span class="sy1">(</span>rand<span class="sy3">.</span>Intn<span class="sy1">(</span><span class="nu0">100</span><span class="sy1">)</span> &lt; <span class="nu0">2</span><span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span>
&nbsp;
<span class="kw4">func</span> <span class="sy1">(</span>t <span class="sy3">*</span>Trial<span class="sy1">)</span> IsAllInfected<span class="sy1">()</span> <span class="kw4">bool</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">var</span> result <span class="kw4">bool</span>
&nbsp;
&nbsp; &nbsp; result <span class="sy2">=</span> <span class="kw2">true</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">for</span> _<span class="sy1">,</span> j <span class="sy2">:=</span> <span class="kw1">range</span> t<span class="sy3">.</span>Junkies <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; result <span class="sy2">=</span> result &amp;&amp; j<span class="sy3">.</span>Infected
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">return</span> result
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div>Один миллион экспериментов показал что в среднем надо 167 дней<br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="628900960"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="628900960" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="de1"><pre class="de1"><span class="kw1">package</span> main
&nbsp;
<span class="kw1">import</span> <span class="sy1">(</span>
&nbsp; &nbsp; <span class="st0">&quot;fmt&quot;</span>
&nbsp;
&nbsp; &nbsp; <span class="st0">&quot;github.com/alhaos/junkiesInection/internal/model&quot;</span>
<span class="sy1">)</span>
&nbsp;
<span class="kw1">const</span> count <span class="sy2">=</span> 1_000_000
&nbsp;
<span class="kw4">func</span> main<span class="sy1">()</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">var</span> sum <span class="kw4">int</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">for</span> _ <span class="sy2">=</span> <span class="kw1">range</span> count <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; t <span class="sy2">:=</span> model<span class="sy3">.</span>NewDefaultTrial<span class="sy1">()</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="nu2">i</span> <span class="sy2">:=</span> <span class="nu0">0</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="sy1">;</span> <span class="sy3">!</span>t<span class="sy3">.</span>IsAllInfected<span class="sy1">();</span> <span class="nu2">i</span><span class="sy2">++</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>ShootUpJunkies<span class="sy1">()</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; &nbsp; &nbsp; sum <span class="sy2">+=</span> <span class="nu2">i</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; fmt<span class="sy3">.</span>Printf<span class="sy1">(</span><span class="st0">&quot;avg days: %d&quot;</span><span class="sy1">,</span> sum<span class="sy3">/</span>count<span class="sy1">)</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div>
<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
	        </div>
	        <div class="message">avg days: 167</div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table></div>

]]></content:encoded>
			<dc:creator>alhaos</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1422596/10875.html</guid>
		</item>
		<item>
			<title><![CDATA[[powershell] Выполнить расстановку приставки не перед каждым словом фразы во всех возможных вариантах]]></title>
			<link>https://www.cyberforum.ru/blogs/1422596/9822.html</link>
			<pubDate>Wed, 26 Feb 2025 11:16:46 GMT</pubDate>
			<description>Выполнить расстановку приставки не перед каждым словом фразы во всех возможных вариантах. 
 
param(...</description>
			<content:encoded><![CDATA[<div>Выполнить расстановку приставки не перед каждым словом фразы во всех возможных вариантах.<br />
<br />
<div class="codeblock"><table class="powershell"><thead><tr><td colspan="2" id="966002281"  class="head">PowerShell</td></tr></thead><tbody><tr class="li1"><td><div id="966002281" style="height: 206px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="de1"><pre class="de1"><span class="kw3">param</span><span class="br0">&#40;</span>
&nbsp; &nbsp; <span class="re0">$phrase</span> <span class="sy0">=</span> <span class="st0">&quot;В мире существует два типа людей&quot;</span>
<span class="br0">&#41;</span>
&nbsp;
<span class="re0">$words</span> <span class="sy0">=</span> <span class="sy0">-</span>split <span class="re0">$phrase</span> 
<span class="br0">&#40;</span><span class="nu0">0</span>..<span class="br0">&#40;</span><span class="br0">&#40;</span><span class="nu0">1</span> <span class="sy0">-</span>shl <span class="re0">$words</span>.Length<span class="br0">&#41;</span> <span class="sy0">-</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="kw3">ForEach</span><span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="re0">$case</span> <span class="sy0">=</span> <span class="kw6">$_</span>
&nbsp; &nbsp; <span class="br0">&#40;</span><span class="nu0">0</span>..<span class="br0">&#40;</span><span class="re0">$words</span>.Count<span class="sy0">-</span><span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="kw3">ForEach</span><span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="re0">$case</span> <span class="kw4">-band</span> <span class="nu0">1</span> <span class="sy0">-</span>shl <span class="kw6">$_</span> <span class="sy0">?</span> <span class="st0">&quot;не {0}&quot;</span> : <span class="st0">&quot;{0}&quot;</span><span class="br0">&#41;</span> <span class="kw4">-f</span> <span class="re0">$words</span><span class="br0">&#91;</span><span class="kw6">$_</span><span class="br0">&#93;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="sy0">-</span>join <span class="st0">&quot; &quot;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>
<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
	        </div>
	        <div class="message"><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="136151400"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="136151400" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
</pre></td><td class="de1"><pre class="de1">В мире существует два типа людей
не В мире существует два типа людей
В не мире существует два типа людей
не В не мире существует два типа людей
В мире не существует два типа людей
не В мире не существует два типа людей
В не мире не существует два типа людей
не В не мире не существует два типа людей
В мире существует не два типа людей
не В мире существует не два типа людей
В не мире существует не два типа людей
не В не мире существует не два типа людей
В мире не существует не два типа людей
не В мире не существует не два типа людей
В не мире не существует не два типа людей
не В не мире не существует не два типа людей
В мире существует два не типа людей
не В мире существует два не типа людей
В не мире существует два не типа людей
не В не мире существует два не типа людей
В мире не существует два не типа людей
не В мире не существует два не типа людей
В не мире не существует два не типа людей
не В не мире не существует два не типа людей
В мире существует не два не типа людей
не В мире существует не два не типа людей
В не мире существует не два не типа людей
не В не мире существует не два не типа людей
В мире не существует не два не типа людей
не В мире не существует не два не типа людей
В не мире не существует не два не типа людей
не В не мире не существует не два не типа людей
В мире существует два типа не людей
не В мире существует два типа не людей
В не мире существует два типа не людей
не В не мире существует два типа не людей
В мире не существует два типа не людей
не В мире не существует два типа не людей
В не мире не существует два типа не людей
не В не мире не существует два типа не людей
В мире существует не два типа не людей
не В мире существует не два типа не людей
В не мире существует не два типа не людей
не В не мире существует не два типа не людей
В мире не существует не два типа не людей
не В мире не существует не два типа не людей
В не мире не существует не два типа не людей
не В не мире не существует не два типа не людей
В мире существует два не типа не людей
не В мире существует два не типа не людей
В не мире существует два не типа не людей
не В не мире существует два не типа не людей
В мире не существует два не типа не людей
не В мире не существует два не типа не людей
В не мире не существует два не типа не людей
не В не мире не существует два не типа не людей
В мире существует не два не типа не людей
не В мире существует не два не типа не людей
В не мире существует не два не типа не людей
не В не мире существует не два не типа не людей
В мире не существует не два не типа не людей
не В мире не существует не два не типа не людей
В не мире не существует не два не типа не людей
не В не мире не существует не два не типа не людей</pre></td></tr></table></div></td></tr></tbody></table></div></div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table></div>

]]></content:encoded>
			<dc:creator>alhaos</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1422596/9822.html</guid>
		</item>
		<item>
			<title><![CDATA[[golang] 6. Zigzag Conversion]]></title>
			<link>https://www.cyberforum.ru/blogs/1422596/9786.html</link>
			<pubDate>Mon, 24 Feb 2025 16:54:19 GMT</pubDate>
			<description>Нужно преобразовать входную строку в строку полученную из зигзага образного узора заданного...</description>
			<content:encoded><![CDATA[<div>Нужно преобразовать входную строку в строку полученную из зигзага образного узора заданного количеством строк.<br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="211393325"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="211393325" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
</pre></td><td class="de1"><pre class="de1"><span class="co1">// [url]https://leetcode.com/studyplan/top-interview-150/[/url]</span>
&nbsp;
<span class="kw1">package</span> topInterview
&nbsp;
<span class="co1">// convert</span>
<span class="co1">//</span>
<span class="co1">// 6. Zigzag Conversion</span>
<span class="co1">//</span>
<span class="co1">// The string &quot;PAYPALISHIRING&quot; is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)</span>
<span class="co1">//</span>
<span class="co1">// P &nbsp; A &nbsp; H &nbsp; N</span>
<span class="co1">// A P L S I I G</span>
<span class="co1">// Y &nbsp; I &nbsp; R</span>
<span class="co1">// And then read line by line: &quot;PAHNAPLSIIGYIR&quot;</span>
<span class="co1">//</span>
<span class="co1">// Write the code that will take a string and make this conversion given a number of rows:</span>
<span class="co1">//</span>
<span class="co1">// string convert(string s, int numRows);</span>
<span class="co1">//</span>
<span class="co1">// Example 1:</span>
<span class="co1">//</span>
<span class="co1">// Input: s = &quot;PAYPALISHIRING&quot;, numRows = 3</span>
<span class="co1">// Output: &quot;PAHNAPLSIIGYIR&quot;</span>
<span class="co1">// Example 2:</span>
<span class="co1">//</span>
<span class="co1">// Input: s = &quot;PAYPALISHIRING&quot;, numRows = 4</span>
<span class="co1">// Output: &quot;PINALSIGYAHRPI&quot;</span>
<span class="co1">// Explanation:</span>
<span class="co1">// P &nbsp; &nbsp; I &nbsp; &nbsp;N</span>
<span class="co1">// A &nbsp; L S &nbsp;I G</span>
<span class="co1">// Y A &nbsp; H R</span>
<span class="co1">// P &nbsp; &nbsp; I</span>
<span class="co1">// Example 3:</span>
<span class="co1">//</span>
<span class="co1">// Input: s = &quot;A&quot;, numRows = 1</span>
<span class="co1">// Output: &quot;A&quot;</span>
<span class="co1">//</span>
<span class="co1">// Constraints:</span>
<span class="co1">//</span>
<span class="co1">// 1 &lt;= s.length &lt;= 1000</span>
<span class="co1">// s consists of English letters (lower-case and upper-case), ',' and '.'.</span>
<span class="co1">// 1 &lt;= numRows &lt;= 1000//</span>
<span class="kw4">func</span> convert<span class="sy1">(</span>s <span class="kw4">string</span><span class="sy1">,</span> numRows <span class="kw4">int</span><span class="sy1">)</span> <span class="kw4">string</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Если строка одна возвращаем ее сразу</span>
&nbsp; &nbsp; <span class="kw1">if</span> numRows <span class="sy3">==</span> <span class="nu0">1</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> s
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Создаем слайс строк длиной numRows</span>
&nbsp; &nbsp; rows <span class="sy2">:=</span> <span class="kw3">make</span><span class="sy1">([]</span><span class="kw4">string</span><span class="sy1">,</span> numRows<span class="sy1">)</span>
&nbsp; &nbsp; <span class="co1">// Указательна текущую строку</span>
&nbsp; &nbsp; currentRowIndex <span class="sy2">:=</span> <span class="nu0">0</span>
&nbsp; &nbsp; <span class="co1">// Флаг движения вниз</span>
&nbsp; &nbsp; directionDown <span class="sy2">:=</span> <span class="kw2">true</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Цикл по строке</span>
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span> <span class="sy2">:=</span> <span class="kw1">range</span> <span class="kw3">len</span><span class="sy1">(</span>s<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Если указатель строк на первой строке</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> currentRowIndex <span class="sy3">==</span> <span class="nu0">0</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Подымаем флаг движения вниз</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; directionDown <span class="sy2">=</span> <span class="kw2">true</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Если указатель строк на крайней строке</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> currentRowIndex <span class="sy3">==</span> <span class="kw3">len</span><span class="sy1">(</span>rows<span class="sy1">)</span><span class="sy3">-</span><span class="nu0">1</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Опускаем флаг движения вниз</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; directionDown <span class="sy2">=</span> <span class="kw2">false</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Добавляем символ в строку на которой указатель текущей строки</span>
&nbsp; &nbsp; &nbsp; &nbsp; rows<span class="sy1">[</span>currentRowIndex<span class="sy1">]</span> <span class="sy2">+=</span> <span class="kw4">string</span><span class="sy1">(</span>s<span class="sy1">[</span><span class="nu2">i</span><span class="sy1">])</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Если поднят флаг движения вниз</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> directionDown <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Увеличиваем указатель текущей строки</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currentRowIndex<span class="sy2">++</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span> <span class="kw1">else</span> <span class="sy1">{</span> <span class="co1">// Если не поднят флаг движения вниз</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Уменьшаем указатель текущей строки</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currentRowIndex<span class="sy2">--</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; 
&nbsp; &nbsp; <span class="co1">// Возвращаем строку из объединенного слайса строк &nbsp;</span>
&nbsp; &nbsp; <span class="kw1">return</span> strings<span class="sy3">.</span>Join<span class="sy1">(</span>rows<span class="sy1">,</span> <span class="st0">&quot;&quot;</span><span class="sy1">)</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="460288692"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="460288692" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="de1"><pre class="de1"><span class="kw4">func</span> TestConvert<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; data <span class="sy2">:=</span> <span class="sy1">[]</span><span class="kw4">struct</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; s &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">string</span>
&nbsp; &nbsp; &nbsp; &nbsp; rowNums &nbsp;<span class="kw4">int</span>
&nbsp; &nbsp; &nbsp; &nbsp; expected <span class="kw4">string</span>
&nbsp; &nbsp; <span class="sy1">}{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot;PAYPALISHIRING&quot;</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">,</span> <span class="st0">&quot;PAHNAPLSIIGYIR&quot;</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot;PAYPALISHIRING&quot;</span><span class="sy1">,</span> <span class="nu0">4</span><span class="sy1">,</span> <span class="st0">&quot;PINALSIGYAHRPI&quot;</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot;A&quot;</span><span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">,</span> <span class="st0">&quot;A&quot;</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot;AB&quot;</span><span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">,</span> <span class="st0">&quot;AB&quot;</span><span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span><span class="sy1">,</span> datum <span class="sy2">:=</span> <span class="kw1">range</span> data <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; result <span class="sy2">:=</span> convert<span class="sy1">(</span>datum<span class="sy3">.</span>s<span class="sy1">,</span> datum<span class="sy3">.</span>rowNums<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> result <span class="sy2">!=</span> datum<span class="sy3">.</span>expected <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Errorf<span class="sy1">(</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;unexpected result for test data index %d (%s), expected [%s], but got [%s]&quot;</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i<span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; datum<span class="sy3">.</span><span class="me1">s</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; datum<span class="sy3">.</span><span class="me1">expected</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result<span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div>
<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
	        </div>
	        <div class="message"><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="386454375"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="386454375" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1">=== RUN &nbsp; TestConvert
--- PASS: TestConvert <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
PASS</pre></td></tr></table></div></td></tr></tbody></table></div></div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table></div>

]]></content:encoded>
			<dc:creator>alhaos</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1422596/9786.html</guid>
		</item>
		<item>
			<title><![CDATA[[golang] 151. Reverse Words in a String]]></title>
			<link>https://www.cyberforum.ru/blogs/1422596/9745.html</link>
			<pubDate>Sun, 23 Feb 2025 11:37:25 GMT</pubDate>
			<description>Дана строка необходимо поменять порядок входящих слов, необходимо исключить лидирующие и финишные...</description>
			<content:encoded><![CDATA[<div>Дана строка необходимо поменять порядок входящих слов, необходимо исключить лидирующие и финишные пробелы, а так же повторяющиеся считать за один.<br />
<br />
Воспользовался функцией strings.Fields() которая делает именно то, что нужно по условию.<br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="500692146"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="500692146" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
</pre></td><td class="de1"><pre class="de1"><span class="co1">// [url]https://leetcode.com/studyplan/top-interview-150/[/url]</span>
&nbsp;
<span class="kw1">package</span> topInterview
&nbsp;
<span class="kw1">import</span> <span class="sy1">(</span>
&nbsp; &nbsp; <span class="st0">&quot;strings&quot;</span>
<span class="sy1">)</span>
&nbsp;
<span class="co1">// reverseWords</span>
<span class="co1">//</span>
<span class="co1">// 151. Reverse Words in a String</span>
<span class="co1">//</span>
<span class="co1">// Given an input string s, reverse the order of the words.</span>
<span class="co1">//</span>
<span class="co1">// A word is defined as a sequence of non-space characters. The words in s will be separated by at least one space.</span>
<span class="co1">//</span>
<span class="co1">// Return a string of the words in reverse order concatenated by a single space.</span>
<span class="co1">//</span>
<span class="co1">// Note that s may contain leading or trailing spaces or multiple spaces between two words. The returned string should only have a single space separating the words. Do not include any extra // spaces.</span>
<span class="co1">//</span>
<span class="co1">// Example 1:</span>
<span class="co1">//</span>
<span class="co1">// Input: s = &quot;the sky is blue&quot;</span>
<span class="co1">// Output: &quot;blue is sky the&quot;</span>
<span class="co1">// Example 2:</span>
<span class="co1">//</span>
<span class="co1">// Input: s = &quot; &nbsp;hello world &nbsp;&quot;</span>
<span class="co1">// Output: &quot;world hello&quot;</span>
<span class="co1">// Explanation: Your reversed string should not contain leading or trailing spaces.</span>
<span class="co1">// Example 3:</span>
<span class="co1">//</span>
<span class="co1">// Input: s = &quot;a good &nbsp; example&quot;</span>
<span class="co1">// Output: &quot;example good a&quot;</span>
<span class="co1">// Explanation: You need to reduce multiple spaces between two words to a single space in the reversed string.</span>
<span class="co1">//</span>
<span class="co1">// Constraints:</span>
<span class="co1">//</span>
<span class="co1">// 1 &lt;= s.length &lt;= 104</span>
<span class="co1">// s contains English letters (upper-case and lower-case), digits, and spaces ' '.</span>
<span class="co1">// There is at least one word in s.</span>
<span class="kw4">func</span> reverseWords<span class="sy1">(</span>s <span class="kw4">string</span><span class="sy1">)</span> <span class="kw4">string</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Разбиваем строку на подстроки по условию</span>
&nbsp; &nbsp; words <span class="sy2">:=</span> strings<span class="sy3">.</span><span class="me1">Fields</span><span class="sy1">(</span>s<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Меняем порядок элементов в слайсе классическим методом</span>
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span><span class="sy1">,</span> j <span class="sy2">:=</span> <span class="nu0">0</span><span class="sy1">,</span> <span class="kw3">len</span><span class="sy1">(</span>words<span class="sy1">)</span><span class="sy3">-</span><span class="nu0">1</span><span class="sy1">;</span> <span class="nu2">i</span> &lt; j<span class="sy1">;</span> <span class="nu2">i</span><span class="sy1">,</span> j <span class="sy2">=</span> <span class="nu2">i</span><span class="sy3">+</span><span class="nu0">1</span><span class="sy1">,</span> j<span class="sy3">-</span><span class="nu0">1</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; words<span class="sy1">[</span><span class="nu2">i</span><span class="sy1">],</span> words<span class="sy1">[</span>j<span class="sy1">]</span> <span class="sy2">=</span> words<span class="sy1">[</span>j<span class="sy1">],</span> words<span class="sy1">[</span><span class="nu2">i</span><span class="sy1">]</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; 
&nbsp; &nbsp; <span class="co1">// Возвращаем строку, полученную после объединения элементов слайса через пробел</span>
&nbsp; &nbsp; <span class="kw1">return</span> strings<span class="sy3">.</span>Join<span class="sy1">(</span>words<span class="sy1">,</span> <span class="st0">&quot; &quot;</span><span class="sy1">)</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="142988476"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="142988476" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="de1"><pre class="de1"><span class="kw4">func</span> TestReverseWords<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; data <span class="sy2">:=</span> <span class="sy1">[]</span><span class="kw4">struct</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; s &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">string</span>
&nbsp; &nbsp; &nbsp; &nbsp; expected <span class="kw4">string</span>
&nbsp; &nbsp; <span class="sy1">}{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot;the sky is blue&quot;</span><span class="sy1">,</span> <span class="st0">&quot;blue is sky the&quot;</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot; &nbsp;hello world &nbsp;&quot;</span><span class="sy1">,</span> <span class="st0">&quot;world hello&quot;</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot;a good &nbsp; example&quot;</span><span class="sy1">,</span> <span class="st0">&quot;example good a&quot;</span><span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span><span class="sy1">,</span> datum <span class="sy2">:=</span> <span class="kw1">range</span> data <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; result <span class="sy2">:=</span> reverseWords<span class="sy1">(</span>datum<span class="sy3">.</span>s<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> result <span class="sy2">!=</span> datum<span class="sy3">.</span>expected <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Errorf<span class="sy1">(</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;unexpected result for test data index %d (%s), expected [%s], but got [%s]&quot;</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i<span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; datum<span class="sy3">.</span><span class="me1">s</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; datum<span class="sy3">.</span><span class="me1">expected</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result<span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div>
<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
	        </div>
	        <div class="message"><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="532157715"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="532157715" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1">=== RUN &nbsp; TestReverseWords
--- PASS: TestReverseWords <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
PASS</pre></td></tr></table></div></td></tr></tbody></table></div></div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table></div>

]]></content:encoded>
			<dc:creator>alhaos</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1422596/9745.html</guid>
		</item>
		<item>
			<title><![CDATA[[golang] 14. Longest Common Prefix]]></title>
			<link>https://www.cyberforum.ru/blogs/1422596/9744.html</link>
			<pubDate>Sun, 23 Feb 2025 11:08:07 GMT</pubDate>
			<description>Дан слайс строк, нужно вернуть строку содержащую общий префикс для всех строк, пустую сроку в...</description>
			<content:encoded><![CDATA[<div>Дан слайс строк, нужно вернуть строку содержащую общий префикс для всех строк, пустую сроку в случае отсутствия такового.<br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="311662462"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="311662462" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
</pre></td><td class="de1"><pre class="de1"><span class="co1">// [url]https://leetcode.com/studyplan/top-interview-150/[/url]</span>
&nbsp;
<span class="kw1">package</span> topInterview
&nbsp;
<span class="co1">// longestCommonPrefix</span>
<span class="co1">//</span>
<span class="co1">// 14. Longest Common Prefix</span>
<span class="co1">//</span>
<span class="co1">// Write a function to find the longest common prefix string amongst an array of strings.</span>
<span class="co1">//</span>
<span class="co1">// If there is no common prefix, return an empty string &quot;&quot;.</span>
<span class="co1">//</span>
<span class="co1">// Example 1:</span>
<span class="co1">//</span>
<span class="co1">// Input: strs = [&quot;flower&quot;,&quot;flow&quot;,&quot;flight&quot;]</span>
<span class="co1">// Output: &quot;fl&quot;</span>
<span class="co1">// Example 2:</span>
<span class="co1">//</span>
<span class="co1">// Input: strs = [&quot;dog&quot;,&quot;racecar&quot;,&quot;car&quot;]</span>
<span class="co1">// Output: &quot;&quot;</span>
<span class="co1">// Explanation: There is no common prefix among the input strings.</span>
<span class="co1">//</span>
<span class="co1">// Constraints:</span>
<span class="co1">//</span>
<span class="co1">// 1 &lt;= strs.length &lt;= 200</span>
<span class="co1">// 0 &lt;= strs[i].length &lt;= 200</span>
<span class="co1">// strs[i] consists of only lowercase English letters if it is non-empty.//</span>
<span class="kw4">func</span> longestCommonPrefix<span class="sy1">(</span>strs <span class="sy1">[]</span><span class="kw4">string</span><span class="sy1">)</span> <span class="kw4">string</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Далее minLength инициируется длиной первой строки в strs</span>
&nbsp; &nbsp; <span class="co1">// необходимо проверить что этот элемент есть</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="kw3">len</span><span class="sy1">(</span>strs<span class="sy1">)</span> <span class="sy3">==</span> <span class="nu0">0</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="st0">&quot;&quot;</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Инициируем переменную minLength длиной первого элемента strs</span>
&nbsp; &nbsp; minLength <span class="sy2">:=</span> <span class="kw3">len</span><span class="sy1">(</span>strs<span class="sy1">[</span><span class="nu0">0</span><span class="sy1">])</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Обходим strs вычисляем минимум длины среди элементов strs</span>
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span> <span class="sy2">:=</span> <span class="nu0">1</span><span class="sy1">;</span> <span class="nu2">i</span> &lt; <span class="kw3">len</span><span class="sy1">(</span>strs<span class="sy1">);</span> <span class="nu2">i</span><span class="sy2">++</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; minLength <span class="sy2">=</span> min<span class="sy1">(</span>minLength<span class="sy1">,</span> <span class="kw3">len</span><span class="sy1">(</span>strs<span class="sy1">[</span><span class="nu2">i</span><span class="sy1">]))</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Если минимальная длина 0 возвращаем пустую сроку</span>
&nbsp; &nbsp; <span class="kw1">if</span> minLength <span class="sy3">==</span> <span class="nu0">0</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="st0">&quot;&quot;</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Тут крайний индекс префикса</span>
&nbsp; &nbsp; prefixCharsCounter <span class="sy2">:=</span> <span class="nu0">0</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// rootLoop: это метка так как цикл может быть прерван из внутреннего цикла</span>
rootLoop<span class="sy1">:</span>
&nbsp; &nbsp; <span class="co1">// Цикл по диапазону [0..minLength-1]</span>
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span> <span class="sy2">:=</span> <span class="kw1">range</span> minLength <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Текущий байт первого элемента будет эталоном</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// с которым будем сравнивать остальные байты элементов strs</span>
&nbsp; &nbsp; &nbsp; &nbsp; reference <span class="sy2">:=</span> strs<span class="sy1">[</span><span class="nu0">0</span><span class="sy1">][</span><span class="nu2">i</span><span class="sy1">]</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Обходим strs</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> j <span class="sy2">:=</span> <span class="nu0">1</span><span class="sy1">;</span> j &lt; <span class="kw3">len</span><span class="sy1">(</span>strs<span class="sy1">);</span> j<span class="sy2">++</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Если текущий байт в текущем элементе strs не совпадает с эталоном</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> reference <span class="sy2">!=</span> strs<span class="sy1">[</span>j<span class="sy1">][</span><span class="nu2">i</span><span class="sy1">]</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Перерываем внешний цикл rootLoop</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span> rootLoop
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Актуализируем крайний индекс префикса</span>
&nbsp; &nbsp; &nbsp; &nbsp; prefixCharsCounter<span class="sy2">++</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Возвращаем префикс первого элемента strs</span>
&nbsp; &nbsp; <span class="kw1">return</span> strs<span class="sy1">[</span><span class="nu0">0</span><span class="sy1">][</span><span class="nu0">0</span><span class="sy1">:</span>prefixCharsCounter<span class="sy1">]</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="720184725"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="720184725" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="de1"><pre class="de1"><span class="kw4">func</span> TestLongestCommonPrefix<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; data <span class="sy2">:=</span> <span class="sy1">[]</span><span class="kw4">struct</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; strs &nbsp; &nbsp; <span class="sy1">[]</span><span class="kw4">string</span>
&nbsp; &nbsp; &nbsp; &nbsp; expected <span class="kw4">string</span>
&nbsp; &nbsp; <span class="sy1">}{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{[]</span><span class="kw4">string</span><span class="sy1">{</span><span class="st0">&quot;flower&quot;</span><span class="sy1">,</span> <span class="st0">&quot;flow&quot;</span><span class="sy1">,</span> <span class="st0">&quot;flight&quot;</span><span class="sy1">},</span> <span class="st0">&quot;fl&quot;</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{[]</span><span class="kw4">string</span><span class="sy1">{</span><span class="st0">&quot;dog&quot;</span><span class="sy1">,</span> <span class="st0">&quot;racecar&quot;</span><span class="sy1">,</span> <span class="st0">&quot;car&quot;</span><span class="sy1">},</span> <span class="st0">&quot;&quot;</span><span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span><span class="sy1">,</span> datum <span class="sy2">:=</span> <span class="kw1">range</span> data <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; result <span class="sy2">:=</span> longestCommonPrefix<span class="sy1">(</span>datum<span class="sy3">.</span>strs<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> result <span class="sy2">!=</span> datum<span class="sy3">.</span>expected <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Errorf<span class="sy1">(</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;unexpected result for test data index %d (%+v), expected [%s], but got [%s]&quot;</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i<span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; datum<span class="sy3">.</span><span class="me1">strs</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; datum<span class="sy3">.</span><span class="me1">expected</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result<span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div>
<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
	        </div>
	        <div class="message"><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="174908461"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="174908461" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1">=== RUN &nbsp; TestLongestCommonPrefix
--- PASS: TestLongestCommonPrefix <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
PASS</pre></td></tr></table></div></td></tr></tbody></table></div></div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table></div>

]]></content:encoded>
			<dc:creator>alhaos</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1422596/9744.html</guid>
		</item>
		<item>
			<title><![CDATA[[golang] 58. Length of Last Word]]></title>
			<link>https://www.cyberforum.ru/blogs/1422596/9743.html</link>
			<pubDate>Sun, 23 Feb 2025 10:14:44 GMT</pubDate>
			<description>Нужно найти длину крайнего слова в строке. 
 
 
//...</description>
			<content:encoded><![CDATA[<div>Нужно найти длину крайнего слова в строке.<br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="600414134"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="600414134" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
</pre></td><td class="de1"><pre class="de1"><span class="co1">// [url]https://leetcode.com/studyplan/top-interview-150/[/url]</span>
&nbsp;
<span class="kw1">package</span> topInterview
&nbsp;
<span class="co1">// lengthOfLastWord</span>
<span class="co1">//</span>
<span class="co1">// 58. Length of Last Word</span>
<span class="co1">// Given a string s consisting of words and spaces, return the length of the last word in the string.</span>
<span class="co1">//</span>
<span class="co1">// A word is a maximal</span>
<span class="co1">// substring</span>
<span class="co1">//</span>
<span class="co1">//&nbsp; consisting of non-space characters only.</span>
<span class="co1">//</span>
<span class="co1">// Example 1:</span>
<span class="co1">//</span>
<span class="co1">// Input: s = &quot;Hello World&quot;</span>
<span class="co1">// Output: 5</span>
<span class="co1">// Explanation: The last word is &quot;World&quot; with length 5.</span>
<span class="co1">// Example 2:</span>
<span class="co1">//</span>
<span class="co1">// Input: s = &quot; &nbsp; fly me &nbsp; to &nbsp; the moon &nbsp;&quot;</span>
<span class="co1">// Output: 4</span>
<span class="co1">// Explanation: The last word is &quot;moon&quot; with length 4.</span>
<span class="co1">// Example 3:</span>
<span class="co1">//</span>
<span class="co1">// Input: s = &quot;luffy is still joyboy&quot;</span>
<span class="co1">// Output: 6</span>
<span class="co1">// Explanation: The last word is &quot;joyboy&quot; with length 6.</span>
<span class="co1">//</span>
<span class="co1">// Constraints:</span>
<span class="co1">//</span>
<span class="co1">// 1 &lt;= s.length &lt;= 104</span>
<span class="co1">// s consists of only English letters and spaces ' '.</span>
<span class="co1">// There will be at least one word in s.//</span>
<span class="kw4">func</span> lengthOfLastWord<span class="sy1">(</span>s <span class="kw4">string</span><span class="sy1">)</span> <span class="kw4">int</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Далее указатель цикла будет инициирован длиной строки минус один</span>
&nbsp; &nbsp; <span class="co1">// что приведет к панике, поэтому добавляю проверку.</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="kw3">len</span><span class="sy1">(</span>s<span class="sy1">)</span> <span class="sy3">==</span> <span class="nu0">0</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Счетчик символов</span>
&nbsp; &nbsp; charCount <span class="sy2">:=</span> <span class="nu0">0</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Обходим строку в справа налево</span>
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span> <span class="sy2">:=</span> <span class="kw3">len</span><span class="sy1">(</span>s<span class="sy1">)</span> <span class="sy3">-</span> <span class="nu0">1</span><span class="sy1">;</span> <span class="nu2">i</span> &gt;<span class="sy2">=</span> <span class="nu0">0</span><span class="sy1">;</span> <span class="nu2">i</span><span class="sy2">--</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Если текущий элемент пробел</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> s<span class="sy1">[</span><span class="nu2">i</span><span class="sy1">]</span> <span class="sy3">==</span> <span class="nu0">0x20</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Если мы уже что-то посчитали</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> charCount &gt; <span class="nu0">0</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Возвращаем счетчик символов</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> charCount
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span> <span class="kw1">else</span> <span class="sy1">{</span> <span class="co1">// Если не пробел</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Счетчик символов увеличиваем на один</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; charCount<span class="sy2">++</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Эта часть кода сработает если строка состоит только из пробелов</span>
&nbsp; &nbsp; <span class="kw1">return</span> charCount
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="690043848"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="690043848" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="de1"><pre class="de1"><span class="kw4">func</span> TestLengthOfLastWord<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; data <span class="sy2">:=</span> <span class="sy1">[]</span><span class="kw4">struct</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; s &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">string</span>
&nbsp; &nbsp; &nbsp; &nbsp; expected <span class="kw4">int</span>
&nbsp; &nbsp; <span class="sy1">}{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot;Hello World&quot;</span><span class="sy1">,</span> <span class="nu0">5</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot; &nbsp; fly me &nbsp; to &nbsp; the moon &nbsp;&quot;</span><span class="sy1">,</span> <span class="nu0">4</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot;luffy is still joyboy&quot;</span><span class="sy1">,</span> <span class="nu0">6</span><span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span><span class="sy1">,</span> datum <span class="sy2">:=</span> <span class="kw1">range</span> data <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; result <span class="sy2">:=</span> lengthOfLastWord<span class="sy1">(</span>datum<span class="sy3">.</span>s<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> result <span class="sy2">!=</span> datum<span class="sy3">.</span>expected <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Errorf<span class="sy1">(</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;unexpected result for test data index %d (%s), expected [%d], but got [%d]&quot;</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i<span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; datum<span class="sy3">.</span><span class="me1">s</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; datum<span class="sy3">.</span><span class="me1">expected</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result<span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div>
<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
	        </div>
	        <div class="message"><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="271829059"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="271829059" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1">=== RUN &nbsp; TestLengthOfLastWord
--- PASS: TestLengthOfLastWord <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
PASS</pre></td></tr></table></div></td></tr></tbody></table></div></div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table></div>

]]></content:encoded>
			<dc:creator>alhaos</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1422596/9743.html</guid>
		</item>
		<item>
			<title><![CDATA[[golang] 12. Integer to Roman]]></title>
			<link>https://www.cyberforum.ru/blogs/1422596/9742.html</link>
			<pubDate>Sun, 23 Feb 2025 09:37:48 GMT</pubDate>
			<description>Целое число необходимо перевести в строку соответствующего числа в Римской системе счисления  
 
//...</description>
			<content:encoded><![CDATA[<div>Целое число необходимо перевести в строку соответствующего числа в Римской системе счисления <br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="42234585"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="42234585" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
</pre></td><td class="de1"><pre class="de1"><span class="co1">// [url]https://leetcode.com/studyplan/top-interview-150/[/url]</span>
&nbsp;
<span class="kw1">package</span> topInterview
&nbsp;
<span class="kw1">import</span> <span class="sy1">(</span>
&nbsp; &nbsp; <span class="st0">&quot;bytes&quot;</span>
&nbsp;
<span class="co1">// intToRoman</span>
<span class="co1">//</span>
<span class="co1">// 12. Integer to Roman</span>
<span class="co1">//</span>
<span class="co1">// Seven different symbols represent Roman numerals with the following values:</span>
<span class="co1">//</span>
<span class="co1">// Symbol &nbsp; &nbsp; &nbsp;Value</span>
<span class="co1">// I &nbsp; &nbsp; 1</span>
<span class="co1">// V &nbsp; &nbsp; 5</span>
<span class="co1">// X &nbsp; &nbsp; 10</span>
<span class="co1">// L &nbsp; &nbsp; 50</span>
<span class="co1">// C &nbsp; &nbsp; 100</span>
<span class="co1">// D &nbsp; &nbsp; 500</span>
<span class="co1">// M &nbsp; &nbsp; 1000</span>
<span class="co1">// Roman numerals are formed by appending the conversions of decimal place values from highest to lowest. Converting a decimal place value into a Roman numeral has the following rules:</span>
<span class="co1">//</span>
<span class="co1">// If the value does not start with 4 or 9, select the symbol of the maximal value that can be subtracted from the input, append that symbol to the result, subtract its value, and convert the // remainder to a Roman numeral.</span>
<span class="co1">// If the value starts with 4 or 9 use the subtractive form representing one symbol subtracted from the following symbol, for example, 4 is 1 (I) less than 5 (V): IV and 9 is 1 (I) less than 10 // (X): IX. Only the following subtractive forms are used: 4 (IV), 9 (IX), 40 (XL), 90 (XC), 400 (CD) and 900 (CM).</span>
<span class="co1">// Only powers of 10 (I, X, C, M) can be appended consecutively at most 3 times to represent multiples of 10. You cannot append 5 (V), 50 (L), or 500 (D) multiple times. If you need to append a // symbol 4 times use the subtractive form.</span>
<span class="co1">// Given an integer, convert it to a Roman numeral.</span>
<span class="co1">//</span>
<span class="co1">// Example 1:</span>
<span class="co1">//</span>
<span class="co1">// Input: num = 3749</span>
<span class="co1">//</span>
<span class="co1">// Output: &quot;MMMDCCXLIX&quot;</span>
<span class="co1">//</span>
<span class="co1">// Explanation:</span>
<span class="co1">//</span>
<span class="co1">// 3000 = MMM as 1000 (M) + 1000 (M) + 1000 (M)</span>
<span class="co1">//</span>
<span class="co1">//&nbsp; 700 = DCC as 500 (D) + 100 (C) + 100 (C)</span>
<span class="co1">//&nbsp; &nbsp;40 = XL as 10 (X) less of 50 (L)</span>
<span class="co1">//&nbsp; &nbsp; 9 = IX as 1 (I) less of 10 (X)</span>
<span class="co1">//</span>
<span class="co1">// Note: 49 is not 1 (I) less of 50 (L) because the conversion is based on decimal places</span>
<span class="co1">// Example 2:</span>
<span class="co1">//</span>
<span class="co1">// Input: num = 58</span>
<span class="co1">//</span>
<span class="co1">// Output: &quot;LVIII&quot;</span>
<span class="co1">//</span>
<span class="co1">// Explanation:</span>
<span class="co1">//</span>
<span class="co1">// 50 = L</span>
<span class="co1">//</span>
<span class="co1">//&nbsp; 8 = VIII</span>
<span class="co1">//</span>
<span class="co1">// Example 3:</span>
<span class="co1">//</span>
<span class="co1">// Input: num = 1994</span>
<span class="co1">//</span>
<span class="co1">// Output: &quot;MCMXCIV&quot;</span>
<span class="co1">//</span>
<span class="co1">// Explanation:</span>
<span class="co1">//</span>
<span class="co1">// 1000 = M</span>
<span class="co1">//</span>
<span class="co1">//&nbsp; 900 = CM</span>
<span class="co1">//&nbsp; &nbsp;90 = XC</span>
<span class="co1">//&nbsp; &nbsp; 4 = IV</span>
<span class="co1">//</span>
<span class="co1">// Constraints:</span>
<span class="co1">//</span>
<span class="co1">// 1 &lt;= num &lt;= 3999//</span>
<span class="kw4">func</span> intToRoman<span class="sy1">(</span>num <span class="kw4">int</span><span class="sy1">)</span> <span class="kw4">string</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Инициировать буфер для сбора римских цифр</span>
&nbsp; &nbsp; b <span class="sy2">:=</span> <span class="kw5">bytes.<span class="me1">Buffer</span></span><span class="sy1">{}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Повторять цикл пока num &gt; 0</span>
&nbsp; &nbsp; <span class="kw1">for</span> num &gt; <span class="nu0">0</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// В конструкции switch будем определять какое максимально возможное число мы можем вычесть</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// В каждом случае, добавляем соответствующую римскую цифру и уменьшаем num на соответствующее число</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// пока от num ничего не останется</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">switch</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> num &gt;<span class="sy2">=</span> <span class="nu0">1000</span><span class="sy1">:</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b<span class="sy3">.</span>WriteString<span class="sy1">(</span><span class="st0">&quot;M&quot;</span><span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; num <span class="sy2">-=</span> <span class="nu0">1000</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> num &gt;<span class="sy2">=</span> <span class="nu0">900</span><span class="sy1">:</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b<span class="sy3">.</span>WriteString<span class="sy1">(</span><span class="st0">&quot;CM&quot;</span><span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; num <span class="sy2">-=</span> <span class="nu0">900</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> num &gt;<span class="sy2">=</span> <span class="nu0">500</span><span class="sy1">:</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b<span class="sy3">.</span>WriteString<span class="sy1">(</span><span class="st0">&quot;D&quot;</span><span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; num <span class="sy2">-=</span> <span class="nu0">500</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> num &gt;<span class="sy2">=</span> <span class="nu0">400</span><span class="sy1">:</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b<span class="sy3">.</span>WriteString<span class="sy1">(</span><span class="st0">&quot;CD&quot;</span><span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; num <span class="sy2">-=</span> <span class="nu0">400</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> num &gt;<span class="sy2">=</span> <span class="nu0">100</span><span class="sy1">:</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b<span class="sy3">.</span>WriteString<span class="sy1">(</span><span class="st0">&quot;C&quot;</span><span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; num <span class="sy2">-=</span> <span class="nu0">100</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> num &gt;<span class="sy2">=</span> <span class="nu0">90</span><span class="sy1">:</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b<span class="sy3">.</span>WriteString<span class="sy1">(</span><span class="st0">&quot;XC&quot;</span><span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; num <span class="sy2">-=</span> <span class="nu0">90</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> num &gt;<span class="sy2">=</span> <span class="nu0">50</span><span class="sy1">:</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b<span class="sy3">.</span>WriteString<span class="sy1">(</span><span class="st0">&quot;L&quot;</span><span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; num <span class="sy2">-=</span> <span class="nu0">50</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> num &gt;<span class="sy2">=</span> <span class="nu0">40</span><span class="sy1">:</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b<span class="sy3">.</span>WriteString<span class="sy1">(</span><span class="st0">&quot;XL&quot;</span><span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; num <span class="sy2">-=</span> <span class="nu0">40</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> num &gt;<span class="sy2">=</span> <span class="nu0">10</span><span class="sy1">:</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b<span class="sy3">.</span>WriteString<span class="sy1">(</span><span class="st0">&quot;X&quot;</span><span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; num <span class="sy2">-=</span> <span class="nu0">10</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> num &gt;<span class="sy2">=</span> <span class="nu0">9</span><span class="sy1">:</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b<span class="sy3">.</span>WriteString<span class="sy1">(</span><span class="st0">&quot;IX&quot;</span><span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; num <span class="sy2">-=</span> <span class="nu0">9</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> num &gt;<span class="sy2">=</span> <span class="nu0">5</span><span class="sy1">:</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b<span class="sy3">.</span>WriteString<span class="sy1">(</span><span class="st0">&quot;V&quot;</span><span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; num <span class="sy2">-=</span> <span class="nu0">5</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> num &gt;<span class="sy2">=</span> <span class="nu0">4</span><span class="sy1">:</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b<span class="sy3">.</span>WriteString<span class="sy1">(</span><span class="st0">&quot;IV&quot;</span><span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; num <span class="sy2">-=</span> <span class="nu0">4</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> num &gt;<span class="sy2">=</span> <span class="nu0">1</span><span class="sy1">:</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b<span class="sy3">.</span>WriteString<span class="sy1">(</span><span class="st0">&quot;I&quot;</span><span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; num <span class="sy2">-=</span> <span class="nu0">1</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="co1">// Выводим строку полученную из буфера </span>
&nbsp; &nbsp; <span class="kw1">return</span> b<span class="sy3">.</span>String<span class="sy1">()</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="616465785"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="616465785" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="de1"><pre class="de1"><span class="kw4">func</span> TestIntToRoman<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; data <span class="sy2">:=</span> <span class="sy1">[]</span><span class="kw4">struct</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; num &nbsp; &nbsp; &nbsp;<span class="kw4">int</span>
&nbsp; &nbsp; &nbsp; &nbsp; expected <span class="kw4">string</span>
&nbsp; &nbsp; <span class="sy1">}{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span><span class="nu0">3749</span><span class="sy1">,</span> <span class="st0">&quot;MMMDCCXLIX&quot;</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span><span class="nu0">58</span><span class="sy1">,</span> <span class="st0">&quot;LVIII&quot;</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span><span class="nu0">1994</span><span class="sy1">,</span> <span class="st0">&quot;MCMXCIV&quot;</span><span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span><span class="sy1">,</span> datum <span class="sy2">:=</span> <span class="kw1">range</span> data <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; result <span class="sy2">:=</span> intToRoman<span class="sy1">(</span>datum<span class="sy3">.</span>num<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> result <span class="sy2">!=</span> datum<span class="sy3">.</span>expected <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Errorf<span class="sy1">(</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;unexpected result for test data index %d (%d), expected [%s], but got [%s]&quot;</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i<span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; datum<span class="sy3">.</span><span class="me1">num</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; datum<span class="sy3">.</span><span class="me1">expected</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result<span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div>
<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
	        </div>
	        <div class="message"><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="865636988"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="865636988" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1">=== RUN &nbsp; TestIntToRoman
--- PASS: TestIntToRoman <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
PASS</pre></td></tr></table></div></td></tr></tbody></table></div></div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table></div>

]]></content:encoded>
			<dc:creator>alhaos</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1422596/9742.html</guid>
		</item>
		<item>
			<title><![CDATA[[golang] 13. Roman to Integer]]></title>
			<link>https://www.cyberforum.ru/blogs/1422596/9713.html</link>
			<pubDate>Sat, 22 Feb 2025 10:15:21 GMT</pubDate>
			<description>Нужно написать функцию которая принимает строку представляющую собой римское число, а вернуть...</description>
			<content:encoded><![CDATA[<div>Нужно написать функцию которая принимает строку представляющую собой римское число, а вернуть десятичное число.<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="505136030"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="505136030" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
</pre></td><td class="de1"><pre class="de1"><span class="co1">// [url]https://leetcode.com/studyplan/top-interview-150/[/url]</span>
&nbsp;
<span class="kw1">package</span> topInterview
&nbsp;
<span class="co1">// romanToInt</span>
<span class="co1">//</span>
<span class="co1">// 13. Roman to Integer</span>
<span class="co1">//</span>
<span class="co1">// Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.</span>
<span class="co1">//</span>
<span class="co1">// Symbol &nbsp; &nbsp; &nbsp; Value</span>
<span class="co1">// I &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1</span>
<span class="co1">// V &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5</span>
<span class="co1">// X &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 10</span>
<span class="co1">// L &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 50</span>
<span class="co1">// C &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 100</span>
<span class="co1">// D &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 500</span>
<span class="co1">// M &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1000</span>
<span class="co1">// For example, 2 is written as II in Roman numeral, just two ones added together. 12 is written as XII, which is simply X + II. The number 27 is written as XXVII, which is XX + V + II.</span>
<span class="co1">//</span>
<span class="co1">// Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX. There are six instances where subtraction is used:</span>
<span class="co1">//</span>
<span class="co1">// I can be placed before V (5) and X (10) to make 4 and 9.</span>
<span class="co1">// X can be placed before L (50) and C (100) to make 40 and 90.</span>
<span class="co1">// C can be placed before D (500) and M (1000) to make 400 and 900.</span>
<span class="co1">// Given a roman numeral, convert it to an integer.//</span>
<span class="kw4">func</span> romanToInt<span class="sy1">(</span>s <span class="kw4">string</span><span class="sy1">)</span> <span class="kw4">int</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Создаю карту соответствия римской цифры и десятичного числа</span>
&nbsp; &nbsp; m <span class="sy2">:=</span> <span class="kw4">map</span><span class="sy1">[</span><span class="kw4">uint8</span><span class="sy1">]</span><span class="kw4">int</span><span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">'I'</span><span class="sy1">:</span> <span class="nu0">1</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">'V'</span><span class="sy1">:</span> <span class="nu0">5</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">'X'</span><span class="sy1">:</span> <span class="nu0">10</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">'L'</span><span class="sy1">:</span> <span class="nu0">50</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">'C'</span><span class="sy1">:</span> <span class="nu0">100</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">'D'</span><span class="sy1">:</span> <span class="nu0">500</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">'M'</span><span class="sy1">:</span> <span class="nu0">1000</span><span class="sy1">,</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Значение текущей римской цифры зависит от предыдущей</span>
&nbsp; &nbsp; <span class="co1">// previous содержит предыдущее число</span>
&nbsp; &nbsp; previous <span class="sy2">:=</span> <span class="nu0">0</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Sum содержит сумму</span>
&nbsp; &nbsp; sum <span class="sy2">:=</span> <span class="nu0">0</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Обходим строку циклом range при таком обходе текущий элемент это руна</span>
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span><span class="sy1">,</span> _ <span class="sy2">:=</span> <span class="kw1">range</span> s <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Обходить слайс нужно в обратном порядке поэтому вычисляем реверсивней указатель</span>
&nbsp; &nbsp; &nbsp; &nbsp; reverseI <span class="sy2">:=</span> <span class="kw3">len</span><span class="sy1">(</span>s<span class="sy1">)</span> <span class="sy3">-</span> <span class="nu2">i</span> <span class="sy3">-</span> <span class="nu0">1</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Если число из карты по текущей руне строки меньше предыдущего числа</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> m<span class="sy1">[</span>s<span class="sy1">[</span>reverseI<span class="sy1">]]</span> &lt; previous <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Вычитаем это число из общей суммы</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sum <span class="sy2">-=</span> m<span class="sy1">[</span>s<span class="sy1">[</span>reverseI<span class="sy1">]]</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span> <span class="kw1">else</span> <span class="sy1">{</span> <span class="co1">// Если число из карты по текущей руне строки не меньше предыдущего числа</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Увеличиваем общую сумму на это число</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sum <span class="sy2">+=</span> m<span class="sy1">[</span>s<span class="sy1">[</span>reverseI<span class="sy1">]]</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Обновляем предыдущее число для следящей итерации цикла</span>
&nbsp; &nbsp; &nbsp; &nbsp; previous <span class="sy2">=</span> m<span class="sy1">[</span>s<span class="sy1">[</span>reverseI<span class="sy1">]]</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="co1">// Возвращаем сумму</span>
&nbsp; &nbsp; <span class="kw1">return</span> sum
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="717733669"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="717733669" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="de1"><pre class="de1"><span class="kw4">func</span> TestRomanToInt<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; data <span class="sy2">:=</span> <span class="sy1">[]</span><span class="kw4">struct</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; s &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw4">string</span>
&nbsp; &nbsp; &nbsp; &nbsp; expected <span class="kw4">int</span>
&nbsp; &nbsp; <span class="sy1">}{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot;III&quot;</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot;LVIII&quot;</span><span class="sy1">,</span> <span class="nu0">58</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span><span class="st0">&quot;MCMXCIV&quot;</span><span class="sy1">,</span> <span class="nu0">1994</span><span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span><span class="sy1">,</span> datum <span class="sy2">:=</span> <span class="kw1">range</span> data <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; result <span class="sy2">:=</span> romanToInt<span class="sy1">(</span>datum<span class="sy3">.</span>s<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> result <span class="sy2">!=</span> datum<span class="sy3">.</span>expected <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Errorf<span class="sy1">(</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;unexpected result for test data index %d (%s), expected [%d], but got [%d]&quot;</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i<span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; datum<span class="sy3">.</span><span class="me1">s</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; datum<span class="sy3">.</span><span class="me1">expected</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result<span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div>
<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
	        </div>
	        <div class="message"><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="21405749"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="21405749" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1">=== RUN &nbsp; TestRomanToInt
--- PASS: TestRomanToInt <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
PASS</pre></td></tr></table></div></td></tr></tbody></table></div></div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table></div>

]]></content:encoded>
			<dc:creator>alhaos</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1422596/9713.html</guid>
		</item>
		<item>
			<title><![CDATA[[golang] 42. Trapping Rain Water]]></title>
			<link>https://www.cyberforum.ru/blogs/1422596/9712.html</link>
			<pubDate>Sat, 22 Feb 2025 09:27:45 GMT</pubDate>
			<description>Дан массив целых чисел который означает высоты на проекции поверхности, если между двумя высотами...</description>
			<content:encoded><![CDATA[<div>Дан массив целых чисел который означает высоты на проекции поверхности, если между двумя высотами есть пространство то там скапливается вода во время дождя, Необходимо найти сколько воды скопится после того как прошел дождь.<br />
<br />
<img src="https://www.cyberforum.ru/blog_attachment.php?attachmentid=10100&amp;d=1740216715" border="0" alt="Название: Безымянный-2024-10-12-1405.png
Просмотров: 12788

Размер: 5.1 Кб" style="margin: 5px" /><br />
<br />
Метод решения с двумя указателями основан на том что вода будет скапливаться на уровне минимальной стенки из двух стенок слева и справа, передвигая стенки к максимальному элементу массива можно просчитать количество воды за один проход слайса.<br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="453349373"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="453349373" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
</pre></td><td class="de1"><pre class="de1"><span class="co1">// [url]https://leetcode.com/studyplan/top-interview-150/[/url]</span>
&nbsp;
<span class="kw1">package</span> topInterview
&nbsp;
<span class="co1">// trap</span>
<span class="co1">//</span>
<span class="co1">// 42. Trapping Rain Water</span>
<span class="co1">//</span>
<span class="co1">// Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it can trap after raining.</span>
<span class="co1">//</span>
<span class="co1">// Example 1:</span>
<span class="co1">//</span>
<span class="co1">// Input: height = [0,1,0,2,1,0,1,3,2,1,2,1]</span>
<span class="co1">// Output: 6</span>
<span class="co1">// Explanation: The above elevation map (black section) is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped.</span>
<span class="co1">//</span>
<span class="co1">// Example 2:</span>
<span class="co1">//</span>
<span class="co1">// Input: height = [4,2,0,3,2,5]</span>
<span class="co1">// Output: 9</span>
<span class="co1">//</span>
<span class="co1">// Constraints:</span>
<span class="co1">//</span>
<span class="co1">// n == height.length</span>
<span class="co1">// 1 &lt;= n &lt;= 2 * 104</span>
<span class="co1">// 0 &lt;= height[i] &lt;= 105//</span>
<span class="kw4">func</span> trap<span class="sy1">(</span>height <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">)</span> <span class="kw4">int</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// length содержит длину слайса height</span>
&nbsp; &nbsp; length <span class="sy2">:=</span> <span class="kw3">len</span><span class="sy1">(</span>height<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Далее инициализируются переменные ссылающиеся на первый элемент слайса</span>
&nbsp; &nbsp; <span class="co1">// и на последний, надо проверить что эти элементы есть чтобы не было паники</span>
&nbsp; &nbsp; <span class="kw1">if</span> length <span class="sy3">==</span> <span class="nu0">0</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// left, right Указатели на текущие элементы справа и слева</span>
&nbsp; &nbsp; left<span class="sy1">,</span> right <span class="sy2">:=</span> <span class="nu0">0</span><span class="sy1">,</span> length<span class="sy3">-</span><span class="nu0">1</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// leftMax, rightMax обнаруженные максимумы слева и справа</span>
&nbsp; &nbsp; leftMax<span class="sy1">,</span> rightMax <span class="sy2">:=</span> height<span class="sy1">[</span>left<span class="sy1">],</span> height<span class="sy1">[</span>right<span class="sy1">]</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// water Общее количество воды</span>
&nbsp; &nbsp; water <span class="sy2">:=</span> <span class="nu0">0</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Обходим слайс пока не сравняются указатели</span>
&nbsp; &nbsp; <span class="kw1">for</span> left &lt; right <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Если текущая значение слева меньше текущего значения справа</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> height<span class="sy1">[</span>left<span class="sy1">]</span> &lt; height<span class="sy1">[</span>right<span class="sy1">]</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Если текущее значение слева больше или равно обнаруженного на текущий момент</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// максимума слева</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> height<span class="sy1">[</span>left<span class="sy1">]</span> &gt;<span class="sy2">=</span> leftMax <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Обнаруженный максимум слева равен ткущему элементу</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; leftMax <span class="sy2">=</span> height<span class="sy1">[</span>left<span class="sy1">]</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span> <span class="kw1">else</span> <span class="sy1">{</span> <span class="co1">// Если текущий элемент слева меньше чем текущий элемент справа</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Повышаем общий уровень воды на разность обнаруженного максимума</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// слева и значения текущего элемента слева</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; water <span class="sy2">+=</span> leftMax <span class="sy3">-</span> height<span class="sy1">[</span>left<span class="sy1">]</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Увеличиваем указатель на левый элемент</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; left<span class="sy2">++</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span> <span class="kw1">else</span> <span class="sy1">{</span> <span class="co1">// Если правый элемент меньше или равно левый элемент</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Если правый элемент больше обнаруженного максимума справа</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> height<span class="sy1">[</span>right<span class="sy1">]</span> &gt;<span class="sy2">=</span> rightMax <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Обнаруженный максимум справа равен текущему элементу справа</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rightMax <span class="sy2">=</span> height<span class="sy1">[</span>right<span class="sy1">]</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span> <span class="kw1">else</span> <span class="sy1">{</span> <span class="co1">// Если текущий элемент справа меньше обнаруженного максимума справа</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Общий уровень воды повышаем на разность обнаруженного максимума справа и значение элемента справа</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; water <span class="sy2">+=</span> rightMax <span class="sy3">-</span> height<span class="sy1">[</span>right<span class="sy1">]</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Увеличиваем указатель правого элемента</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; right<span class="sy2">--</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="co1">// Возвращаем общий уровень воды</span>
&nbsp; &nbsp; <span class="kw1">return</span> water
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="586373928"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="586373928" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="de1"><pre class="de1"><span class="kw4">func</span> TestTrap<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; data <span class="sy2">:=</span> <span class="sy1">[]</span><span class="kw4">struct</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; height &nbsp; <span class="sy1">[]</span><span class="kw4">int</span>
&nbsp; &nbsp; &nbsp; &nbsp; expected <span class="kw4">int</span>
&nbsp; &nbsp; <span class="sy1">}{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">0</span><span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">0</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">0</span><span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">6</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">4</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">0</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">5</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">9</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span><span class="sy1">,</span> datum <span class="sy2">:=</span> <span class="kw1">range</span> data <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; result <span class="sy2">:=</span> trap<span class="sy1">(</span>datum<span class="sy3">.</span>height<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> result <span class="sy2">!=</span> datum<span class="sy3">.</span>expected <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Errorf<span class="sy1">(</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;unexpected result for test data index %d (%+v), expected [%d], but got [%d]&quot;</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i<span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; datum<span class="sy3">.</span><span class="me1">height</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; datum<span class="sy3">.</span><span class="me1">expected</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result<span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div>
<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
	        </div>
	        <div class="message"><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="853022190"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="853022190" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1">=== RUN &nbsp; TestTrap
--- PASS: TestTrap <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
PASS</pre></td></tr></table></div></td></tr></tbody></table></div></div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table></div>

]]></content:encoded>
			<dc:creator>alhaos</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1422596/9712.html</guid>
		</item>
		<item>
			<title><![CDATA[[golang] 135. Candy]]></title>
			<link>https://www.cyberforum.ru/blogs/1422596/9690.html</link>
			<pubDate>Fri, 21 Feb 2025 07:00:46 GMT</pubDate>
			<description>Дан массив рейтинга детей, по этому рейтингу нужно раздать конфеты. 
 - Каждый ребенок должен...</description>
			<content:encoded><![CDATA[<div>Дан массив рейтинга детей, по этому рейтингу нужно раздать конфеты.<br />
 - Каждый ребенок должен получить хотя бы одну конфету.<br />
 - Дети с более высоким рейтингом должны получать больше конфет, чем их соседние дети с более низким рейтингом.<br />
<br />
Найти минимальное количество конфет.<br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="747228909"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="747228909" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
</pre></td><td class="de1"><pre class="de1"><span class="co1">// [url]https://leetcode.com/studyplan/top-interview-150/[/url]</span>
&nbsp;
<span class="kw1">package</span> topInterview
&nbsp;
<span class="co1">// candy</span>
<span class="co1">//</span>
<span class="co1">// 135. Candy</span>
<span class="co1">// There are n children standing in a line. Each child is assigned a rating value given in the integer array ratings.</span>
<span class="co1">//</span>
<span class="co1">// You are giving candies to these children subjected to the following requirements:</span>
<span class="co1">//</span>
<span class="co1">// Each child must have at least one candy.</span>
<span class="co1">// Children with a higher rating get more candies than their neighbors.</span>
<span class="co1">// Return the minimum number of candies you need to have to distribute the candies to the children.</span>
<span class="co1">//</span>
<span class="co1">// Example 1:</span>
<span class="co1">//</span>
<span class="co1">// Input: ratings = [1,0,2]</span>
<span class="co1">// Output: 5</span>
<span class="co1">// Explanation: You can allocate to the first, second and third child with 2, 1, 2 candies respectively.</span>
<span class="co1">// Example 2:</span>
<span class="co1">//</span>
<span class="co1">// Input: ratings = [1,2,2]</span>
<span class="co1">// Output: 4</span>
<span class="co1">// Explanation: You can allocate to the first, second and third child with 1, 2, 1 candies respectively.</span>
<span class="co1">// The third child gets 1 candy because it satisfies the above two conditions.</span>
<span class="co1">//</span>
<span class="co1">// Constraints:</span>
<span class="co1">//</span>
<span class="co1">// n == ratings.length</span>
<span class="co1">// 1 &lt;= n &lt;= 2 * 104</span>
<span class="co1">// 0 &lt;= ratings[i] &lt;= 2 * 104</span>
<span class="kw4">func</span> candy<span class="sy1">(</span>ratings <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">)</span> <span class="kw4">int</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Length содержит длину массива ratings</span>
&nbsp; &nbsp; length <span class="sy2">:=</span> <span class="kw3">len</span><span class="sy1">(</span>ratings<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Создаем слайс для подсчета и сравнения полученных конфет</span>
&nbsp; &nbsp; candies <span class="sy2">:=</span> <span class="kw3">make</span><span class="sy1">([]</span><span class="kw4">int</span><span class="sy1">,</span> length<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Раздаем по конфете</span>
&nbsp; &nbsp; <span class="co1">// Условие &quot;Each child must have at least one candy.&quot;</span>
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span><span class="sy1">,</span> _ <span class="sy2">:=</span> <span class="kw1">range</span> candies <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; candies<span class="sy1">[</span><span class="nu2">i</span><span class="sy1">]</span> <span class="sy2">=</span> <span class="nu0">1</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Обходим слайс слева направо до предпоследнего элемента</span>
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span> <span class="sy2">:=</span> <span class="kw1">range</span> length <span class="sy3">-</span> <span class="nu0">1</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Если рейтинг текущего ребенка меньше рейтинга ребенка справа</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> ratings<span class="sy1">[</span><span class="nu2">i</span><span class="sy1">]</span> &lt; ratings<span class="sy1">[</span><span class="nu2">i</span><span class="sy3">+</span><span class="nu0">1</span><span class="sy1">]</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Ребенок справа получает на одну конфету больше чем есть у текущего ребенка</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; candies<span class="sy1">[</span><span class="nu2">i</span><span class="sy3">+</span><span class="nu0">1</span><span class="sy1">]</span> <span class="sy2">=</span> candies<span class="sy1">[</span><span class="nu2">i</span><span class="sy1">]</span> <span class="sy3">+</span> <span class="nu0">1</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Обходим слайс справа налево до второго элемента</span>
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span> <span class="sy2">:=</span> length <span class="sy3">-</span> <span class="nu0">1</span><span class="sy1">;</span> <span class="nu2">i</span> &gt; <span class="nu0">0</span><span class="sy1">;</span> <span class="nu2">i</span><span class="sy2">--</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Если у текущего ребенка рейтинг ниже чему у ребенка слева</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// и у конфет у текущего ребенка больше или столько же как у ребенка слева</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> ratings<span class="sy1">[</span><span class="nu2">i</span><span class="sy1">]</span> &lt; ratings<span class="sy1">[</span><span class="nu2">i</span><span class="sy3">-</span><span class="nu0">1</span><span class="sy1">]</span> &amp;&amp; candies<span class="sy1">[</span><span class="nu2">i</span><span class="sy1">]</span> &gt;<span class="sy2">=</span> candies<span class="sy1">[</span><span class="nu2">i</span><span class="sy3">-</span><span class="nu0">1</span><span class="sy1">]</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// У ребенка слева становится конфет больше на одну чем у текущего</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; candies<span class="sy1">[</span><span class="nu2">i</span><span class="sy3">-</span><span class="nu0">1</span><span class="sy1">]</span> <span class="sy2">=</span> candies<span class="sy1">[</span><span class="nu2">i</span><span class="sy1">]</span> <span class="sy3">+</span> <span class="nu0">1</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Возвращаем сумму конфет</span>
&nbsp; &nbsp; sum <span class="sy2">:=</span> <span class="nu0">0</span>
&nbsp; &nbsp; <span class="kw1">for</span> _<span class="sy1">,</span> n <span class="sy2">:=</span> <span class="kw1">range</span> candies <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; sum <span class="sy2">+=</span> n
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="kw1">return</span> sum
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="755919814"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="755919814" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="de1"><pre class="de1"><span class="kw4">func</span> TestCandy<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; data <span class="sy2">:=</span> <span class="sy1">[]</span><span class="kw4">struct</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; ratings &nbsp;<span class="sy1">[]</span><span class="kw4">int</span>
&nbsp; &nbsp; &nbsp; &nbsp; expected <span class="kw4">int</span>
&nbsp; &nbsp; <span class="sy1">}{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">0</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">5</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">4</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">7</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">87</span><span class="sy1">,</span> <span class="nu0">87</span><span class="sy1">,</span> <span class="nu0">87</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">13</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">,</span> <span class="nu0">4</span><span class="sy1">,</span> <span class="nu0">5</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">11</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span><span class="sy1">,</span> datum <span class="sy2">:=</span> <span class="kw1">range</span> data <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; result <span class="sy2">:=</span> candy<span class="sy1">(</span>datum<span class="sy3">.</span>ratings<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> result <span class="sy2">!=</span> datum<span class="sy3">.</span>expected <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Errorf<span class="sy1">(</span><span class="st0">&quot;unexpected result for test index %d expected [%d] got [%d]&quot;</span><span class="sy1">,</span> i<span class="sy1">,</span> datum<span class="sy3">.</span><span class="me1">expected</span><span class="sy1">,</span> result<span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div>
<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
	        </div>
	        <div class="message"><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="817570849"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="817570849" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1">=== RUN &nbsp; TestCandy
--- PASS: TestCandy <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
PASS</pre></td></tr></table></div></td></tr></tbody></table></div></div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table></div>

]]></content:encoded>
			<dc:creator>alhaos</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1422596/9690.html</guid>
		</item>
		<item>
			<title><![CDATA[[golang] 134. Gas Station]]></title>
			<link>https://www.cyberforum.ru/blogs/1422596/9624.html</link>
			<pubDate>Mon, 17 Feb 2025 15:49:54 GMT</pubDate>
			<description>Тут нам даны два целочисленных слайса gas и cost, индексы массива представляют собой заправочные...</description>
			<content:encoded><![CDATA[<div>Тут нам даны два целочисленных слайса gas и cost, индексы массива представляют собой заправочные станции. а элементы gas это количество топлива на такой станции, cost это количество топлива необходимое для того чтобы добраться до следующей станции, станции закольцованы, движений по часовой стрелке.<br />
<br />
Гарантируется, что во всех тестовых данные если присутствует путь возможного обхода то он единственный.<br />
<br />
Необходимо вернуть индекс элемента с которого можно объехать все станции. Если такого элемента нет необходимо вернуть -1.<br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="383025917"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="383025917" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
</pre></td><td class="de1"><pre class="de1"><span class="co1">// [url]https://leetcode.com/studyplan/top-interview-150/[/url]</span>
&nbsp;
<span class="kw1">package</span> topInterview
&nbsp;
<span class="co1">// 134. Gas Station</span>
<span class="co1">// There are n gas stations along a circular route, where the amount of gas at the ith station is gas[i].</span>
<span class="co1">// </span>
<span class="co1">// You have a car with an unlimited gas tank and it costs cost[i] of gas to travel from the ith station to its next (i + 1)th station. You begin the journey with an empty tank at one of the gas stations.</span>
<span class="co1">// </span>
<span class="co1">// Given two integer arrays gas and cost, return the starting gas station's index if you can travel around the circuit once in the clockwise direction, otherwise return -1. If there exists a &nbsp;solution, it is guaranteed to be unique.</span>
<span class="co1">// </span>
<span class="co1">// &nbsp;</span>
<span class="co1">// </span>
<span class="co1">// Example 1:</span>
<span class="co1">// </span>
<span class="co1">// Input: gas = [1,2,3,4,5], cost = [3,4,5,1,2]</span>
<span class="co1">// Output: 3</span>
<span class="co1">// Explanation:</span>
<span class="co1">// Start at station 3 (index 3) and fill up with 4 unit of gas. Your tank = 0 + 4 = 4</span>
<span class="co1">// Travel to station 4. Your tank = 4 - 1 + 5 = 8</span>
<span class="co1">// Travel to station 0. Your tank = 8 - 2 + 1 = 7</span>
<span class="co1">// Travel to station 1. Your tank = 7 - 3 + 2 = 6</span>
<span class="co1">// Travel to station 2. Your tank = 6 - 4 + 3 = 5</span>
<span class="co1">// Travel to station 3. The cost is 5. Your gas is just enough to travel back to station 3.</span>
<span class="co1">// Therefore, return 3 as the starting index.</span>
<span class="co1">// Example 2:</span>
<span class="co1">// </span>
<span class="co1">// Input: gas = [2,3,4], cost = [3,4,3]</span>
<span class="co1">// Output: -1</span>
<span class="co1">// Explanation:</span>
<span class="co1">// You can't start at station 0 or 1, as there is not enough gas to travel to the next station.</span>
<span class="co1">// Let's start at station 2 and fill up with 4 unit of gas. Your tank = 0 + 4 = 4</span>
<span class="co1">// Travel to station 0. Your tank = 4 - 3 + 2 = 3</span>
<span class="co1">// Travel to station 1. Your tank = 3 - 3 + 3 = 3</span>
<span class="co1">// You cannot travel back to station 2, as it requires 4 unit of gas but you only have 3.</span>
<span class="co1">// Therefore, you can't travel around the circuit once no matter where you start.</span>
<span class="co1">// &nbsp;</span>
<span class="co1">// </span>
<span class="co1">// Constraints:</span>
<span class="co1">// </span>
<span class="co1">// n == gas.length == cost.length</span>
<span class="co1">// 1 &lt;= n &lt;= 105</span>
<span class="co1">// 0 &lt;= gas[i], cost[i] &lt;= 104</span>
&nbsp;
<span class="kw4">func</span> canCompleteCircuit<span class="sy1">(</span>gas <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">,</span> cost <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">)</span> <span class="kw4">int</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; sumGas <span class="sy2">:=</span> <span class="nu0">0</span> <span class="co1">// Сюда суммирую элементы слайса gas</span>
&nbsp; &nbsp; <span class="kw1">for</span> _<span class="sy1">,</span> n <span class="sy2">:=</span> <span class="kw1">range</span> gas <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; sumGas <span class="sy2">+=</span> n
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; sumCost <span class="sy2">:=</span> <span class="nu0">0</span> <span class="co1">// Сюда суммирую элементы слайса cost</span>
&nbsp; &nbsp; <span class="kw1">for</span> _<span class="sy1">,</span> n <span class="sy2">:=</span> <span class="kw1">range</span> cost <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; sumCost <span class="sy2">+=</span> n
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Пути нет в том случае если сумма топлива меньше суммы топлива необходимого на перемещение</span>
&nbsp; &nbsp; <span class="kw1">if</span> sumGas &lt; sumCost <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="sy3">-</span><span class="nu0">1</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; tank <span class="sy2">:=</span> <span class="nu0">0</span> <span class="co1">// Количество топлива в баке</span>
&nbsp; &nbsp; iterationIndex <span class="sy2">:=</span> <span class="nu0">0</span> <span class="co1">// Индекс итерации по слайсу</span>
&nbsp; &nbsp; startIndex <span class="sy2">:=</span> <span class="nu0">0</span> <span class="co1">// Индекс элемента с которого возможно начать путь</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Прерываю цикл когда все элементы перебраны</span>
&nbsp; &nbsp; <span class="kw1">for</span> <span class="kw3">len</span><span class="sy1">(</span>gas<span class="sy1">)</span> &gt; iterationIndex <span class="sy1">{</span> 
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Количество топлива в баке равно оставшееся топливо полюс топлива наи итерируемой станции</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// минус количество топлива необходимое чтобы добраться до следующей станции.</span>
&nbsp; &nbsp; &nbsp; &nbsp; tank <span class="sy2">+=</span> gas<span class="sy1">[</span>iterationIndex<span class="sy1">]</span> <span class="sy3">-</span> cost<span class="sy1">[</span>iterationIndex<span class="sy1">]</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Если расчетное количество топлива в баке меньше нуля</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> tank &lt; <span class="nu0">0</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Обнулить количество топлива в баке</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tank <span class="sy2">=</span> <span class="nu0">0</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Начать путь со следующего индекса</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; startIndex <span class="sy2">=</span> iterationIndex <span class="sy3">+</span> <span class="nu0">1</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Инкрементировать индекс итерации</span>
&nbsp; &nbsp; &nbsp; &nbsp; iterationIndex<span class="sy2">++</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="co1">// Вернуть индекс начала пусти</span>
&nbsp; &nbsp; <span class="kw1">return</span> startIndex
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div><br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="841806083"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="841806083" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="de1"><pre class="de1"><span class="kw4">func</span> TestCanCompleteCircuit<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; data <span class="sy2">:=</span> <span class="sy1">[]</span><span class="kw4">struct</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; gas &nbsp; &nbsp; &nbsp;<span class="sy1">[]</span><span class="kw4">int</span>
&nbsp; &nbsp; &nbsp; &nbsp; cost &nbsp; &nbsp; <span class="sy1">[]</span><span class="kw4">int</span>
&nbsp; &nbsp; &nbsp; &nbsp; expected <span class="kw4">int</span>
&nbsp; &nbsp; <span class="sy1">}{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">,</span> <span class="nu0">4</span><span class="sy1">,</span> <span class="nu0">5</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">3</span><span class="sy1">,</span> <span class="nu0">4</span><span class="sy1">,</span> <span class="nu0">5</span><span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">3</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">,</span> <span class="nu0">4</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">3</span><span class="sy1">,</span> <span class="nu0">4</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy3">-</span><span class="nu0">1</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span><span class="sy1">,</span> datum <span class="sy2">:=</span> <span class="kw1">range</span> data <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; result <span class="sy2">:=</span> canCompleteCircuit<span class="sy1">(</span>datum<span class="sy3">.</span>gas<span class="sy1">,</span> datum<span class="sy3">.</span>cost<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> result <span class="sy2">!=</span> datum<span class="sy3">.</span>expected <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Errorf<span class="sy1">(</span><span class="st0">&quot;unexpected result for test index %d expected [%d] got [%d]&quot;</span><span class="sy1">,</span> i<span class="sy1">,</span> datum<span class="sy3">.</span><span class="me1">expected</span><span class="sy1">,</span> result<span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div>
<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
	        </div>
	        <div class="message"><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="362152247"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="362152247" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1">=== RUN &nbsp; TestCanCompleteCircuit
--- PASS: TestCanCompleteCircuit <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
PASS</pre></td></tr></table></div></td></tr></tbody></table></div></div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table></div>

]]></content:encoded>
			<dc:creator>alhaos</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1422596/9624.html</guid>
		</item>
		<item>
			<title>238. Product of Array Except Self</title>
			<link>https://www.cyberforum.ru/blogs/1422596/9601.html</link>
			<pubDate>Sun, 16 Feb 2025 15:15:20 GMT</pubDate>
			<description>Необходимо вернуть слайс целых чисел каждый элемент которого содержит произведения всех элементов...</description>
			<content:encoded><![CDATA[<div>Необходимо вернуть слайс целых чисел каждый элемент которого содержит произведения всех элементов входного слайса кроме элемента с совпадающим индексом.<br />
<br />
Ограничения: Не использовать деление, сложность O(n), <br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="674086361"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="674086361" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
</pre></td><td class="de1"><pre class="de1"><span class="co1">// [url]https://leetcode.com/studyplan/top-interview-150/[/url]</span>
&nbsp;
<span class="kw1">package</span> topInterview
&nbsp;
<span class="co1">// productExceptSelf</span>
<span class="co1">//</span>
<span class="co1">// 238. Product of Array Except Self</span>
<span class="co1">// Medium</span>
<span class="co1">// Topics</span>
<span class="co1">// Companies</span>
<span class="co1">// Hint</span>
<span class="co1">// Given an integer array nums, return an array answer such that answer[i] is equal to the product of all the elements of nums except nums[i].</span>
<span class="co1">//</span>
<span class="co1">// The product of any prefix or suffix of nums is guaranteed to fit in a 32-bit integer.</span>
<span class="co1">//</span>
<span class="co1">// You must write an algorithm that runs in O(n) time and without using the division operation.</span>
<span class="co1">//</span>
<span class="co1">// Example 1:</span>
<span class="co1">//</span>
<span class="co1">// Input: nums = [1,2,3,4]</span>
<span class="co1">// Output: [24,12,8,6]</span>
<span class="co1">// Example 2:</span>
<span class="co1">//</span>
<span class="co1">// Input: nums = [-1,1,0,-3,3]</span>
<span class="co1">// Output: [0,0,9,0,0]</span>
<span class="co1">//</span>
<span class="co1">// Constraints:</span>
<span class="co1">//</span>
<span class="co1">// 2 &lt;= nums.length &lt;= 105</span>
<span class="co1">// -30 &lt;= nums[i] &lt;= 30</span>
<span class="co1">// The input is generated such that answer[i] is guaranteed to fit in a 32-bit integer.</span>
<span class="kw4">func</span> productExceptSelf<span class="sy1">(</span>nums <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">)</span> <span class="sy1">[]</span><span class="kw4">int</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Инициировать переменную содержащую накопленное произведение единицей</span>
&nbsp; &nbsp; cumulativeProduct <span class="sy2">:=</span> <span class="nu0">1</span>
&nbsp; &nbsp; <span class="co1">// Инициировать переменную содержащую индекс итерируемого элемента слайса нулем</span>
&nbsp; &nbsp; index <span class="sy2">:=</span> <span class="nu0">0</span>
&nbsp; &nbsp; <span class="co1">// Инициировать промежуточный слайс нулями, длиной аналогичной nums</span>
&nbsp; &nbsp; output <span class="sy2">:=</span> <span class="kw3">make</span><span class="sy1">([]</span><span class="kw4">int</span><span class="sy1">,</span> <span class="kw3">len</span><span class="sy1">(</span>nums<span class="sy1">))</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Запустить цикл</span>
&nbsp; &nbsp; <span class="kw1">for</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Значение элемента промежуточного слайса с индексом Index</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// прировнять к значению переменной накопленной произведения</span>
&nbsp; &nbsp; &nbsp; &nbsp; output<span class="sy1">[</span>index<span class="sy1">]</span> <span class="sy2">=</span> cumulativeProduct
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Значение накопленного произведения приравнять к произведению накопленного</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// произведения и значения элемента nums c индексом Index</span>
&nbsp; &nbsp; &nbsp; &nbsp; cumulativeProduct <span class="sy2">*=</span> nums<span class="sy1">[</span>index<span class="sy1">]</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Если значение Index выходит за приделы крайнего элемента слайса nums</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> index &gt;<span class="sy2">=</span> <span class="kw3">len</span><span class="sy1">(</span>nums<span class="sy1">)</span><span class="sy3">-</span><span class="nu0">1</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Прервать цикл</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Инкрементировать Index</span>
&nbsp; &nbsp; &nbsp; &nbsp; index<span class="sy2">++</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Значение накопленного предвидения прировнять к единице</span>
&nbsp; &nbsp; cumulativeProduct <span class="sy2">=</span> <span class="nu0">1</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">for</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Значение элемента промежуточного слайса с индексом Index прировнять к произведению</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// значение элемента промежуточного слайса с индексом Index и накопленного произведения</span>
&nbsp; &nbsp; &nbsp; &nbsp; output<span class="sy1">[</span>index<span class="sy1">]</span> <span class="sy2">*=</span> cumulativeProduct
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Значение накопленного произведения прировнять к произведению наколенного произведения</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// и элемента слайса nums с индексом Index</span>
&nbsp; &nbsp; &nbsp; &nbsp; cumulativeProduct <span class="sy2">*=</span> nums<span class="sy1">[</span>index<span class="sy1">]</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Если Index меньше нуля</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> index &lt;<span class="sy2">=</span> <span class="nu0">0</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Прервать цикл</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Декриментировать Index</span>
&nbsp; &nbsp; &nbsp; &nbsp; index<span class="sy2">--</span>
&nbsp;
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Вернуть промежуточный слайс</span>
&nbsp; &nbsp; <span class="kw1">return</span> output
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="157277449"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="157277449" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="de1"><pre class="de1"><span class="kw4">func</span> TestProductExceptSelf<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; data <span class="sy2">:=</span> <span class="sy1">[]</span><span class="kw4">struct</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; nums &nbsp; &nbsp; <span class="sy1">[]</span><span class="kw4">int</span>
&nbsp; &nbsp; &nbsp; &nbsp; expected <span class="sy1">[]</span><span class="kw4">int</span>
&nbsp; &nbsp; <span class="sy1">}{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">,</span> <span class="nu0">4</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">24</span><span class="sy1">,</span> <span class="nu0">12</span><span class="sy1">,</span> <span class="nu0">8</span><span class="sy1">,</span> <span class="nu0">6</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="sy3">-</span><span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">0</span><span class="sy1">,</span> <span class="sy3">-</span><span class="nu0">3</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">0</span><span class="sy1">,</span> <span class="nu0">0</span><span class="sy1">,</span> <span class="nu0">9</span><span class="sy1">,</span> <span class="nu0">0</span><span class="sy1">,</span> <span class="nu0">0</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span><span class="sy1">,</span> datum <span class="sy2">:=</span> <span class="kw1">range</span> data <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; result <span class="sy2">:=</span> productExceptSelf<span class="sy1">(</span>datum<span class="sy3">.</span>nums<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="sy3">!</span>reflect<span class="sy3">.</span>DeepEqual<span class="sy1">(</span>result<span class="sy1">,</span> datum<span class="sy3">.</span>expected<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Errorf<span class="sy1">(</span><span class="st0">&quot;unexpected result for test index %d expected [%+v] got [%+v]&quot;</span><span class="sy1">,</span> i<span class="sy1">,</span> datum<span class="sy3">.</span><span class="me1">expected</span><span class="sy1">,</span> result<span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div>
<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
	        </div>
	        <div class="message"><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="357896942"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="357896942" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1">=== RUN &nbsp; TestProductExceptSelf
--- PASS: TestProductExceptSelf <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
PASS</pre></td></tr></table></div></td></tr></tbody></table></div></div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table><a rel="nofollow noopener noreferrer" href="https://github.com/alhaos/problems" target="_blank" title="https://github.com/alhaos/problems">https://github.com/alhaos/problems</a></div>

]]></content:encoded>
			<dc:creator>alhaos</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1422596/9601.html</guid>
		</item>
		<item>
			<title><![CDATA[[golang] 380. Insert Delete GetRandom O(1)]]></title>
			<link>https://www.cyberforum.ru/blogs/1422596/9272.html</link>
			<pubDate>Tue, 04 Feb 2025 05:55:18 GMT</pubDate>
			<description>Тут требуется реализовать структуру которая обслуживает список уникальных элементов и реализует...</description>
			<content:encoded><![CDATA[<div>Тут требуется реализовать структуру которая обслуживает список уникальных элементов и реализует следующий интерфейс:<br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="912282881"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="912282881" style="height: 222px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="de1"><pre class="de1"><span class="kw1">type</span> RandomizedSet <span class="kw4">interface</span> <span class="sy1">{</span>
 <span class="co1">// Insert Добавляет элемент к списку уникальных элементов</span>
 <span class="co1">// в случае успеха возвращает ИСТИНУ</span>
 <span class="co1">// в обратном случае ЛОЖЬ</span>
 Insert<span class="sy1">(</span>val <span class="kw4">int</span><span class="sy1">)</span> <span class="kw4">bool</span>
 <span class="co1">// Remove Удаляет элемент из списка уникальных элементов</span>
 <span class="co1">// в случае успеха возвращает ИСТИНУ</span>
 <span class="co1">// в обратном случае ЛОЖЬ</span>
 Remove<span class="sy1">(</span>val <span class="kw4">int</span><span class="sy1">)</span> <span class="kw4">bool</span>
 <span class="co1">// GetRandom Возвращает случайный элемент из списка</span>
 GetRandom<span class="sy1">()</span> <span class="kw4">int</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div>Требуемая сложность O(1)<br />
<br />
Для реализации сложности жертвуется память, набор элементов храниться в двух наборах, слайс и карта индексов.<br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="395332752"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="395332752" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
</pre></td><td class="de1"><pre class="de1"><span class="co1">// [url]https://leetcode.com/studyplan/top-interview-150/[/url]</span>
&nbsp;
<span class="kw1">package</span> topInterview
&nbsp;
<span class="co1">// RandomizedSet 380. Insert Delete GetRandom O(1)</span>
<span class="co1">// Implement the RandomizedSet class:</span>
<span class="co1">// </span>
<span class="co1">// RandomizedSet() Initializes the RandomizedSet object.</span>
<span class="co1">// bool insert(int val) Inserts an item val into the set if not present. Returns true if the item was not present, false otherwise.</span>
<span class="co1">// bool remove(int val) Removes an item val from the set if present. Returns true if the item was present, false otherwise.</span>
<span class="co1">// int getRandom() Returns a random element from the current set of elements (it's guaranteed that at least one element exists when this method is called). Each element must have the same probability of being returned.</span>
<span class="co1">// You must implement the functions of the class such that each function works in average O(1) time complexity.</span>
<span class="co1">// </span>
<span class="co1">// Example 1:</span>
<span class="co1">// </span>
<span class="co1">// Input</span>
<span class="co1">// [&quot;RandomizedSet&quot;, &quot;insert&quot;, &quot;remove&quot;, &quot;insert&quot;, &quot;getRandom&quot;, &quot;remove&quot;, &quot;insert&quot;, &quot;getRandom&quot;]</span>
<span class="co1">// [[], [1], [2], [2], [], [1], [2], []]</span>
<span class="co1">// Output</span>
<span class="co1">// [null, true, false, true, 2, true, false, 2]</span>
<span class="co1">// </span>
<span class="co1">// Explanation</span>
<span class="co1">// RandomizedSet randomizedSet = new RandomizedSet();</span>
<span class="co1">// randomizedSet.insert(1); // Inserts 1 to the set. Returns true as 1 was inserted successfully.</span>
<span class="co1">// randomizedSet.remove(2); // Returns false as 2 does not exist in the set.</span>
<span class="co1">// randomizedSet.insert(2); // Inserts 2 to the set, returns true. Set now contains [1,2].</span>
<span class="co1">// randomizedSet.getRandom(); // getRandom() should return either 1 or 2 randomly.</span>
<span class="co1">// randomizedSet.remove(1); // Removes 1 from the set, returns true. Set now contains [2].</span>
<span class="co1">// randomizedSet.insert(2); // 2 was already in the set, so return false.</span>
<span class="co1">// randomizedSet.getRandom(); // Since 2 is the only number in the set, getRandom() will always return 2.</span>
<span class="co1">// </span>
<span class="co1">// Constraints:</span>
<span class="co1">// </span>
<span class="co1">// -231 &lt;= val &lt;= 231 - 1</span>
<span class="co1">// At most 2 * 105 calls will be made to insert, remove, and getRandom.</span>
<span class="co1">// There will be at least one element in the data structure when getRandom is called.</span>
&nbsp;
<span class="co1">// RandomizedSet структура содержащая данные</span>
<span class="kw1">type</span> RandomizedSet <span class="kw4">struct</span> <span class="sy1">{</span>
&nbsp; &nbsp; elements &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy1">[]</span><span class="kw4">int</span> &nbsp; &nbsp; &nbsp; <span class="co1">// слайс элементов</span>
&nbsp; &nbsp; elementIndexMap <span class="kw4">map</span><span class="sy1">[</span><span class="kw4">int</span><span class="sy1">]</span><span class="kw4">int</span> <span class="co1">// карта содержащая значение элемента и массив элемента</span>
<span class="sy1">}</span>
&nbsp;
<span class="co1">// Constructor конструктор для структуры RandomizedSet</span>
<span class="kw4">func</span> Constructor<span class="sy1">()</span> RandomizedSet <span class="sy1">{</span>
&nbsp; &nbsp; <span class="co1">// Вернуть RandomizedSet</span>
&nbsp; &nbsp; <span class="kw1">return</span> RandomizedSet<span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; elements<span class="sy1">:</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{},</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Поле elements инициировать пустым слайсом целочисленных элементов</span>
&nbsp; &nbsp; &nbsp; &nbsp; elementIndexMap<span class="sy1">:</span> <span class="kw3">make</span><span class="sy1">(</span><span class="kw4">map</span><span class="sy1">[</span><span class="kw4">int</span><span class="sy1">]</span><span class="kw4">int</span><span class="sy1">),</span> <span class="co1">// Создать пустую карту</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span>
&nbsp;
<span class="co1">// Insert вставляет элемент при отсутствии данного элемента</span>
<span class="co1">// Возвращает ИСТИНУ в случае успеха, ЛОЖЬ в противоположном</span>
<span class="kw4">func</span> <span class="sy1">(</span>this <span class="sy3">*</span>RandomizedSet<span class="sy1">)</span> Insert<span class="sy1">(</span>val <span class="kw4">int</span><span class="sy1">)</span> <span class="kw4">bool</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Инициировать exist бинарным признаком наличия элемента в карте элементов</span>
&nbsp; &nbsp; _<span class="sy1">,</span> exist <span class="sy2">:=</span> this<span class="sy3">.</span><span class="me1">elementIndexMap</span><span class="sy1">[</span>val<span class="sy1">]</span>
&nbsp; &nbsp; <span class="co1">// В случае наличия элемента</span>
&nbsp; &nbsp; <span class="kw1">if</span> exist <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Вернуть ЛОЖЬ</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Добавить элемент в слайс элементов</span>
&nbsp; &nbsp; this<span class="sy3">.</span><span class="me1">elements</span> <span class="sy2">=</span> append<span class="sy1">(</span>this<span class="sy3">.</span><span class="me1">elements</span><span class="sy1">,</span> val<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Добавить элемент в карту индексов элементов</span>
&nbsp; &nbsp; this<span class="sy3">.</span>elementIndexMap<span class="sy1">[</span>val<span class="sy1">]</span> <span class="sy2">=</span> <span class="kw3">len</span><span class="sy1">(</span>this<span class="sy3">.</span>elements<span class="sy1">)</span> <span class="sy3">-</span> <span class="nu0">1</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Вернуть ИСТИНУ</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>
<span class="sy1">}</span>
&nbsp;
<span class="co1">// Remove удаляет элемент при наличии данного элемента</span>
<span class="co1">// Возвращает ИСТИНУ в случае успеха, ЛОЖЬ в противоположном</span>
<span class="kw4">func</span> <span class="sy1">(</span>this <span class="sy3">*</span>RandomizedSet<span class="sy1">)</span> Remove<span class="sy1">(</span>val <span class="kw4">int</span><span class="sy1">)</span> <span class="kw4">bool</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Инициировать exist бинарным признаком наличия элемента в карте элементов</span>
&nbsp; &nbsp; _<span class="sy1">,</span> exist <span class="sy2">:=</span> this<span class="sy3">.</span><span class="me1">elementIndexMap</span><span class="sy1">[</span>val<span class="sy1">]</span>
&nbsp; &nbsp; <span class="co1">// В случае отсутствия элемента</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="sy3">!</span>exist <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Вернуть ЛОЖЬ</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Определить индекс элемента по карте</span>
&nbsp; &nbsp; index <span class="sy2">:=</span> this<span class="sy3">.</span><span class="me1">elementIndexMap</span><span class="sy1">[</span>val<span class="sy1">]</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Заменить значение элемента с индексом index на значение крайнего элемента в слайсе элементов</span>
&nbsp; &nbsp; this<span class="sy3">.</span>elements<span class="sy1">[</span>index<span class="sy1">]</span> <span class="sy2">=</span> this<span class="sy3">.</span>elements<span class="sy1">[</span><span class="kw3">len</span><span class="sy1">(</span>this<span class="sy3">.</span>elements<span class="sy1">)</span><span class="sy3">-</span><span class="nu0">1</span><span class="sy1">]</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Заменить значение индекса, нового значения элемента в карте индексов элементов</span>
&nbsp; &nbsp; this<span class="sy3">.</span><span class="me1">elementIndexMap</span><span class="sy1">[</span>this<span class="sy3">.</span><span class="me1">elements</span><span class="sy1">[</span>index<span class="sy1">]]</span> <span class="sy2">=</span> index
&nbsp;
&nbsp; &nbsp; <span class="co1">// Переопределить слайс элементов им же без крайнего элемента</span>
&nbsp; &nbsp; this<span class="sy3">.</span>elements <span class="sy2">=</span> this<span class="sy3">.</span>elements<span class="sy1">[:</span><span class="kw3">len</span><span class="sy1">(</span>this<span class="sy3">.</span>elements<span class="sy1">)</span><span class="sy3">-</span><span class="nu0">1</span><span class="sy1">]</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Удалить элемент из карты элементов</span>
&nbsp; &nbsp; delete<span class="sy1">(</span>this<span class="sy3">.</span><span class="me1">elementIndexMap</span><span class="sy1">,</span> val<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Вернуть ИСТИНУ</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">true</span>
<span class="sy1">}</span>
&nbsp;
<span class="co1">// GetRandom возвращает случайный элемент</span>
<span class="kw4">func</span> <span class="sy1">(</span>this <span class="sy3">*</span>RandomizedSet<span class="sy1">)</span> GetRandom<span class="sy1">()</span> <span class="kw4">int</span> <span class="sy1">{</span>
&nbsp; &nbsp; <span class="co1">// Проверить наличие элементов в слайсе</span>
&nbsp; &nbsp; <span class="kw1">if</span> <span class="kw3">len</span><span class="sy1">(</span>this<span class="sy3">.</span>elements<span class="sy1">)</span> <span class="sy3">==</span> <span class="nu0">0</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Вернуть ноль</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="co1">// Получить индекс случайного элемента</span>
&nbsp; &nbsp; index <span class="sy2">:=</span> rand<span class="sy3">.</span>Intn<span class="sy1">(</span><span class="kw3">len</span><span class="sy1">(</span>this<span class="sy3">.</span>elements<span class="sy1">))</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Вернуть значение случайного элемента</span>
&nbsp; &nbsp; <span class="kw1">return</span> this<span class="sy3">.</span>elements<span class="sy1">[</span>index<span class="sy1">]</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div><a rel="nofollow noopener noreferrer" href="https://github.com/alhaos/problems" target="_blank" title="https://github.com/alhaos/problems">https://github.com/alhaos/problems</a></div>

]]></content:encoded>
			<dc:creator>alhaos</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1422596/9272.html</guid>
		</item>
		<item>
			<title><![CDATA[[golang] 274. H-Index]]></title>
			<link>https://www.cyberforum.ru/blogs/1422596/9260.html</link>
			<pubDate>Tue, 04 Feb 2025 03:24:54 GMT</pubDate>
			<description>Дан целочисленный слайс, индексы в нем это индексы статей, а элементы - это количество цитат...</description>
			<content:encoded><![CDATA[<div>Дан целочисленный слайс, индексы в нем это индексы статей, а элементы - это количество цитат приходящиеся на опубликованную статью. <br />
<br />
Задача рассчитать <a rel="nofollow noopener noreferrer" href="https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%B4%D0%B5%D0%BA%D1%81_%D0%A5%D0%B8%D1%80%D1%88%D0%B0" target="_blank" title="https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%B4%D0%B5%D0%BA%D1%81_%D0%A5%D0%B8%D1%80%D1%88%D0%B0">индекс Хирша</a><br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="867660853"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="867660853" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
</pre></td><td class="de1"><pre class="de1"><span class="co1">// [url]https://leetcode.com/studyplan/top-interview-150/[/url]</span>
&nbsp;
<span class="kw1">package</span> topInterview
&nbsp;
<span class="kw1">import</span> <span class="sy1">(</span>
&nbsp; &nbsp; <span class="st0">&quot;sort&quot;</span>
<span class="sy1">)</span>
&nbsp;
<span class="co1">// hIndex</span>
<span class="co1">//</span>
<span class="co1">// 274. H-Index</span>
<span class="co1">//</span>
<span class="co1">// Given an array of integers citations where citations[i] is the number of citations a researcher received for their ith paper, return the researcher's h-index.</span>
<span class="co1">//</span>
<span class="co1">// According to the definition of h-index on Wikipedia: The h-index is defined as the maximum value of h such that the given researcher has published at least h papers that have each been cited at least h times.</span>
<span class="co1">//</span>
<span class="co1">// Example 1:</span>
<span class="co1">//</span>
<span class="co1">// Input: citations = [3,0,6,1,5]</span>
<span class="co1">// Output: 3</span>
<span class="co1">// Explanation: [3,0,6,1,5] means the researcher has 5 papers in total and each of them had received 3, 0, 6, 1, 5 citations respectively.</span>
<span class="co1">// Since the researcher has 3 papers with at least 3 citations each and the remaining two with no more than 3 citations each, their h-index is 3.</span>
<span class="co1">// Example 2:</span>
<span class="co1">//</span>
<span class="co1">// Input: citations = [1,3,1]</span>
<span class="co1">// Output: 1</span>
<span class="co1">//</span>
<span class="co1">// Constraints:</span>
<span class="co1">//</span>
<span class="co1">// n == citations.length</span>
<span class="co1">// 1 &lt;= n &lt;= 5000</span>
<span class="co1">// 0 &lt;= citations[i] &lt;= 1000//</span>
<span class="kw4">func</span> hIndex<span class="sy1">(</span>citations <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">)</span> <span class="kw4">int</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Воспользуюсь сортировкой целочисленных слайсов с произвольной функцией сортировки</span>
&nbsp; &nbsp; <span class="co1">// Отсортировать слайс по убыванию</span>
&nbsp; &nbsp; sort<span class="sy3">.</span>Slice<span class="sy1">(</span>citations<span class="sy1">,</span> <span class="kw4">func</span><span class="sy1">(</span><span class="nu2">i</span><span class="sy1">,</span> j <span class="kw4">int</span><span class="sy1">)</span> <span class="kw4">bool</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> citations<span class="sy1">[</span><span class="nu2">i</span><span class="sy1">]</span> &gt; citations<span class="sy1">[</span>j<span class="sy1">]</span>
&nbsp; &nbsp; <span class="sy1">})</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Переменная hIndexValue содержит крайний h-индекс подходящий под критерии</span>
&nbsp; &nbsp; hIndexValue <span class="sy2">:=</span> <span class="nu0">0</span>
&nbsp; &nbsp; <span class="co1">// Цикл range по элементам слайса citations</span>
&nbsp; &nbsp; <span class="co1">// i индекс текущего элемента слайса</span>
&nbsp; &nbsp; <span class="co1">// v значение текущего элемента слайса</span>
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span><span class="sy1">,</span> v <span class="sy2">:=</span> <span class="kw1">range</span> citations <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// если значение текущего элемента слайса больше индекса элемента</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> v &gt;<span class="sy2">=</span> <span class="nu2">i</span><span class="sy3">+</span><span class="nu0">1</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Обновляем hIndexValue становится индексом текущего элемента плюс единица так как чети индекса ведется с единицы</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hIndexValue <span class="sy2">=</span> <span class="nu2">i</span> <span class="sy3">+</span> <span class="nu0">1</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Прервать итерацию цикла</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">continue</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Прервать цикл</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// Вернуть значение h-индекса</span>
&nbsp; &nbsp; <span class="kw1">return</span> hIndexValue
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="472646166"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="472646166" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="de1"><pre class="de1"><span class="kw4">func</span> TestHIndex<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; data <span class="sy2">:=</span> <span class="sy1">[]</span><span class="kw4">struct</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; citations <span class="sy1">[]</span><span class="kw4">int</span>
&nbsp; &nbsp; &nbsp; &nbsp; expected &nbsp;<span class="kw4">int</span>
&nbsp; &nbsp; <span class="sy1">}{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">3</span><span class="sy1">,</span> <span class="nu0">0</span><span class="sy1">,</span> <span class="nu0">6</span><span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">5</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">3</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">1</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span><span class="sy1">,</span> datum <span class="sy2">:=</span> <span class="kw1">range</span> data <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; result <span class="sy2">:=</span> hIndex<span class="sy1">(</span>datum<span class="sy3">.</span>citations<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> result <span class="sy2">!=</span> datum<span class="sy3">.</span>expected <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Errorf<span class="sy1">(</span><span class="st0">&quot;unexpected result for test index %d expected [%+v] got [%+v]&quot;</span><span class="sy1">,</span> i<span class="sy1">,</span> datum<span class="sy3">.</span><span class="me1">expected</span><span class="sy1">,</span> result<span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div>
<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
	        </div>
	        <div class="message"><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="295061294"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="295061294" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1">=== RUN &nbsp; TestHIndex
--- PASS: TestHIndex <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
PASS</pre></td></tr></table></div></td></tr></tbody></table></div></div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table><a rel="nofollow noopener noreferrer" href="https://github.com/alhaos/problems" target="_blank" title="https://github.com/alhaos/problems">https://github.com/alhaos/problems</a></div>

]]></content:encoded>
			<dc:creator>alhaos</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1422596/9260.html</guid>
		</item>
		<item>
			<title><![CDATA[[golang] 45. Jump Game II]]></title>
			<link>https://www.cyberforum.ru/blogs/1422596/9259.html</link>
			<pubDate>Tue, 04 Feb 2025 02:11:21 GMT</pubDate>
			<description>Дан слайс целочисленных элементов, индекс начального элемента 0, в каждом элементе массива указанно...</description>
			<content:encoded><![CDATA[<div>Дан слайс целочисленных элементов, индекс начального элемента 0, в каждом элементе массива указанно на сколько максимально можно увеличить индекс чтобы достичь следующего элемента.<br />
<br />
Задача вернуть минимальное количество шагов за которое можно добраться до крайнего элемента.<br />
<br />
Во всех тестовых данных гарантируется наличие данного пути.<br />
<br />
<div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="726445476"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="726445476" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
</pre></td><td class="de1"><pre class="de1"><span class="co1">// [url]https://leetcode.com/studyplan/top-interview-150/[/url]</span>
&nbsp;
<span class="kw1">package</span> topInterview
&nbsp;
<span class="co1">// jump</span>
<span class="co1">//</span>
<span class="co1">// 45. Jump Game II</span>
<span class="co1">//</span>
<span class="co1">// You are given a 0-indexed array of integers nums of length n. You are initially positioned at nums[0].</span>
<span class="co1">//</span>
<span class="co1">// Each element nums[i] represents the maximum length of a forward jump from index i. In other words, if you are at nums[i], you can jump to any nums// [i + j] where:</span>
<span class="co1">//</span>
<span class="co1">// 0 &lt;= j &lt;= nums[i] and</span>
<span class="co1">// i + j &lt; n</span>
<span class="co1">// Return the minimum number of jumps to reach nums[n - 1]. The test cases are generated such that you can reach nums[n - 1].</span>
<span class="co1">//</span>
<span class="co1">// Example 1:</span>
<span class="co1">//</span>
<span class="co1">// Input: nums = [2,3,1,1,4]</span>
<span class="co1">// Output: 2</span>
<span class="co1">// Explanation: The minimum number of jumps to reach the last index is 2. Jump 1 step from index 0 to 1, then 3 steps to the last index.</span>
<span class="co1">// Example 2:</span>
<span class="co1">//</span>
<span class="co1">// Input: nums = [2,3,0,1,4]</span>
<span class="co1">// Output: 2</span>
<span class="co1">//</span>
<span class="co1">// Constraints:</span>
<span class="co1">//</span>
<span class="co1">// 1 &lt;= nums.length &lt;= 104</span>
<span class="co1">// 0 &lt;= nums[i] &lt;= 1000</span>
<span class="co1">// It's guaranteed that you can reach nums[n - 1].</span>
<span class="kw4">func</span> jump<span class="sy1">(</span>nums <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">)</span> <span class="kw4">int</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// lastNumsIndex содержит крайний индекс слайса</span>
&nbsp; &nbsp; lastNumsIndex <span class="sy2">:=</span> <span class="kw3">len</span><span class="sy1">(</span>nums<span class="sy1">)</span> <span class="sy3">-</span> <span class="nu0">1</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// currentAvailableIndex содержит индекс элемента до которого мы можем допрыгнуть в текущей итерации цикла</span>
&nbsp; &nbsp; currentAvailableIndex <span class="sy2">:=</span> <span class="nu0">0</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// farthestAvailableIndex содержит индекс самого дальнего элемента из обнаруженных за все предыдущие итерации цикла</span>
&nbsp; &nbsp; farthestAvailableIndex <span class="sy2">:=</span> <span class="nu0">0</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// jumps счетчик прыжков</span>
&nbsp; &nbsp; jumps <span class="sy2">:=</span> <span class="nu0">0</span>
&nbsp;
&nbsp; &nbsp; <span class="co1">// index итерируемого элемента цикла</span>
&nbsp; &nbsp; index <span class="sy2">:=</span> <span class="nu0">0</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">for</span> <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Обновить элемент до которого можно допрыгнуть вообще, учитывая предыдущие итерации цикла</span>
&nbsp; &nbsp; &nbsp; &nbsp; farthestAvailableIndex <span class="sy2">=</span> max<span class="sy1">(</span>farthestAvailableIndex<span class="sy1">,</span> index<span class="sy3">+</span>nums<span class="sy1">[</span>index<span class="sy1">])</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Если элемент до которого можно допрыгнуть равен крайнему элементу - цель достигнута</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> farthestAvailableIndex &gt;<span class="sy2">=</span> lastNumsIndex <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Увеличить счетчик прыжков на один</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; jumps<span class="sy2">++</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Прервать цикл</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Если текущий индекс равен индексу элемента до которого мы можем допрыгнуть за эту</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// итерацию - значит мы дошли в тупик, но по условия задачи гарантируется наличие пути к крайнему</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// элементу</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> index <span class="sy3">==</span> currentAvailableIndex <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Увеличить счетчик прыжков на один</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; jumps<span class="sy2">++</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Индекс элемента до которого можно допрыгнуть за текущую итерацию приравнять</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// к индексу наиболее дальнего элемента который найден за все предыдущие итерации цикла</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currentAvailableIndex <span class="sy2">=</span> farthestAvailableIndex
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Увеличить текущий индекс на единицу</span>
&nbsp; &nbsp; &nbsp; &nbsp; index<span class="sy2">++</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="co1">// Вернуть счетчик прыжков</span>
&nbsp; &nbsp; <span class="kw1">return</span> jumps
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div><div class="codeblock"><table class="go"><thead><tr><td colspan="2" id="19076402"  class="head">Go</td></tr></thead><tbody><tr class="li1"><td><div id="19076402" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="de1"><pre class="de1"><span class="kw4">func</span> TestJump<span class="sy1">(</span>t <span class="sy3">*</span>testing<span class="sy3">.</span>T<span class="sy1">)</span> <span class="sy1">{</span>
&nbsp; &nbsp; data <span class="sy2">:=</span> <span class="sy1">[]</span><span class="kw4">struct</span> <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; mums &nbsp; &nbsp; <span class="sy1">[]</span><span class="kw4">int</span>
&nbsp; &nbsp; &nbsp; &nbsp; expected <span class="kw4">int</span>
&nbsp; &nbsp; <span class="sy1">}{</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">4</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">2</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">[]</span><span class="kw4">int</span><span class="sy1">{</span><span class="nu0">2</span><span class="sy1">,</span> <span class="nu0">3</span><span class="sy1">,</span> <span class="nu0">0</span><span class="sy1">,</span> <span class="nu0">1</span><span class="sy1">,</span> <span class="nu0">4</span><span class="sy1">},</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="nu0">2</span><span class="sy1">,</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">},</span>
&nbsp; &nbsp; <span class="sy1">}</span>
&nbsp;
&nbsp; &nbsp; <span class="kw1">for</span> <span class="nu2">i</span><span class="sy1">,</span> datum <span class="sy2">:=</span> <span class="kw1">range</span> data <span class="sy1">{</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; result <span class="sy2">:=</span> jump<span class="sy1">(</span>datum<span class="sy3">.</span>mums<span class="sy1">)</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> result <span class="sy2">!=</span> datum<span class="sy3">.</span>expected <span class="sy1">{</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t<span class="sy3">.</span>Errorf<span class="sy1">(</span><span class="st0">&quot;unexpected result for test index %d expected [%+v] got [%+v]&quot;</span><span class="sy1">,</span> i<span class="sy1">,</span> datum<span class="sy3">.</span><span class="me1">expected</span><span class="sy1">,</span> result<span class="sy1">)</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy1">}</span>
&nbsp; &nbsp; <span class="sy1">}</span>
<span class="sy1">}</span></pre></td></tr></table></div></td></tr></tbody></table></div>
<table width="95%"  class="bbcode_maincontainer"><tr><td>
	<div class="bbcode_container">
	  <div class="bbcode_quote">
	    <div class="btbtbt">
		<div class="quote_container">
	      	<div class="bbcode_quote_container"></div>
	       	<div class="bbcode_postedby">
	         	
	        </div>
	        <div class="message"><div class="codeblock"><table class="unknown"><thead><tr><td colspan="2" id="689763699"  class="head">Code</td></tr></thead><tbody><tr class="li1"><td><div id="689763699" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1">=== RUN &nbsp; TestJump
--- PASS: TestJump <span class="br0">&#40;</span>0.00s<span class="br0">&#41;</span>
PASS</pre></td></tr></table></div></td></tr></tbody></table></div></div>
	      </div>
			</div> 
		</div>
	</div>
</td></tr></table><a rel="nofollow noopener noreferrer" href="https://github.com/alhaos/problems" target="_blank" title="https://github.com/alhaos/problems">https://github.com/alhaos/problems</a></div>

]]></content:encoded>
			<dc:creator>alhaos</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1422596/9259.html</guid>
		</item>
	</channel>
</rss>
