-
Notifications
You must be signed in to change notification settings - Fork 0
/
atom.xml
363 lines (178 loc) · 310 KB
/
atom.xml
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
353
354
355
356
357
358
359
360
361
362
363
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Twacの自习室</title>
<subtitle>less is more. 少即是多</subtitle>
<link href="https://blog.xiaohao233.top/atom.xml" rel="self"/>
<link href="https://blog.xiaohao233.top/"/>
<updated>2022-12-02T04:33:57.995Z</updated>
<id>https://blog.xiaohao233.top/</id>
<author>
<name>Twac</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>Go Kit (一) 构建最基础的HTTP服务</title>
<link href="https://blog.xiaohao233.top/backenddev/go-kit/basicServer/"/>
<id>https://blog.xiaohao233.top/backenddev/go-kit/basicServer/</id>
<published>2022-12-01T04:52:31.000Z</published>
<updated>2022-12-02T04:33:57.995Z</updated>
<content type="html"><![CDATA[<h1 id="Go-Kit-简介"><a href="#Go-Kit-简介" class="headerlink" title="Go Kit 简介"></a>Go Kit 简介</h1><p><code>Go Kit</code> 是一个用于在 Go 中构建微服务的编程工具包。与 Go Micro 不同,它被设计为一个用于导入二进制包的库。</p><p><code>Go Kit</code> 遵循简单的规则,例如:</p><ul><li>没有全局状态</li><li>声明式组合</li><li>显式依赖关系</li><li>接口即约定</li><li>领域驱动设计</li></ul><p>在 <code>Go Kit</code> 中,您可以找到以下的包:</p><ul><li>认证 - Basic 认证和 JWT 认证</li><li>传输 - HTTP、Nats、gRPC 等等。</li><li>日志记录 - 用于结构化服务日志记录的通用接口。</li><li>指标 - CloudWatch、Statsd、Graphite 等。</li><li>追踪 - Zipkin 和 Opentracing。</li><li>服务发现 - Consul、Etcd、Eureka 等等。</li><li>断路器 - Hystrix 的 Go 实现。</li></ul><p><code>Go Kit</code> 自上而下构建了三层模型分别是: 分别是 Transport 层、Endpoint 层、Service 层。</p><ul><li>Transport 层:处理 HTTP、gRPC、Thrift 等协议相关的逻辑,主要对请求进行解码、对响应进行编码操作;</li><li>Endpoint 层:在 Service 的上层作为业务的中间件,可使用限流、熔断、监控等能力;</li><li>Service 层:用来处理业务逻辑;</li></ul><p>利用三层模型可以构建单体服务 -> 微服务 -> 分布式</p><h2 id="编写一个简单的-HTTP-单体服务"><a href="#编写一个简单的-HTTP-单体服务" class="headerlink" title="编写一个简单的 HTTP 单体服务"></a>编写一个简单的 HTTP 单体服务</h2><p>首先构造一个 <code>service</code>, 将服务的建模构造成接口</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> services</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">"errors"</span></span><br><span class="line"><span class="string">"strings"</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> ErrEmpty = errors.New(<span class="string">"empty string"</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> StringService <span class="keyword">interface</span> {</span><br><span class="line">Uppercase(<span class="type">string</span>) (<span class="type">string</span>, <span class="type">error</span>)</span><br><span class="line">Count(<span class="type">string</span>) <span class="type">int</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> StrService <span class="keyword">struct</span>{}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(StrService)</span></span> Uppercase(s <span class="type">string</span>) (<span class="type">string</span>, <span class="type">error</span>) {</span><br><span class="line"><span class="keyword">if</span> s == <span class="string">""</span> {</span><br><span class="line"><span class="keyword">return</span> <span class="string">""</span>, ErrEmpty</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> strings.ToUpper(s), <span class="literal">nil</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(StrService)</span></span> Count(s <span class="type">string</span>) <span class="type">int</span> {</span><br><span class="line"><span class="keyword">return</span> <span class="built_in">len</span>(s)</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>在 Go kit 中,主要的消息传递模式是 RPC。因此,我们接口中的每个方法都将被建模为远程过程调用。对于每个方法,我们定义请求和响应结构,分别捕获所有输入和输出参数。<br>然后组装 <code>endpoint</code> 端点, 它是外部服务与内部服务的桥梁, 往后可以在这里添加中间件的构造。</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> transports</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">"context"</span></span><br><span class="line"><span class="string">"encoding/json"</span></span><br><span class="line">service <span class="string">"kit/services"</span></span><br><span class="line"><span class="string">"net/http"</span></span><br><span class="line"></span><br><span class="line"><span class="string">"github.com/go-kit/kit/endpoint"</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="comment">// Request and Response</span></span><br><span class="line"><span class="keyword">type</span> UppercaseRequest <span class="keyword">struct</span> {</span><br><span class="line">S <span class="type">string</span> <span class="string">`json:"s"`</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> UppercaseResponse <span class="keyword">struct</span> {</span><br><span class="line">V <span class="type">string</span> <span class="string">`json:"v"`</span></span><br><span class="line">Err <span class="type">string</span> <span class="string">`json:"err,omitempty"`</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> CountRequest <span class="keyword">struct</span> {</span><br><span class="line">S <span class="type">string</span> <span class="string">`json:"s"`</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> CountResponse <span class="keyword">struct</span> {</span><br><span class="line">V <span class="type">int</span> <span class="string">`json:"v"`</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// Endpoint 创造端点 相当于一个RPC</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">MakeUppercaseEndpoint</span><span class="params">(svc service.StringService)</span></span> endpoint.Endpoint {</span><br><span class="line"><span class="keyword">return</span> <span class="function"><span class="keyword">func</span><span class="params">(ctx context.Context, request <span class="keyword">interface</span>{})</span></span> (<span class="keyword">interface</span>{}, <span class="type">error</span>) {</span><br><span class="line">req := request.(UppercaseRequest)</span><br><span class="line">v, err := svc.Uppercase(req.S)</span><br><span class="line"><span class="keyword">if</span> err != <span class="literal">nil</span> {</span><br><span class="line"><span class="keyword">return</span> UppercaseResponse{v, err.Error()}, <span class="literal">nil</span></span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> UppercaseResponse{v, <span class="string">""</span>}, <span class="literal">nil</span></span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">MakeCountEndpoint</span><span class="params">(svc service.StringService)</span></span> endpoint.Endpoint {</span><br><span class="line"><span class="keyword">return</span> <span class="function"><span class="keyword">func</span><span class="params">(ctx context.Context, request <span class="keyword">interface</span>{})</span></span> (<span class="keyword">interface</span>{}, <span class="type">error</span>) {</span><br><span class="line">req := request.(CountRequest)</span><br><span class="line">v := svc.Count(req.S)</span><br><span class="line"><span class="keyword">return</span> CountResponse{v}, <span class="literal">nil</span></span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">DecodeUppercaseRequest</span><span class="params">(_ context.Context, r *http.Request)</span></span> (<span class="keyword">interface</span>{}, <span class="type">error</span>) {</span><br><span class="line"><span class="keyword">var</span> request UppercaseRequest</span><br><span class="line"><span class="keyword">if</span> err := json.NewDecoder(r.Body).Decode(&request); err != <span class="literal">nil</span> {</span><br><span class="line"><span class="keyword">return</span> <span class="literal">nil</span>, err</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> request, <span class="literal">nil</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">DecodeCountRequest</span><span class="params">(_ context.Context, r *http.Request)</span></span> (<span class="keyword">interface</span>{}, <span class="type">error</span>) {</span><br><span class="line"><span class="keyword">var</span> request CountRequest</span><br><span class="line"><span class="keyword">if</span> err := json.NewDecoder(r.Body).Decode(&request); err != <span class="literal">nil</span> {</span><br><span class="line"><span class="keyword">return</span> <span class="literal">nil</span>, err</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> request, <span class="literal">nil</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">EncodeResponse</span><span class="params">(_ context.Context, w http.ResponseWriter, response <span class="keyword">interface</span>{})</span></span> <span class="type">error</span> {</span><br><span class="line"><span class="keyword">return</span> json.NewEncoder(w).Encode(response)</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>为服务添加日志中间件: 如果没有彻底的日志记录和检测,任何服务都不能被认为是生产就绪的。</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> middlewares</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">"kit/services"</span></span><br><span class="line"><span class="string">"time"</span></span><br><span class="line"></span><br><span class="line"><span class="string">"github.com/go-kit/log"</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">type</span> LoggingMiddleware <span class="keyword">struct</span> {</span><br><span class="line">Logger log.Logger</span><br><span class="line">Next services.StringService</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">NewLoggingMiddleware</span><span class="params">(logger log.Logger, next services.StringService)</span></span> *LoggingMiddleware {</span><br><span class="line"><span class="keyword">return</span> &LoggingMiddleware{</span><br><span class="line">Logger: logger,</span><br><span class="line">Next: next,</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(mw LoggingMiddleware)</span></span> Uppercase(s <span class="type">string</span>) (output <span class="type">string</span>, err <span class="type">error</span>) {</span><br><span class="line"><span class="keyword">defer</span> <span class="function"><span class="keyword">func</span><span class="params">(begin time.Time)</span></span> {</span><br><span class="line">mw.Logger.Log(</span><br><span class="line"><span class="string">"method"</span>, <span class="string">"uppercase"</span>,</span><br><span class="line"><span class="string">"input"</span>, s,</span><br><span class="line"><span class="string">"output"</span>, output,</span><br><span class="line"><span class="string">"err"</span>, err,</span><br><span class="line"><span class="string">"took"</span>, time.Since(begin),</span><br><span class="line">)</span><br><span class="line">}(time.Now())</span><br><span class="line"></span><br><span class="line">output, err = mw.Next.Uppercase(s)</span><br><span class="line"><span class="keyword">return</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(mw LoggingMiddleware)</span></span> Count(s <span class="type">string</span>) (n <span class="type">int</span>) {</span><br><span class="line"><span class="keyword">defer</span> <span class="function"><span class="keyword">func</span><span class="params">(begin time.Time)</span></span> {</span><br><span class="line">mw.Logger.Log(</span><br><span class="line"><span class="string">"method"</span>, <span class="string">"count"</span>,</span><br><span class="line"><span class="string">"input"</span>, s,</span><br><span class="line"><span class="string">"n"</span>, n,</span><br><span class="line"><span class="string">"took"</span>, time.Since(begin),</span><br><span class="line">)</span><br><span class="line">}(time.Now())</span><br><span class="line"></span><br><span class="line">n = mw.Next.Count(s)</span><br><span class="line"><span class="keyword">return</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>现在我们需要将服务公开,以便调用它。您的组织可能已经对服务应该如何相互通信有了自己的看法。也许你使用Thrift,或者自定义JSON over HTTP。围棋套件支持许多开箱即用的传输工具。<br>对于这个最小的示例服务,让我们使用HTTP上的JSON。Go kit在package transport/http中提供了一个helper结构。</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line"><span class="string">"net/http"</span></span><br><span class="line"><span class="string">"os"</span></span><br><span class="line"></span><br><span class="line">service <span class="string">"kit/services"</span></span><br><span class="line">transport <span class="string">"kit/transports"</span></span><br><span class="line"></span><br><span class="line">middleware <span class="string">"kit/middlewares"</span></span><br><span class="line"></span><br><span class="line">httptransport <span class="string">"github.com/go-kit/kit/transport/http"</span></span><br><span class="line"><span class="string">"github.com/go-kit/log"</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> {</span><br><span class="line">logger := log.NewLogfmtLogger(os.Stderr)</span><br><span class="line"></span><br><span class="line">svc := middleware.NewLoggingMiddleware(logger, service.StrService{})</span><br><span class="line"></span><br><span class="line">uppercaseHandler := httptransport.NewServer(</span><br><span class="line">transport.MakeUppercaseEndpoint(svc),</span><br><span class="line">transport.DecodeUppercaseRequest,</span><br><span class="line">transport.EncodeResponse,</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line">countHandler := httptransport.NewServer(</span><br><span class="line">transport.MakeCountEndpoint(svc),</span><br><span class="line">transport.DecodeCountRequest,</span><br><span class="line">transport.EncodeResponse,</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line">http.Handle(<span class="string">"/uppercase"</span>, uppercaseHandler)</span><br><span class="line">http.Handle(<span class="string">"/count"</span>, countHandler)</span><br><span class="line">http.ListenAndServe(<span class="string">":25567"</span>, <span class="literal">nil</span>)</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><h1 id="Go-Kit-简介"><a href="#Go-Kit-简介" class="headerlink" title="Go Kit 简介"></a>Go Kit 简介</h1><p><code>Go Kit</code> 是一个用于在 Go 中构建微服务的编程工具包</summary>
<category term="后端学习" scheme="https://blog.xiaohao233.top/backenddev/"/>
<category term="Golang" scheme="https://blog.xiaohao233.top/tags/Golang/"/>
</entry>
<entry>
<title>力扣小记 1710、129、515</title>
<link href="https://blog.xiaohao233.top/LeetCode/leetcode/2022-11-15/"/>
<id>https://blog.xiaohao233.top/LeetCode/leetcode/2022-11-15/</id>
<published>2022-11-15T13:47:53.000Z</published>
<updated>2022-11-27T05:43:31.927Z</updated>
<content type="html"><![CDATA[<h2 id="1710-卡车上的最大单元数"><a href="#1710-卡车上的最大单元数" class="headerlink" title="1710.卡车上的最大单元数"></a>1710.卡车上的最大单元数</h2><blockquote><p><a href="https://leetcode.cn/problems/maximum-units-on-a-truck">https://leetcode.cn/problems/maximum-units-on-a-truck</a></p></blockquote><p><strong>思路:</strong><br>先对<code>numberOfUnitsPerBoxi</code>从大到小排序, 每次取最大的数量, 然后<code>truckSize</code>减去<code>numberOfBoxesi</code>,尽可能的装多, 当<code>truckSize</code>为0得出答案, 这道题贪心算法直接可以过</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">maximumUnits</span><span class="params">(boxTypes [][]<span class="type">int</span>, truckSize <span class="type">int</span>)</span></span> (result <span class="type">int</span>) {</span><br><span class="line"> sort.Slice(boxTypes, <span class="function"><span class="keyword">func</span><span class="params">(i, j <span class="type">int</span>)</span></span> <span class="type">bool</span> {</span><br><span class="line"> <span class="keyword">return</span> boxTypes[i][<span class="number">1</span>] > boxTypes[j][<span class="number">1</span>]</span><br><span class="line"> })</span><br><span class="line"> <span class="keyword">for</span> _, box := <span class="keyword">range</span> boxTypes {</span><br><span class="line"> result += box[<span class="number">1</span>] * min(truckSize, box[<span class="number">0</span>])</span><br><span class="line"> truckSize -= box[<span class="number">0</span>]</span><br><span class="line"> <span class="keyword">if</span> truckSize <= <span class="number">0</span> {</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">min</span><span class="params">(i, j <span class="type">int</span>)</span></span> <span class="type">int</span> {</span><br><span class="line"> <span class="keyword">if</span> i > j {</span><br><span class="line"> <span class="keyword">return</span> j</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> i</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="129-求根节点到叶子节点数字之和"><a href="#129-求根节点到叶子节点数字之和" class="headerlink" title="129.求根节点到叶子节点数字之和"></a>129.求根节点到叶子节点数字之和</h2><blockquote><p><a href="https://leetcode.cn/problems/sum-root-to-leaf-numbers">https://leetcode.cn/problems/sum-root-to-leaf-numbers</a></p></blockquote><p><strong>思路:</strong><br>记录每一个节点的值, 当遍历到叶子节点便往<code>res</code>添加值</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Definition for a binary tree node.</span></span><br><span class="line"><span class="comment"> * type TreeNode struct {</span></span><br><span class="line"><span class="comment"> * Val int</span></span><br><span class="line"><span class="comment"> * Left *TreeNode</span></span><br><span class="line"><span class="comment"> * Right *TreeNode</span></span><br><span class="line"><span class="comment"> * }</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">sumNumbers</span><span class="params">(root *TreeNode)</span></span> <span class="type">int</span> {</span><br><span class="line"> <span class="keyword">return</span> traverse(root, <span class="number">0</span>)</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">traverse</span><span class="params">(root *TreeNode, cur <span class="type">int</span>)</span></span> <span class="type">int</span> {</span><br><span class="line"> <span class="keyword">if</span> root == <span class="literal">nil</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> }</span><br><span class="line"> cur = cur*<span class="number">10</span> + root.Val</span><br><span class="line"> <span class="keyword">if</span> root.Left == <span class="literal">nil</span> && root.Right == <span class="literal">nil</span> {</span><br><span class="line"> <span class="keyword">return</span> cur</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> traverse(root.Left, cur) + traverse(root.Right, cur)</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="515-在每个数行中找最大值"><a href="#515-在每个数行中找最大值" class="headerlink" title="515.在每个数行中找最大值"></a>515.在每个数行中找最大值</h2><blockquote><p><a href="https://leetcode.cn/problems/find-largest-value-in-each-tree-row">https://leetcode.cn/problems/find-largest-value-in-each-tree-row</a></p></blockquote><p><strong>思路:</strong><br>对二叉树做层序遍历, 将最大值记录起来</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Definition for a binary tree node.</span></span><br><span class="line"><span class="comment"> * public class TreeNode {</span></span><br><span class="line"><span class="comment"> * int val;</span></span><br><span class="line"><span class="comment"> * TreeNode left;</span></span><br><span class="line"><span class="comment"> * TreeNode right;</span></span><br><span class="line"><span class="comment"> * TreeNode() {}</span></span><br><span class="line"><span class="comment"> * TreeNode(int val) { this.val = val; }</span></span><br><span class="line"><span class="comment"> * TreeNode(int val, TreeNode left, TreeNode right) {</span></span><br><span class="line"><span class="comment"> * this.val = val;</span></span><br><span class="line"><span class="comment"> * this.left = left;</span></span><br><span class="line"><span class="comment"> * this.right = right;</span></span><br><span class="line"><span class="comment"> * }</span></span><br><span class="line"><span class="comment"> * }</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> {</span><br><span class="line"> <span class="keyword">public</span> List<Integer> <span class="title function_">largestValues</span><span class="params">(TreeNode root)</span> {</span><br><span class="line"> List<Integer> res = <span class="keyword">new</span> <span class="title class_">LinkedList</span><>();</span><br><span class="line"> <span class="keyword">if</span> (root == <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">return</span> res;</span><br><span class="line"> }</span><br><span class="line"> Queue<TreeNode> q = <span class="keyword">new</span> <span class="title class_">LinkedList</span><>();</span><br><span class="line"> q.offer(root);</span><br><span class="line"> <span class="keyword">while</span> (!q.isEmpty()) {</span><br><span class="line"> <span class="type">int</span> <span class="variable">size</span> <span class="operator">=</span> q.size();</span><br><span class="line"> <span class="type">int</span> <span class="variable">max</span> <span class="operator">=</span> Integer.MIN_VALUE;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < size; i++) {</span><br><span class="line"> <span class="type">TreeNode</span> <span class="variable">cur</span> <span class="operator">=</span> q.poll();</span><br><span class="line"> max = Math.max(max, cur.val);</span><br><span class="line"> <span class="keyword">if</span> (cur.left != <span class="literal">null</span>) {</span><br><span class="line"> q.offer(cur.left);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (cur.right != <span class="literal">null</span>) {</span><br><span class="line"> q.offer(cur.right);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> res.add(max);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> res;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><h2 id="1710-卡车上的最大单元数"><a href="#1710-卡车上的最大单元数" class="headerlink" title="1710.卡车上的最大单元数"></a>1710.卡车上的最大单元数</h2><blockquote>
<p><a href="</summary>
<category term="LeetCode" scheme="https://blog.xiaohao233.top/LeetCode/"/>
<category term="算法" scheme="https://blog.xiaohao233.top/tags/algorithm/"/>
</entry>
<entry>
<title>力扣小记 117、124、116</title>
<link href="https://blog.xiaohao233.top/LeetCode/leetcode/2022-11-14/"/>
<id>https://blog.xiaohao233.top/LeetCode/leetcode/2022-11-14/</id>
<published>2022-11-14T11:48:32.000Z</published>
<updated>2022-11-24T09:47:22.606Z</updated>
<content type="html"><![CDATA[<h2 id="117-填充每一个节点的右侧指针Ⅱ"><a href="#117-填充每一个节点的右侧指针Ⅱ" class="headerlink" title="117.填充每一个节点的右侧指针Ⅱ"></a>117.填充每一个节点的右侧指针Ⅱ</h2><blockquote><p><a href="https://leetcode.cn/problems/populating-next-right-pointers-in-each-node-ii">https://leetcode.cn/problems/populating-next-right-pointers-in-each-node-ii</a></p></blockquote><p><strong>思路:</strong><br>用BFS去遍历这颗二叉树, 层序遍历框架用<code>while</code>控制层数, <code>for</code>控制层级节点</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">// Definition for a Node.</span></span><br><span class="line"><span class="comment">class Node {</span></span><br><span class="line"><span class="comment"> public int val;</span></span><br><span class="line"><span class="comment"> public Node left;</span></span><br><span class="line"><span class="comment"> public Node right;</span></span><br><span class="line"><span class="comment"> public Node next;</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"> public Node() {}</span></span><br><span class="line"><span class="comment"> </span></span><br><span class="line"><span class="comment"> public Node(int _val) {</span></span><br><span class="line"><span class="comment"> val = _val;</span></span><br><span class="line"><span class="comment"> }</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"> public Node(int _val, Node _left, Node _right, Node _next) {</span></span><br><span class="line"><span class="comment"> val = _val;</span></span><br><span class="line"><span class="comment"> left = _left;</span></span><br><span class="line"><span class="comment"> right = _right;</span></span><br><span class="line"><span class="comment"> next = _next;</span></span><br><span class="line"><span class="comment"> }</span></span><br><span class="line"><span class="comment">};</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> {</span><br><span class="line"> <span class="keyword">public</span> Node <span class="title function_">connect</span><span class="params">(Node root)</span> {</span><br><span class="line"> <span class="keyword">if</span> (root == <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line"> Queue<Node> queue = <span class="keyword">new</span> <span class="title class_">LinkedList</span><>();</span><br><span class="line"> queue.offer(root);</span><br><span class="line"> <span class="keyword">while</span> (!queue.isEmpty()) {</span><br><span class="line"> <span class="type">int</span> <span class="variable">size</span> <span class="operator">=</span> queue.size();</span><br><span class="line"> <span class="type">Node</span> <span class="variable">prev</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < size; i++) {</span><br><span class="line"> <span class="type">Node</span> <span class="variable">cur</span> <span class="operator">=</span> queue.poll();</span><br><span class="line"> <span class="keyword">if</span> (prev != <span class="literal">null</span>) {</span><br><span class="line"> prev.next = cur;</span><br><span class="line"> }</span><br><span class="line"> prev = cur;</span><br><span class="line"> <span class="keyword">if</span> (cur.left != <span class="literal">null</span>) {</span><br><span class="line"> queue.offer(cur.left);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (cur.right != <span class="literal">null</span>) {</span><br><span class="line"> queue.offer(cur.right);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> root;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="124-二叉树中的最大路径和"><a href="#124-二叉树中的最大路径和" class="headerlink" title="124.二叉树中的最大路径和"></a>124.二叉树中的最大路径和</h2><blockquote><p><a href="https://leetcode.cn/problems/binary-tree-maximum-path-sum">https://leetcode.cn/problems/binary-tree-maximum-path-sum</a></p></blockquote><p><strong>思路:</strong><br>明确每个节点需要干什么, 一个节点需要知道自己的val加上当前记录的val会比谁大, 这里用后序遍历拿到每个节点的值, 比较左右子树最大的值求得最后结果</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Definition for a binary tree node.</span></span><br><span class="line"><span class="comment"> * type TreeNode struct {</span></span><br><span class="line"><span class="comment"> * Val int</span></span><br><span class="line"><span class="comment"> * Left *TreeNode</span></span><br><span class="line"><span class="comment"> * Right *TreeNode</span></span><br><span class="line"><span class="comment"> * }</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">maxPathSum</span><span class="params">(root *TreeNode)</span></span> <span class="type">int</span> {</span><br><span class="line"> <span class="keyword">if</span> root == <span class="literal">nil</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">var</span> res = <span class="number">0</span></span><br><span class="line"> <span class="keyword">var</span> maxSum <span class="function"><span class="keyword">func</span><span class="params">(*TreeNode)</span></span> <span class="type">int</span></span><br><span class="line"> maxSum = <span class="function"><span class="keyword">func</span><span class="params">(root *TreeNode)</span></span> <span class="type">int</span> {</span><br><span class="line"> <span class="keyword">if</span> root == <span class="literal">nil</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> }</span><br><span class="line"> leftSum := max(<span class="number">0</span>, maxSum(root.Left))</span><br><span class="line"> rightSum := max(<span class="number">0</span>, maxSum(root.Right))</span><br><span class="line"> current := root.Val + leftSum + rightSum</span><br><span class="line"> res = max(res, current)</span><br><span class="line"> <span class="keyword">return</span> max(leftSum, rightSum) + root.Val</span><br><span class="line"> }</span><br><span class="line"> maxSum(root)</span><br><span class="line"> <span class="keyword">return</span> res</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">max</span><span class="params">(i, j <span class="type">int</span>)</span></span> <span class="type">int</span> {</span><br><span class="line"> <span class="keyword">if</span> i > j {</span><br><span class="line"> <span class="keyword">return</span> i</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> j</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="116-填充每个节点的下一右侧节点的指针"><a href="#116-填充每个节点的下一右侧节点的指针" class="headerlink" title="116.填充每个节点的下一右侧节点的指针"></a>116.填充每个节点的下一右侧节点的指针</h2><blockquote><p><a href="https://leetcode.cn/problems/populating-next-right-pointers-in-each-node">https://leetcode.cn/problems/populating-next-right-pointers-in-each-node</a></p></blockquote><p><strong>思路:</strong><br>这道题比117难一点点,因为需要跨越两颗子树连接,可以把二叉树的相邻节点抽象成一个<code>三叉树节点</code>,这样二叉树就变成了一棵<code>三叉树</code>,然后你去遍历这棵<code>三叉树</code>,把每个<code>三叉树节点</code>中的两个节点连接</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Definition for a Node.</span></span><br><span class="line"><span class="comment"> * type Node struct {</span></span><br><span class="line"><span class="comment"> * Val int</span></span><br><span class="line"><span class="comment"> * Left *Node</span></span><br><span class="line"><span class="comment"> * Right *Node</span></span><br><span class="line"><span class="comment"> * Next *Node</span></span><br><span class="line"><span class="comment"> * }</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">connect</span><span class="params">(root *Node)</span></span> *Node {</span><br><span class="line"> <span class="keyword">if</span> root == <span class="literal">nil</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">nil</span></span><br><span class="line"> }</span><br><span class="line">traverse(root.Left, root.Right)</span><br><span class="line"> <span class="keyword">return</span> root</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">traverse</span><span class="params">(n1, n2 *Node)</span></span> {</span><br><span class="line"> <span class="keyword">if</span> n1 == <span class="literal">nil</span> || n2 == <span class="literal">nil</span> {</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> }</span><br><span class="line"> n1.Next = n2</span><br><span class="line"> traverse(n1.Left, n1.Right)</span><br><span class="line"> traverse(n2.Left, n2.Right)</span><br><span class="line"> traverse(n1.Right, n2.Left)</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><h2 id="117-填充每一个节点的右侧指针Ⅱ"><a href="#117-填充每一个节点的右侧指针Ⅱ" class="headerlink" title="117.填充每一个节点的右侧指针Ⅱ"></a>117.填充每一个节点的右侧指针Ⅱ</h2><blockquote>
</summary>
<category term="LeetCode" scheme="https://blog.xiaohao233.top/LeetCode/"/>
<category term="算法" scheme="https://blog.xiaohao233.top/tags/algorithm/"/>
</entry>
<entry>
<title>力扣小记 791、99、103、109、112、113</title>
<link href="https://blog.xiaohao233.top/LeetCode/leetcode/2022-11-13/"/>
<id>https://blog.xiaohao233.top/LeetCode/leetcode/2022-11-13/</id>
<published>2022-11-13T06:51:02.000Z</published>
<updated>2022-11-24T09:47:26.870Z</updated>
<content type="html"><![CDATA[<h2 id="791-自定义字符串排序"><a href="#791-自定义字符串排序" class="headerlink" title="791.自定义字符串排序"></a>791.自定义字符串排序</h2><blockquote><p><a href="https://leetcode.cn/problems/custom-sort-string">https://leetcode.cn/problems/custom-sort-string</a></p></blockquote><p><strong>思路:</strong><br>用数组记录每个字符的位置,遍历<code>s</code>, 按照<code>order</code>的顺序自定义排序交换元素, 如果<code>s</code>里有<code>order</code>没有的元素默认位置置为0</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">customSortString</span><span class="params">(order <span class="type">string</span>, s <span class="type">string</span>)</span></span> <span class="type">string</span> {</span><br><span class="line"> dict := [<span class="number">26</span>]<span class="type">int</span>{}</span><br><span class="line"> <span class="keyword">for</span> i := <span class="keyword">range</span> order {</span><br><span class="line"> dict[order[i]-<span class="string">'a'</span>] = i</span><br><span class="line"> }</span><br><span class="line"> cs := []<span class="type">byte</span>(s)</span><br><span class="line"> sort.Slice(cs, <span class="function"><span class="keyword">func</span><span class="params">(i, j <span class="type">int</span>)</span></span> <span class="type">bool</span> {</span><br><span class="line"> <span class="keyword">return</span> dict[cs[i]-<span class="string">'a'</span>] < dict[cs[j]-<span class="string">'a'</span>]</span><br><span class="line"> })</span><br><span class="line"> <span class="keyword">return</span> <span class="type">string</span>(cs)</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="99-恢复二叉搜索树"><a href="#99-恢复二叉搜索树" class="headerlink" title="99.恢复二叉搜索树"></a>99.恢复二叉搜索树</h2><blockquote><p><a href="https://leetcode.cn/problems/recover-binary-search-tree">https://leetcode.cn/problems/recover-binary-search-tree</a></p></blockquote><p><strong>思路:</strong><br>BST的特质, 中序遍历顺序是一个升序排序, 根据题意<code>恰好</code>两个节点的值被错误的交换, 可以在中序遍历中找到这两个节点然后交换</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Definition for a binary tree node.</span></span><br><span class="line"><span class="comment"> * type TreeNode struct {</span></span><br><span class="line"><span class="comment"> * Val int</span></span><br><span class="line"><span class="comment"> * Left *TreeNode</span></span><br><span class="line"><span class="comment"> * Right *TreeNode</span></span><br><span class="line"><span class="comment"> * }</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">var</span> n1, n2 *TreeNode</span><br><span class="line"><span class="keyword">var</span> prev *TreeNode</span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">recoverTree</span><span class="params">(root *TreeNode)</span></span> {</span><br><span class="line"> n1, n2 = <span class="literal">nil</span>, <span class="literal">nil</span></span><br><span class="line"> prev = &TreeNode{Val: math.MinInt}</span><br><span class="line"> inorderTraverse(root)</span><br><span class="line"> n1.Val, n2.Val = n2.Val, n1.Val</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">inorderTraverse</span><span class="params">(root *TreeNode)</span></span> {</span><br><span class="line"> <span class="keyword">if</span> root == <span class="literal">nil</span> {</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> }</span><br><span class="line"> inorderTraverse(root.Left)</span><br><span class="line"> <span class="keyword">if</span> root.Val < prev.Val {</span><br><span class="line"> <span class="keyword">if</span> n1 == <span class="literal">nil</span> {</span><br><span class="line"> n1 = prev</span><br><span class="line"> }</span><br><span class="line"> n2 = root</span><br><span class="line"> }</span><br><span class="line"> prev = root</span><br><span class="line"> inorderTraverse(root.Right)</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="103-二叉树的锯齿形层序遍历"><a href="#103-二叉树的锯齿形层序遍历" class="headerlink" title="103.二叉树的锯齿形层序遍历"></a>103.二叉树的锯齿形层序遍历</h2><blockquote><p><a href="https://leetcode.cn/problems/binary-tree-zigzag-level-order-traversal">https://leetcode.cn/problems/binary-tree-zigzag-level-order-traversal</a></p></blockquote><p><strong>思路:</strong><br>本质是一个层序遍历框架, 只不过在此基础上加了一个<code>锯齿形层序遍历</code>, 设置一个<code>flag</code>控制打印方向</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Definition for a binary tree node.</span></span><br><span class="line"><span class="comment"> * public class TreeNode {</span></span><br><span class="line"><span class="comment"> * int val;</span></span><br><span class="line"><span class="comment"> * TreeNode left;</span></span><br><span class="line"><span class="comment"> * TreeNode right;</span></span><br><span class="line"><span class="comment"> * TreeNode() {}</span></span><br><span class="line"><span class="comment"> * TreeNode(int val) { this.val = val; }</span></span><br><span class="line"><span class="comment"> * TreeNode(int val, TreeNode left, TreeNode right) {</span></span><br><span class="line"><span class="comment"> * this.val = val;</span></span><br><span class="line"><span class="comment"> * this.left = left;</span></span><br><span class="line"><span class="comment"> * this.right = right;</span></span><br><span class="line"><span class="comment"> * }</span></span><br><span class="line"><span class="comment"> * }</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> {</span><br><span class="line"> <span class="keyword">public</span> List<List<Integer>> <span class="title function_">zigzagLevelOrder</span><span class="params">(TreeNode root)</span> {</span><br><span class="line"> LinkedList<List<Integer>> res = <span class="keyword">new</span> <span class="title class_">LinkedList</span><>();</span><br><span class="line"> <span class="keyword">if</span> (root == <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">return</span> res;</span><br><span class="line"> }</span><br><span class="line"> Queue<TreeNode> queue = <span class="keyword">new</span> <span class="title class_">LinkedList</span><>();</span><br><span class="line"> queue.offer(root);</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">leftOrRight</span> <span class="operator">=</span> <span class="literal">true</span>;</span><br><span class="line"> <span class="keyword">while</span> (!queue.isEmpty()) {</span><br><span class="line"> <span class="type">int</span> <span class="variable">size</span> <span class="operator">=</span> queue.size();</span><br><span class="line"> LinkedList<Integer> level = <span class="keyword">new</span> <span class="title class_">LinkedList</span><>();</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < size; i++) {</span><br><span class="line"> <span class="type">TreeNode</span> <span class="variable">cur</span> <span class="operator">=</span> queue.poll();</span><br><span class="line"> <span class="keyword">if</span> (leftOrRight) {</span><br><span class="line"> level.addLast(cur.val);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> level.addFirst(cur.val);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (cur.left != <span class="literal">null</span>) {</span><br><span class="line"> queue.offer(cur.left);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (cur.right != <span class="literal">null</span>) {</span><br><span class="line"> queue.offer(cur.right);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> leftOrRight = !leftOrRight;</span><br><span class="line"> res.add(level);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> res;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="109-有序链表转换二叉搜索树"><a href="#109-有序链表转换二叉搜索树" class="headerlink" title="109.有序链表转换二叉搜索树"></a>109.有序链表转换二叉搜索树</h2><blockquote><p><a href="https://leetcode.cn/problems/convert-sorted-list-to-binary-search-tree">https://leetcode.cn/problems/convert-sorted-list-to-binary-search-tree</a></p></blockquote><p><strong>思路:</strong><br>这道题有很多种做法, 最先想到的还是先把链表转换成数组在去构建BST, 也可以先找到链表的中点再去构造BST</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Definition for singly-linked list.</span></span><br><span class="line"><span class="comment"> * type ListNode struct {</span></span><br><span class="line"><span class="comment"> * Val int</span></span><br><span class="line"><span class="comment"> * Next *ListNode</span></span><br><span class="line"><span class="comment"> * }</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Definition for a binary tree node.</span></span><br><span class="line"><span class="comment"> * type TreeNode struct {</span></span><br><span class="line"><span class="comment"> * Val int</span></span><br><span class="line"><span class="comment"> * Left *TreeNode</span></span><br><span class="line"><span class="comment"> * Right *TreeNode</span></span><br><span class="line"><span class="comment"> * }</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">sortedListToBST</span><span class="params">(head *ListNode)</span></span> *TreeNode {</span><br><span class="line"> nodes := []<span class="type">int</span>{}</span><br><span class="line"> <span class="keyword">for</span> p := head; p != <span class="literal">nil</span>; p = p.Next {</span><br><span class="line"> nodes = <span class="built_in">append</span>(nodes, p.Val)</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> build(nodes, <span class="number">0</span>, <span class="built_in">len</span>(nodes)<span class="number">-1</span>)</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">build</span><span class="params">(nums []<span class="type">int</span>, start, end <span class="type">int</span>)</span></span> *TreeNode {</span><br><span class="line"> <span class="keyword">if</span> start > end {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">nil</span></span><br><span class="line"> }</span><br><span class="line"> mid := start + (end - start) / <span class="number">2</span></span><br><span class="line"> <span class="keyword">return</span> &TreeNode{</span><br><span class="line"> Val: nums[mid],</span><br><span class="line"> Left: build(nums, start, mid<span class="number">-1</span>),</span><br><span class="line"> Right: build(nums, mid+<span class="number">1</span>, end),</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="112-路径总和"><a href="#112-路径总和" class="headerlink" title="112.路径总和"></a>112.路径总和</h2><blockquote><p><a href="https://leetcode.cn/problems/path-sum">https://leetcode.cn/problems/path-sum</a></p></blockquote><p><strong>思路:</strong><br>二叉树前序遍历, 维护进出节点的缓存值, 当节点是叶子节点时且缓存值等于目标值返回true, 反则false</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Definition for a binary tree node.</span></span><br><span class="line"><span class="comment"> * type TreeNode struct {</span></span><br><span class="line"><span class="comment"> * Val int</span></span><br><span class="line"><span class="comment"> * Left *TreeNode</span></span><br><span class="line"><span class="comment"> * Right *TreeNode</span></span><br><span class="line"><span class="comment"> * }</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">var</span> found <span class="type">bool</span></span><br><span class="line"><span class="keyword">var</span> sum, target <span class="type">int</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">hasPathSum</span><span class="params">(root *TreeNode, targetSum <span class="type">int</span>)</span></span> <span class="type">bool</span> {</span><br><span class="line"> <span class="keyword">if</span> root == <span class="literal">nil</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span></span><br><span class="line"> }</span><br><span class="line"> sum = <span class="number">0</span></span><br><span class="line"> found = <span class="literal">false</span></span><br><span class="line"> target = targetSum</span><br><span class="line"> traverse(root)</span><br><span class="line"> <span class="keyword">return</span> found</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">traverse</span><span class="params">(root *TreeNode)</span></span> {</span><br><span class="line"> <span class="keyword">if</span> root == <span class="literal">nil</span> {</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> }</span><br><span class="line"> sum += root.Val</span><br><span class="line"> <span class="keyword">if</span> root.Left == <span class="literal">nil</span> && root.Right == <span class="literal">nil</span> && sum == target {</span><br><span class="line"> found = <span class="literal">true</span></span><br><span class="line"> }</span><br><span class="line"> traverse(root.Left)</span><br><span class="line"> traverse(root.Right)</span><br><span class="line"> sum -= root.Val</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="113-路径总和Ⅱ"><a href="#113-路径总和Ⅱ" class="headerlink" title="113.路径总和Ⅱ"></a>113.路径总和Ⅱ</h2><blockquote><p><a href="https://leetcode.cn/problems/path-sum-ii">https://leetcode.cn/problems/path-sum-ii</a></p></blockquote><p><strong>思路:</strong><br>和112相似,只不过需要记录多条路径, 仍然是前序遍历, 符合条件就记录起来。</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Definition for a binary tree node.</span></span><br><span class="line"><span class="comment"> * type TreeNode struct {</span></span><br><span class="line"><span class="comment"> * Val int</span></span><br><span class="line"><span class="comment"> * Left *TreeNode</span></span><br><span class="line"><span class="comment"> * Right *TreeNode</span></span><br><span class="line"><span class="comment"> * }</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">var</span> sum <span class="type">int</span></span><br><span class="line"><span class="keyword">var</span> res [][]<span class="type">int</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">pathSum</span><span class="params">(root *TreeNode, targetSum <span class="type">int</span>)</span></span> [][]<span class="type">int</span> {</span><br><span class="line"> res = [][]<span class="type">int</span>{}</span><br><span class="line"> sum = <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span> root == <span class="literal">nil</span> {</span><br><span class="line"> <span class="keyword">return</span> res</span><br><span class="line"> }</span><br><span class="line"> traverse(root, targetSum, []<span class="type">int</span>{})</span><br><span class="line"> <span class="keyword">return</span> res</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">traverse</span><span class="params">(root *TreeNode, targetSum <span class="type">int</span>, path []<span class="type">int</span>)</span></span> {</span><br><span class="line"> <span class="keyword">if</span> root == <span class="literal">nil</span> {</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> }</span><br><span class="line"> remain := targetSum - root.Val</span><br><span class="line"> <span class="keyword">if</span> root.Left == <span class="literal">nil</span> && root.Right == <span class="literal">nil</span> && remain == <span class="number">0</span> {</span><br><span class="line"> path = <span class="built_in">append</span>(path, root.Val)</span><br><span class="line"> temp := <span class="built_in">make</span>([]<span class="type">int</span>, <span class="built_in">len</span>(path))</span><br><span class="line"> <span class="built_in">copy</span>(temp, path)</span><br><span class="line"> res = <span class="built_in">append</span>(res, temp)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> }</span><br><span class="line"> path = <span class="built_in">append</span>(path, root.Val)</span><br><span class="line"> traverse(root.Left, remain, path)</span><br><span class="line"> traverse(root.Right, remain, path)</span><br><span class="line"> path = path[:<span class="built_in">len</span>(path)<span class="number">-1</span>]</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>这里有个Golang的切片小陷阱, Golang的切片是指向底层数组的, 所以直接记录切片到<code>res</code>的话只是记录<code>path</code>的地址段, 当不发生扩容指向的是原地址,一旦发生扩容创建新的底层数组指向过去,地址是会动态改变的,所以要记录<code>path</code>的副本, 每次存<code>path</code>的副本保证数据的独立性</p>]]></content>
<summary type="html"><h2 id="791-自定义字符串排序"><a href="#791-自定义字符串排序" class="headerlink" title="791.自定义字符串排序"></a>791.自定义字符串排序</h2><blockquote>
<p><a href="https://</summary>
<category term="LeetCode" scheme="https://blog.xiaohao233.top/LeetCode/"/>
<category term="算法" scheme="https://blog.xiaohao233.top/tags/algorithm/"/>
</entry>
<entry>
<title>力扣小记 108、46、322</title>
<link href="https://blog.xiaohao233.top/LeetCode/leetcode/2022-11-12/"/>
<id>https://blog.xiaohao233.top/LeetCode/leetcode/2022-11-12/</id>
<published>2022-11-12T06:07:44.000Z</published>
<updated>2022-11-24T09:47:31.442Z</updated>
<content type="html"><![CDATA[<h2 id="108-将有序数组转换为二叉搜索树"><a href="#108-将有序数组转换为二叉搜索树" class="headerlink" title="108.将有序数组转换为二叉搜索树"></a>108.将有序数组转换为二叉搜索树</h2><blockquote><p><a href="https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree">https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree</a></p></blockquote><p><strong>思路:</strong><br>根据题意是构造一棵平衡的BST, 对于BST的每个节点都有着<code>root.left < root < root.right</code>, 先找到root节点在别分构建左子树和右子树</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Definition for a binary tree node.</span></span><br><span class="line"><span class="comment"> * type TreeNode struct {</span></span><br><span class="line"><span class="comment"> * Val int</span></span><br><span class="line"><span class="comment"> * Left *TreeNode</span></span><br><span class="line"><span class="comment"> * Right *TreeNode</span></span><br><span class="line"><span class="comment"> * }</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">sortedArrayToBST</span><span class="params">(nums []<span class="type">int</span>)</span></span> *TreeNode {</span><br><span class="line"> <span class="keyword">return</span> build(nums, <span class="number">0</span>, <span class="built_in">len</span>(nums)<span class="number">-1</span>)</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">build</span><span class="params">(nums []<span class="type">int</span>, start, end <span class="type">int</span>)</span></span> *TreeNode {</span><br><span class="line"> <span class="keyword">if</span> start > end {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">nil</span></span><br><span class="line"> }</span><br><span class="line"> mid := start + (end - start) / <span class="number">2</span></span><br><span class="line"> root := &TreeNode{</span><br><span class="line"> Val: nums[mid],</span><br><span class="line"> Left: build(nums, start, mid<span class="number">-1</span>),</span><br><span class="line"> Right: build(nums, mid+<span class="number">1</span>, end),</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> root</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="46-全排列"><a href="#46-全排列" class="headerlink" title="46.全排列"></a>46.全排列</h2><blockquote><p><a href="https://leetcode.cn/problems/permutations">https://leetcode.cn/problems/permutations</a></p></blockquote><p><strong>思路:</strong><br>回溯,选出一个数字对剩下的数字排列组合</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> res [][]<span class="type">int</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">permute</span><span class="params">(nums []<span class="type">int</span>)</span></span> [][]<span class="type">int</span> {</span><br><span class="line"> res = [][]<span class="type">int</span>{}</span><br><span class="line"> backtrack(nums, <span class="built_in">len</span>(nums), []<span class="type">int</span>{})</span><br><span class="line"> <span class="keyword">return</span> res</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">backtrack</span><span class="params">(nums []<span class="type">int</span>, numsLen <span class="type">int</span>, path []<span class="type">int</span>)</span></span> {</span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">len</span>(nums) == <span class="number">0</span> {</span><br><span class="line"> p := <span class="built_in">make</span>([]<span class="type">int</span>, <span class="built_in">len</span>(path))</span><br><span class="line"> <span class="built_in">copy</span>(p, path)</span><br><span class="line"> res = <span class="built_in">append</span>(res, p)</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> i := <span class="number">0</span>; i < numsLen; i++ {</span><br><span class="line"> cur := nums[i]</span><br><span class="line"> path = <span class="built_in">append</span>(path, cur)</span><br><span class="line"> nums = <span class="built_in">append</span>(nums[:i], nums[i+<span class="number">1</span>:]...)</span><br><span class="line"> backtrack(nums, <span class="built_in">len</span>(nums), path)</span><br><span class="line"> nums = <span class="built_in">append</span>(nums[:i], <span class="built_in">append</span>([]<span class="type">int</span>{cur}, nums[i:]...)...)</span><br><span class="line"> path = path[:<span class="built_in">len</span>(path)<span class="number">-1</span>]</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="322-零钱兑换"><a href="#322-零钱兑换" class="headerlink" title="322.零钱兑换"></a>322.零钱兑换</h2><blockquote><p><a href="https://leetcode.cn/problems/coin-change">https://leetcode.cn/problems/coin-change</a></p></blockquote><p><strong>思路:</strong><br>先画出递归树, 用<code>动态规划</code>解,定义dp数组: 第<code>i</code>金额最少需要用<code>dp[i]</code>枚硬币</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">coinChange</span><span class="params">(coins []<span class="type">int</span>, amount <span class="type">int</span>)</span></span> <span class="type">int</span> {</span><br><span class="line"> dp := <span class="built_in">make</span>([]<span class="type">int</span>, amount + <span class="number">1</span>)</span><br><span class="line"> <span class="keyword">for</span> i := <span class="number">0</span>; i < <span class="built_in">len</span>(dp); i++ {</span><br><span class="line"> dp[i] = amount + <span class="number">1</span></span><br><span class="line"> }</span><br><span class="line"> dp[<span class="number">0</span>] = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> i := <span class="number">0</span>; i < <span class="built_in">len</span>(dp); i++ {</span><br><span class="line"> <span class="keyword">for</span> _, coin := <span class="keyword">range</span> coins {</span><br><span class="line"> <span class="keyword">if</span> i - coin < <span class="number">0</span> {</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> }</span><br><span class="line"> dp[i] = min(dp[i], <span class="number">1</span>+dp[i-coin])</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> dp[amount] == amount + <span class="number">1</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="number">-1</span></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> dp[amount]</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">min</span><span class="params">(i, j <span class="type">int</span>)</span></span> <span class="type">int</span> {</span><br><span class="line"> <span class="keyword">if</span> i < j {</span><br><span class="line"> <span class="keyword">return</span> i</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> j</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><h2 id="108-将有序数组转换为二叉搜索树"><a href="#108-将有序数组转换为二叉搜索树" class="headerlink" title="108.将有序数组转换为二叉搜索树"></a>108.将有序数组转换为二叉搜索树</h2><blockquote>
</summary>
<category term="LeetCode" scheme="https://blog.xiaohao233.top/LeetCode/"/>
<category term="算法" scheme="https://blog.xiaohao233.top/tags/algorithm/"/>
</entry>
<entry>
<title>力扣小记 300、354、51、53</title>
<link href="https://blog.xiaohao233.top/LeetCode/leetcode/2022-11-11/"/>
<id>https://blog.xiaohao233.top/LeetCode/leetcode/2022-11-11/</id>
<published>2022-11-11T02:48:39.000Z</published>
<updated>2022-11-24T09:47:35.046Z</updated>
<content type="html"><![CDATA[<p>突发奇想偶尔记录一两道算法题,算是记录也算是鞭策。<br>嘛。。希望能坚持下去</p><h2 id="300-最长递增子序列"><a href="#300-最长递增子序列" class="headerlink" title="300.最长递增子序列"></a>300.最长递增子序列</h2><blockquote><p><a href="https://leetcode.cn/problems/longest-increasing-subsequence">https://leetcode.cn/problems/longest-increasing-subsequence</a></p></blockquote><p><strong>思路:</strong><br>LIS递增子序列, 定义dp数组, 第<code>i</code>个元素的最大递增子序列是<code>dp[i]</code>, 遍历dp数组找出最大值即是答案。</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">lengthOfLIS</span><span class="params">(nums []<span class="type">int</span>)</span></span> <span class="type">int</span> {</span><br><span class="line"> n := <span class="built_in">len</span>(nums)</span><br><span class="line"> res := <span class="number">0</span></span><br><span class="line"> dp := <span class="built_in">make</span>([]<span class="type">int</span>, n)</span><br><span class="line"> <span class="keyword">for</span> i := <span class="number">0</span>; i < n; i++ {</span><br><span class="line"> dp[i] = <span class="number">1</span> <span class="comment">// 元素本身也算一个子序列, 所以要初始化为1</span></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> i := <span class="number">0</span>; i < n; i++ {</span><br><span class="line"> <span class="keyword">for</span> j := <span class="number">0</span>; j < i; j++ {</span><br><span class="line"> <span class="keyword">if</span> nums[i] > nums[j] { <span class="comment">// 当后面元素大于前面元素 比较两者的最大递增子序列并加1</span></span><br><span class="line"> dp[i] = max(dp[i], dp[j] + <span class="number">1</span>)</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> i := <span class="number">0</span>; i < n; i++ {</span><br><span class="line"> res = max(res, dp[i])</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> res</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">max</span><span class="params">(i, j <span class="type">int</span>)</span></span> <span class="type">int</span> {</span><br><span class="line"> <span class="keyword">if</span> i > j {</span><br><span class="line"> <span class="keyword">return</span> i</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> j</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="354-俄罗斯套娃信封问题"><a href="#354-俄罗斯套娃信封问题" class="headerlink" title="354.俄罗斯套娃信封问题"></a>354.俄罗斯套娃信封问题</h2><blockquote><p><a href="https://leetcode.cn/problems/russian-doll-envelopes">https://leetcode.cn/problems/russian-doll-envelopes</a></p></blockquote><p><strong>思路:</strong><br>这里想到用<code>动态规划</code>。本质是一道LIS题, 只不过是二维的, 需要先转换一下, 先按宽度升序再按相同高度降序, 在把高度拿出来在此基础上求递增LIS的长度。</p><figure class="highlight golang"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">maxEnvelopes</span><span class="params">(envelopes [][]<span class="type">int</span>)</span></span> <span class="type">int</span> {</span><br><span class="line"> sort.Slice(envelopes, <span class="function"><span class="keyword">func</span><span class="params">(i, j <span class="type">int</span>)</span></span> <span class="type">bool</span> {</span><br><span class="line"><span class="keyword">if</span> envelopes[i][<span class="number">0</span>] == envelopes[j][<span class="number">0</span>] {</span><br><span class="line"><span class="keyword">return</span> envelopes[j][<span class="number">1</span>] < envelopes[i][<span class="number">1</span>]</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> envelopes[i][<span class="number">0</span>] < envelopes[j][<span class="number">0</span>]</span><br><span class="line">})</span><br><span class="line"> n := <span class="built_in">len</span>(envelopes)</span><br><span class="line"> height := <span class="built_in">make</span>([]<span class="type">int</span>, n)</span><br><span class="line"> dp := <span class="built_in">make</span>([]<span class="type">int</span>, n)</span><br><span class="line"> <span class="keyword">for</span> i := <span class="number">0</span>; i < n; i++ {</span><br><span class="line"> height[i] = envelopes[i][<span class="number">1</span>]</span><br><span class="line"> dp[i] = <span class="number">1</span></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> i := <span class="number">0</span>; i < n; i++ {</span><br><span class="line"> <span class="keyword">for</span> j := <span class="number">0</span>; j < i; j++ {</span><br><span class="line"> <span class="keyword">if</span> height[i] > height[j] {</span><br><span class="line"> dp[i] = max(dp[i], dp[j]+<span class="number">1</span>)</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> res := <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> i := <span class="number">0</span>; i < n; i++ {</span><br><span class="line"> res = max(res, dp[i])</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> res</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">max</span><span class="params">(i, j <span class="type">int</span>)</span></span> <span class="type">int</span> {</span><br><span class="line"> <span class="keyword">if</span> i > j {</span><br><span class="line"> <span class="keyword">return</span> i</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> j</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="51-N皇后"><a href="#51-N皇后" class="headerlink" title="51.N皇后"></a>51.N皇后</h2><blockquote><p><a href="https://leetcode.cn/problems/n-queens">https://leetcode.cn/problems/n-queens</a></p></blockquote><p><strong>思路:</strong><br>经典题型了, DFS+回溯把所有可能的结果穷举出来</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> res [][]<span class="type">string</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">solveNQueens</span><span class="params">(n <span class="type">int</span>)</span></span> [][]<span class="type">string</span> {</span><br><span class="line"> res = [][]<span class="type">string</span>{}</span><br><span class="line"> board := <span class="built_in">make</span>([][]<span class="type">string</span>, n)</span><br><span class="line"> <span class="keyword">for</span> i := <span class="number">0</span>; i < n; i++ {</span><br><span class="line"> board[i] = <span class="built_in">make</span>([]<span class="type">string</span>, n)</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> i := <span class="number">0</span>; i < n; i++ {</span><br><span class="line"> <span class="keyword">for</span> j := <span class="number">0</span>; j < n; j++ {</span><br><span class="line"> board[i][j] = <span class="string">"."</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> backtrack(board, <span class="number">0</span>) <span class="comment">//从第一行开始</span></span><br><span class="line"> <span class="keyword">return</span> res</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">backtrack</span><span class="params">(board [][]<span class="type">string</span>, row <span class="type">int</span>)</span></span> {</span><br><span class="line"> size := <span class="built_in">len</span>(board)</span><br><span class="line"> <span class="keyword">if</span> row == size {</span><br><span class="line"> temp := <span class="built_in">make</span>([]<span class="type">string</span>, size)</span><br><span class="line"> <span class="keyword">for</span> i := <span class="number">0</span>; i < size; i++ {</span><br><span class="line"> temp[i] = strings.Join(board[i], <span class="string">""</span>) <span class="comment">// 二维转一维</span></span><br><span class="line"> }</span><br><span class="line"> res = <span class="built_in">append</span>(res, temp) <span class="comment">// 找到一个可行解存入进去</span></span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> col := <span class="number">0</span>; col < size; col++ {</span><br><span class="line"> <span class="keyword">if</span> !isValid(board, row, col) {</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> }</span><br><span class="line"> board[row][col] = <span class="string">"Q"</span></span><br><span class="line"> backtrack(board, row+<span class="number">1</span>)</span><br><span class="line"> board[row][col] = <span class="string">"."</span></span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 检测该位置是否合法</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">isValid</span><span class="params">(board [][]<span class="type">string</span>, row, col <span class="type">int</span>)</span></span> <span class="type">bool</span> {</span><br><span class="line"> n := <span class="built_in">len</span>(board)</span><br><span class="line"> <span class="keyword">for</span> i := <span class="number">0</span>; i < row; i++ {</span><br><span class="line"> <span class="keyword">if</span> board[i][col] == <span class="string">"Q"</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> i := <span class="number">0</span>; i < n; i++ {</span><br><span class="line"> <span class="keyword">if</span> board[row][i] == <span class="string">"Q"</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> i, j := row, col; i >= <span class="number">0</span> && j >= <span class="number">0</span>; i, j = i<span class="number">-1</span>, j<span class="number">-1</span> {</span><br><span class="line"> <span class="keyword">if</span> board[i][j] == <span class="string">"Q"</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> i, j := row, col; i >= <span class="number">0</span> && j < n; i, j = i<span class="number">-1</span>, j+<span class="number">1</span> {</span><br><span class="line"> <span class="keyword">if</span> board[i][j] == <span class="string">"Q"</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="53-最大子数组和"><a href="#53-最大子数组和" class="headerlink" title="53.最大子数组和"></a>53.最大子数组和</h2><blockquote><p><a href="https://leetcode.cn/problems/maximum-subarray">https://leetcode.cn/problems/maximum-subarray</a></p></blockquote><p><strong>思路:</strong><br>这道题最先想到的就是<code>滑动窗口</code>, 通过两个指针根据条件不断缩放窗口更新最大值; 也可以用<code>动态规划</code>, 定义dp数组<code>i</code>为<code>nums[i]</code>结尾最大子数组和<code>dp[i]</code></p><p><strong>滑动窗口:</strong></p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">maxSubArray</span><span class="params">(nums []<span class="type">int</span>)</span></span> <span class="type">int</span> {</span><br><span class="line"> left, right := <span class="number">0</span>, <span class="number">0</span></span><br><span class="line"> sum, maxSum := <span class="number">0</span>, math.MinInt</span><br><span class="line"> n := <span class="built_in">len</span>(nums)</span><br><span class="line"> <span class="keyword">for</span> right < n {</span><br><span class="line"> sum += nums[right]</span><br><span class="line"> right++</span><br><span class="line"> maxSum = max(maxSum, sum)</span><br><span class="line"> <span class="keyword">for</span> sum < <span class="number">0</span> {</span><br><span class="line"> sum -= nums[left]</span><br><span class="line"> left++ </span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> maxSum</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">max</span><span class="params">(i, j <span class="type">int</span>)</span></span> <span class="type">int</span> {</span><br><span class="line"> <span class="keyword">if</span> i > j {</span><br><span class="line"> <span class="keyword">return</span> i</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> j</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><strong>动态规划</strong></p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">maxSubArray</span><span class="params">(nums []<span class="type">int</span>)</span></span> <span class="type">int</span> {</span><br><span class="line"> n := <span class="built_in">len</span>(nums)</span><br><span class="line"> <span class="keyword">if</span> n == <span class="number">0</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> }</span><br><span class="line"> dp := <span class="built_in">make</span>([]<span class="type">int</span>, n)</span><br><span class="line"> res := nums[<span class="number">0</span>]</span><br><span class="line"> dp[<span class="number">0</span>] = nums[<span class="number">0</span>]</span><br><span class="line"> <span class="keyword">for</span> i := <span class="number">1</span>; i < n; i++ {</span><br><span class="line"> dp[i] = max(nums[i], nums[i] + dp[i<span class="number">-1</span>])</span><br><span class="line"> res = max(res, dp[i])</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> res</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">max</span><span class="params">(i, j <span class="type">int</span>)</span></span> <span class="type">int</span> {</span><br><span class="line"> <span class="keyword">if</span> i > j {</span><br><span class="line"> <span class="keyword">return</span> i</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> j</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><p>突发奇想偶尔记录一两道算法题,算是记录也算是鞭策。<br>嘛。。希望能坚持下去</p>
<h2 id="300-最长递增子序列"><a href="#300-最长递增子序列" class="headerlink" title="300.最长递增子序列"></a>300.最长</summary>
<category term="LeetCode" scheme="https://blog.xiaohao233.top/LeetCode/"/>
<category term="算法" scheme="https://blog.xiaohao233.top/tags/algorithm/"/>
</entry>
<entry>
<title>保存最新一期青年大学习学习记录(广东)</title>
<link href="https://blog.xiaohao233.top/randomtoss/youth/youth_record/"/>
<id>https://blog.xiaohao233.top/randomtoss/youth/youth_record/</id>
<published>2022-11-05T06:58:31.000Z</published>
<updated>2022-12-06T04:33:19.666Z</updated>
<content type="html"><![CDATA[<h1 id="保存最新一期青年大学习学习记录"><a href="#保存最新一期青年大学习学习记录" class="headerlink" title="保存最新一期青年大学习学习记录"></a>保存最新一期青年大学习学习记录</h1><p>每周一晚上八点自动完成最新一期青年大学习并获取记录</p><p>提供自托管服务操作如下:</p><ol><li>进入团员页点击认证资料</li><li>点击生成团员证</li><li>复制链接</li><li>提取链接中 <code>memberId</code> 参数的值</li><li>将 <code>memberId</code> 的值作为评论内容留言</li></ol><p>一个示例(memberId=123456)</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://tuan.12355.net/wechat/view/information/member_certification_generated.html?memberId=123456&showMemberAdditionNames=&showMemberRewardIds=&isShowAllFee=true</span><br></pre></td></tr></table></figure><p>Github: <a href="https://github.com/Twacqwq/Youth">https://github.com/Twacqwq/Youth</a></p>]]></content>
<summary type="html"><h1 id="保存最新一期青年大学习学习记录"><a href="#保存最新一期青年大学习学习记录" class="headerlink" title="保存最新一期青年大学习学习记录"></a>保存最新一期青年大学习学习记录</h1><p>每周一晚上八点自动完成最新一期青年大</summary>
<category term="瞎折腾" scheme="https://blog.xiaohao233.top/randomtoss/"/>
</entry>
<entry>
<title>Sonarr+Jackett+qBittorrent+Emby自动追番方案</title>
<link href="https://blog.xiaohao233.top/uncategorized/XArrRss-Sonarr-Jackett-qBittorrent-Emby%E8%87%AA%E5%8A%A8%E8%BF%BD%E7%95%AA%E6%96%B9%E6%A1%88/"/>
<id>https://blog.xiaohao233.top/uncategorized/XArrRss-Sonarr-Jackett-qBittorrent-Emby%E8%87%AA%E5%8A%A8%E8%BF%BD%E7%95%AA%E6%96%B9%E6%A1%88/</id>
<published>2022-07-23T09:45:02.000Z</published>
<updated>2022-07-24T11:25:45.422Z</updated>
<content type="html"><![CDATA[<p>众所周知B站看番环境越来越苛刻了(港澳除外),国内上线的番剧少之又少且部分番剧还有圣光剪辑和无缝链接,实属破坏看番体验。B站以外的在线看番网站画质起伏特别大,还有很多广告。所以搭建一个属于自己的影视库不仅可以满足看番需求,还可以满足BT党做种收藏需求(BT/P2P也可以XD)</p><h1 id="Emby-Server部署"><a href="#Emby-Server部署" class="headerlink" title="Emby Server部署"></a>Emby Server部署</h1><p>有了想法开始搭建,影视库服务器我选用<a href="https://emby.media/">Emby</a>,虽然<a href="https://jellyfin.org/">Jellyfin</a>开源,还是用Emby舒服一些(看个人)</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">docker run -d \</span><br><span class="line"> --net=host \</span><br><span class="line"> -v /*your_config_location*:/config \</span><br><span class="line"> -e TZ=Asia/Shanghai \</span><br><span class="line"> -e HTTP_PROXY=xxx \</span><br><span class="line"> -e HTTPS_RPOXY=xxx \</span><br><span class="line"> -e PUID=1000 \</span><br><span class="line"> -e GUID=1000 \</span><br><span class="line"> --name=emby-server \</span><br><span class="line"> emby/embyserver:latest</span><br></pre></td></tr></table></figure><p>Emby会连上<a href="https://www.themoviedb.org/">TVDB</a>刮削剧集信息,Emby有时候会连不上,最好部署的时候加一个代理</p><p><img src="/../img/sonarr/embyIndex.png" alt="EmbyIndex"></p><p>部署好Emby后我们只需要导入我们喜欢的番剧刮削便可食用了…但这还不够,Emby对于刮削有这严格的命名规范,不符合规范的是不会有封面以及影视信息出现,我们可以选择手动刮削神器<a href="https://www.tinymediamanager.org/">tMM</a>刮削,刮好后导入Emby即可,这种方式准确且无误,但是缺点是每次都要手动导入很麻烦,达不到预期自动化的需求,所以要用Sonarr代替tMM解决手动命名的问题。</p><p>导入前先创建影视库</p><p><img src="/../img/sonarr/newDB.png" alt="newDB"></p><p>文件夹选择你想要存放的影视库位置</p><h1 id="Sonarr部署"><a href="#Sonarr部署" class="headerlink" title="Sonarr部署"></a>Sonarr部署</h1><p><a href="https://sonarr.tv/">Sonarr</a>是一个对接TVDB管理番剧/TV剧集信息的容器,它可以监控各大种子站的RSS和磁力链接并且转由下载端(qBittorrent)下载并返回给Sonarr,Sonarr会根据TVDB的命名规范对剧集命名,最后Emby检测到正确的命名自动刮削成中文信息,实在是美滋滋,省去了自己手动刮削以及创建文件夹的过程,最重要的是Sonarr是以<code>硬链接</code>的方式创建剧集,意味着可以一边做种一边刮削(BT党狂喜捏)</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">docker run -d \</span><br><span class="line"> -e PUID=1000 \</span><br><span class="line"> -e PGID=1000 \</span><br><span class="line"> -e TZ=Asia/Shanghai \</span><br><span class="line"> -p 8989:8989 \</span><br><span class="line"> -v /path/data:/config \</span><br><span class="line"> -v /data/volName:/volName \</span><br><span class="line"> --name=sonarr \</span><br><span class="line"> --restart unless-stopped \</span><br><span class="line"> linuxserver/sonarr:latest</span><br></pre></td></tr></table></figure><p>部署好运行如下:</p><p><img src="/../img/sonarr/sonarrIndex.png" alt="sonarrIndex"></p><p>先对Sonarr进行一些必要的设置</p><h4 id="Media-Management"><a href="#Media-Management" class="headerlink" title="Media Management"></a>Media Management</h4><p>在此页面开启命名正则表达式,以及在下方的<code>Root Floders</code>映射在Emby下创建的影视库路径</p><p><img src="/../img/sonarr/media.png" alt="media"></p><h4 id="Download-Clients"><a href="#Download-Clients" class="headerlink" title="Download Clients"></a>Download Clients</h4><p>配置一下Sonarr的下载端,这里选用qB,同样docker部署,具体过程不展示了</p><p><img src="/../img/sonarr/qb.png" alt="qB"></p><p>如图所示配置qB的地址以及用户名密码即可对接</p><h4 id="Indexers"><a href="#Indexers" class="headerlink" title="Indexers"></a>Indexers</h4><p>此项是Sonarr最重要的一个配置:为Sonarr添加索引的种子站API。借助API索引指定番剧并解析磁力配合qB使用下载,这里要借助一个索引聚合器<code>Jackett</code></p><h1 id="Jackett部署"><a href="#Jackett部署" class="headerlink" title="Jackett部署"></a>Jackett部署</h1><p><a href="https://github.com/Jackett/Jackett">Jackett</a>是一个种子索引聚合器,集成各大种子站API,配合Sonarr自动搜索也是一个美滋滋的容器捏,可以转换为RSS以及Torznab(Sonarr支持)的格式,后者可以支持主动搜索。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">docker run -d \</span><br><span class="line"> -e PUID=1000 \</span><br><span class="line"> -e PGID=1000 \</span><br><span class="line"> -e TZ=Asia/Shanghai \</span><br><span class="line"> -p 9117:9117 \</span><br><span class="line"> -v /path/data:/config \</span><br><span class="line"> --name=jackett \</span><br><span class="line"> --restart unless-stopped \</span><br><span class="line"> linuxserver/jackett</span><br></pre></td></tr></table></figure><p>部署后运行:</p><p><img src="/../img/sonarr/jackettIndex.png" alt="jackett"></p><p>点击<code>Add Indexer</code>即可添加种子站,如图所示这是我添加的几个种子站,平时看番的话这几个足矣。现在可以将API对接到Sonarr里了,点击<code>Copy Torznab Feed</code>复制Torznab格式(Sonarr支持)到Sonarr</p><p><img src="/../img/sonarr/indexs.png" alt="indexs"></p><p>API Key填写Jackett右上方的Key,选好分类保存即可。</p><h1 id="XArrRss配合Sonarr"><a href="#XArrRss配合Sonarr" class="headerlink" title="XArrRss配合Sonarr"></a>XArrRss配合Sonarr</h1><p>到了这步其实已经实现了全自动追番了,只要在Sonarr添加你想追的番剧,Sonarr会从Indexer添加的种子API中检索番剧磁力链交由qB下载,下载好后Sonarr自动命名硬链接到Emby,Emby检测规范命名自动刮削。</p><p><img src="/../img/sonarr/zhui.png" alt="zhui"></p><p>但..Sonarr在TV/电视剧表现是优异的,在追番检索上有点不尽人意,大部分是可以完美检索匹配,小部分还是因为命名问题无法匹配到相应的番剧磁力链,在此基础上还需要一个辅助容器帮助Sonarr精准的自动检索匹配到番剧磁力,这时<a href="https://xarr.52nyg.com/">XArr-Rss</a>就派上用场了。</p><p>XArrRss其实就是解决了Sonarr无法检索到规范命名的问题[可选项]</p><p><img src="/../img/sonarr/XArr.png" alt="XArr"></p><p>最后生成相应的RSS和Torznab到Sonarr就可以了。</p><h1 id="效果展示"><a href="#效果展示" class="headerlink" title="效果展示"></a>效果展示</h1><p><img src="/../img/sonarr/emby.jpg" alt="emby"></p><p><img src="/../img/sonarr/gua.png" alt="gua"></p><h1 id="数据源推荐"><a href="#数据源推荐" class="headerlink" title="数据源推荐"></a>数据源推荐</h1><table><thead><tr><th>名称</th><th>网址</th><th>代理</th><th>备注</th></tr></thead><tbody><tr><td>蜜柑计划</td><td><a href="https://mikanani.me/">https://mikanani.me/</a></td><td>-</td><td>强推,配合XArr完美</td></tr><tr><td>动漫花园</td><td><a href="https://www.dmhy.org/">https://www.dmhy.org/</a></td><td>需要代理</td><td>-</td></tr><tr><td>萌番组</td><td><a href="https://bangumi.moe/">https://bangumi.moe</a></td><td>-</td><td>对Sonarr很友好</td></tr><tr><td>Nyaa</td><td><a href="https://nyaa.si/">https://nyaa.si/</a></td><td>需要代理</td><td>-</td></tr><tr><td>漫猫动漫</td><td><a href="http://www.comicat.org/">http://www.comicat.org/</a></td><td>需要代理</td><td>-</td></tr></tbody></table>]]></content>
<summary type="html"><p>众所周知B站看番环境越来越苛刻了(港澳除外),国内上线的番剧少之又少且部分番剧还有圣光剪辑和无缝链接,实属破坏看番体验。B站以外的在线看番网站画质起伏特别大,还有很多广告。所以搭建一个属于自己的影视库不仅可以满足看番需求,还可以满足BT党做种收藏需求(BT&#x2F;P2P</summary>
<category term="瞎折腾" scheme="https://blog.xiaohao233.top/tags/%E7%9E%8E%E6%8A%98%E8%85%BE/"/>
</entry>
<entry>
<title>给KVM虚拟机加双翅膀-直通独立显卡</title>
<link href="https://blog.xiaohao233.top/randomtoss/%E7%BB%99KVM%E8%99%9A%E6%8B%9F%E6%9C%BA%E5%8A%A0%E5%8F%8C%E7%BF%85%E8%86%80/"/>
<id>https://blog.xiaohao233.top/randomtoss/%E7%BB%99KVM%E8%99%9A%E6%8B%9F%E6%9C%BA%E5%8A%A0%E5%8F%8C%E7%BF%85%E8%86%80/</id>
<published>2022-06-22T10:17:13.000Z</published>
<updated>2022-06-22T16:54:55.814Z</updated>
<content type="html"><![CDATA[<h1 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h1><p>KVM(Kernel-based Virtual Machine)是一个开源的系统虚拟化模块,选择KVM的原因是因为自己的主力系统的Linux。但是出于不可抗力的原因(臭打游戏的)也不能完全脱离Winwdows,起初笔记本装了双系统,但是来回切换还是太麻烦了,虽然Linux有Wine、Proton等一些兼容层,但是效果还是不尽人意。。</p><p>于是就想在Linux上运行一台Windows虚拟机,但是KVM虚拟机配合QEMU的QXL图形渲染还是达不到(畅玩游戏)要求的=m=。所以要利用KVM PCIe直通功能,让虚拟机独占高性能显卡,直接加载显卡对应的驱动,和显卡直接通信,给它加一双翅膀,拥有和物理机几乎同样的渲染性能。</p><p>环境:</p><p><img src="/../img/neofetch.png" alt="neofetch"></p><p>虚拟机镜像:Windows 10 LTSC 2019</p><p>Host:神舟战神G7-CT7NK</p><p>套件:libvirt + qemu + virt-manager(图形前端)</p><h1 id="查看笔记本架构"><a href="#查看笔记本架构" class="headerlink" title="查看笔记本架构"></a>查看笔记本架构</h1><p>目前主流的笔记本架构是<code>MUXed</code> 和 <code>MUXLess</code></p><p>相比<code>MUXLess</code>来说,<code>MUXed</code>架构的笔记本更容易直通,因为它采用的是核显/独显切换工作方式;<code>MUXLess</code>架构是核显输出,独显渲染</p><p><code>lspci | grep VGA</code>查看架构</p><p>如果独显以 3D Controller 开头,那么属于<code>MUXLess</code></p><p>如果独显以 VGA Controller 开头,并且由于一个VGA核显输出(Intel/AMD),那么属于<code>MUXed</code></p><p><img src="/../img/lspci.png" alt="lspci"></p><h1 id="开启VT-d虚拟化以及IOMMU模块"><a href="#开启VT-d虚拟化以及IOMMU模块" class="headerlink" title="开启VT-d虚拟化以及IOMMU模块"></a>开启VT-d虚拟化以及IOMMU模块</h1><p>BIOS开启VT-d,并在宿主机内核参数添加<code>iommu=on,iommu=pt</code>,其中<code>iommu=pt</code>为了防止不能直通的设备造成错误</p><p><code>dmesg | grep -e DMAR -e IOMMU</code> 验证IOMMU启用有效</p><p><img src="/../img/iommu.png" alt="iommu"></p><h1 id="添加vfio模块屏蔽GPU"><a href="#添加vfio模块屏蔽GPU" class="headerlink" title="添加vfio模块屏蔽GPU"></a>添加vfio模块屏蔽GPU</h1><p>将<code>vfio_pci vfio vfio_iommu_type1 vfio_virqfd</code>添加到initramfs中,重新生成内核并reboot</p><p><strong>确保组有效</strong></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line">shopt -s nullglob</span><br><span class="line">for d in /sys/kernel/iommu_groups/*/devices/*; do </span><br><span class="line"> n=${d#*/iommu_groups/*}; n=${n%%/*}</span><br><span class="line"> printf 'IOMMU Group %s ' "$n"</span><br><span class="line"> lspci -nns "${d##*/}"</span><br><span class="line">done;</span><br></pre></td></tr></table></figure><p><img src="/../img/group.png" alt="iommu_group"></p><p>运行archwiki参考的脚本可以看到group1对应的是本机独显设备</p><p>记录设备id添加到<code>/etc/modprobe.d/vfio.conf</code>中启用vfio-pci驱动隔离GPU</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">options vfio-pci=device-id1,devicd-id2...</span><br></pre></td></tr></table></figure><h1 id="创建虚拟机"><a href="#创建虚拟机" class="headerlink" title="创建虚拟机"></a>创建虚拟机</h1><p>使用virt-manager创建一台虚拟机:<br> - 架构:Q35<br> - 固件:UEFI<br> - CPUs:host-passthrogh<br> - 内存:8192(8G)<br> - 启动盘&数据盘:驱动使用virtio<br> - 网络:NIC/NAT,驱动依然virtio</p><p>默认先用QEMU的QXL渲染,安装好<a href="https://github.com/virtio-win/virtio-win-pkg-scripts">virtio驱动</a></p><h1 id="显卡直通"><a href="#显卡直通" class="headerlink" title="显卡直通"></a>显卡直通</h1><p>先确定一下显卡device-id和vendor-id和PCI总线ID是否一致,大概率是不一致的,终端运行<code>lspci -nnk | egrep -A3 "VGA|3D"</code>检查ID</p><p><img src="/../img/subSystem.png" alt="subSystem"></p><p>如图我的独显的vendor-id是<code>10de</code>,device-id是<code>2191</code>; PCI系统总线的vendor-id是<code>1558</code>,device-id是<code>8550</code></p><p>拿到ID,现在virt-manager直通独显设备,注意要将IOMMU组里的全部设备直通进去</p><p><img src="/../img/addPCIe.png" alt="addPCIe"></p><blockquote><p>由于NVIDIA今年放开了虚拟化限制,提取显卡vbios是一个可选项; 不需要绕过检测</p></blockquote><p>此时如果开机,查看设备管理器会多出一个<code>Microsoft基本显示适配器</code>,说明已经识别到设备了,但是点开一看报了代码<code>31</code>,无法加载驱动,这时候<br>前面记录的PCIe总线id来作用了,在虚拟机xml配置添加如下标签匹配总线ID(注意进制转换)</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">qemu:override</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">qemu:device</span> <span class="attr">alias</span>=<span class="string">"hostdev0"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">qemu:frontend</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">qemu:property</span> <span class="attr">name</span>=<span class="string">"x-pci-sub-vendor-id"</span> <span class="attr">type</span>=<span class="string">"unsigned"</span> <span class="attr">value</span>=<span class="string">"5464"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">qemu:property</span> <span class="attr">name</span>=<span class="string">"x-pci-sub-device-id"</span> <span class="attr">type</span>=<span class="string">"unsigned"</span> <span class="attr">value</span>=<span class="string">"34128"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">qemu:frontend</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">qemu:device</span>></span></span><br><span class="line"><span class="tag"></<span class="name">qemu:override</span>></span></span><br></pre></td></tr></table></figure><p>第一行<code><domain></code>标签配置qemu命名空间<code><domain xmlns:qemu="http://libvirt.org/schemas/domain/qemu/1.0" type="kvm"></code></p><p>如果你的qemu版本低于7.0</p><p>那么用如下配置即可</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">qemu:commandline</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">qemu:arg</span> <span class="attr">value</span>=<span class="string">'-set'</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">qemu:arg</span> <span class="attr">value</span>=<span class="string">'device.hostdev0.x-pci-sub-vendor-id=5464'</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">qemu:arg</span> <span class="attr">value</span>=<span class="string">'-set'</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">qemu:arg</span> <span class="attr">value</span>=<span class="string">'device.hostdev0.x-pci-sub-device-id=34128'</span>/></span></span><br><span class="line"><span class="tag"></<span class="name">qemu:commandline</span>></span></span><br></pre></td></tr></table></figure><p>做完这些重启虚拟机,驱动应该是正常运行,此时算是大功告成,关闭虚拟机,删除QXL和Spice服务器等等等等,直通上鼠标键盘,快乐玩耍。</p><p>直通显卡后,开启虚拟机后要切换独显输出,因为宿主机用的是核显,此时可以选择外接一个显示器,或者利用<code>libvirt hooks</code>钩子函数让独显抢占当前笔记本显示器</p><p>至此显卡基本直通到此结束,还是趟了很多坑的。小小记录一下</p><h1 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h1><ol><li><a href="https://wiki.archlinux.org/title/PCI_passthrough_via_OVMF_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)">ArchWiki - PCI passthrough via OVMF (简体中文)</a></li><li><a href="https://wiki.archlinux.org/title/Intel_GVT-g">ArchWiki - Intel_GVT-g</a></li><li><a href="https://wiki.archlinux.org/title/Libvirt">ArchWiki - Libvirt</a></li><li><a href="https://lantian.pub/article/modify-computer/laptop-intel-nvidia-optimus-passthrough.lantian/">笔记本 Optimus MUXless 下的 Intel 和 NVIDIA 虚拟机显卡直通</a></li><li><a href="https://www.codeplayer.org/Blog/%E5%8F%8C%E6%98%BE%E5%8D%A1%E7%AC%94%E8%AE%B0%E6%9C%AC%E7%8B%AC%E6%98%BE%E7%9B%B4%E9%80%9A.html">双显卡笔记本独显直通</a></li><li><a href="https://github.com/ledisthebest/LEDs-single-gpu-passthrough/blob/main/README-cn.md">ledis 的单显卡直通教程</a></li><li><a href="https://github.com/marcosscriven/ovmf-with-vbios-patch/issues/2">系统总线ID不一致问题</a></li><li><a href="https://mechanical-consciousness.com/2020/03/20/kvm-gpu-passthrough.html">KVM虚拟机GPU直通,step by step</a></li></ol><h1 id="XML完整配置"><a href="#XML完整配置" class="headerlink" title="XML完整配置"></a>XML完整配置</h1><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">domain</span> <span class="attr">xmlns:qemu</span>=<span class="string">"http://libvirt.org/schemas/domain/qemu/1.0"</span> <span class="attr">type</span>=<span class="string">"kvm"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">name</span>></span>win10<span class="tag"></<span class="name">name</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">uuid</span>></span>7c121caf-30db-4a3a-82f6-d59ca87b802f<span class="tag"></<span class="name">uuid</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">metadata</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">libosinfo:libosinfo</span> <span class="attr">xmlns:libosinfo</span>=<span class="string">"http://libosinfo.org/xmlns/libvirt/domain/1.0"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">libosinfo:os</span> <span class="attr">id</span>=<span class="string">"http://microsoft.com/win/10"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">libosinfo:libosinfo</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">metadata</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">memory</span> <span class="attr">unit</span>=<span class="string">"KiB"</span>></span>12582912<span class="tag"></<span class="name">memory</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">currentMemory</span> <span class="attr">unit</span>=<span class="string">"KiB"</span>></span>12582912<span class="tag"></<span class="name">currentMemory</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">vcpu</span> <span class="attr">placement</span>=<span class="string">"static"</span>></span>8<span class="tag"></<span class="name">vcpu</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">os</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">type</span> <span class="attr">arch</span>=<span class="string">"x86_64"</span> <span class="attr">machine</span>=<span class="string">"pc-q35-7.0"</span>></span>hvm<span class="tag"></<span class="name">type</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">loader</span> <span class="attr">readonly</span>=<span class="string">"yes"</span> <span class="attr">type</span>=<span class="string">"pflash"</span>></span>/usr/share/edk2-ovmf/x64/OVMF_CODE.fd<span class="tag"></<span class="name">loader</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">nvram</span>></span>/var/lib/libvirt/qemu/nvram/win10_VARS.fd<span class="tag"></<span class="name">nvram</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">os</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">features</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">acpi</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">apic</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">hyperv</span> <span class="attr">mode</span>=<span class="string">"custom"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">hyperv</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">vmport</span> <span class="attr">state</span>=<span class="string">"off"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">features</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">cpu</span> <span class="attr">mode</span>=<span class="string">"host-passthrough"</span> <span class="attr">check</span>=<span class="string">"none"</span> <span class="attr">migratable</span>=<span class="string">"on"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">topology</span> <span class="attr">sockets</span>=<span class="string">"1"</span> <span class="attr">dies</span>=<span class="string">"1"</span> <span class="attr">cores</span>=<span class="string">"4"</span> <span class="attr">threads</span>=<span class="string">"2"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">cpu</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">clock</span> <span class="attr">offset</span>=<span class="string">"localtime"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">timer</span> <span class="attr">name</span>=<span class="string">"rtc"</span> <span class="attr">tickpolicy</span>=<span class="string">"catchup"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">timer</span> <span class="attr">name</span>=<span class="string">"pit"</span> <span class="attr">tickpolicy</span>=<span class="string">"delay"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">timer</span> <span class="attr">name</span>=<span class="string">"hpet"</span> <span class="attr">present</span>=<span class="string">"no"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">timer</span> <span class="attr">name</span>=<span class="string">"hypervclock"</span> <span class="attr">present</span>=<span class="string">"yes"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">clock</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">on_poweroff</span>></span>destroy<span class="tag"></<span class="name">on_poweroff</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">on_reboot</span>></span>restart<span class="tag"></<span class="name">on_reboot</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">on_crash</span>></span>destroy<span class="tag"></<span class="name">on_crash</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">pm</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">suspend-to-mem</span> <span class="attr">enabled</span>=<span class="string">"no"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">suspend-to-disk</span> <span class="attr">enabled</span>=<span class="string">"no"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">pm</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">devices</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">emulator</span>></span>/usr/bin/qemu-system-x86_64<span class="tag"></<span class="name">emulator</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">disk</span> <span class="attr">type</span>=<span class="string">"file"</span> <span class="attr">device</span>=<span class="string">"disk"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">driver</span> <span class="attr">name</span>=<span class="string">"qemu"</span> <span class="attr">type</span>=<span class="string">"qcow2"</span> <span class="attr">cache</span>=<span class="string">"writeback"</span> <span class="attr">discard</span>=<span class="string">"ignore"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">source</span> <span class="attr">file</span>=<span class="string">"/home/twac/VM/storage/win10.qcow2"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">target</span> <span class="attr">dev</span>=<span class="string">"vda"</span> <span class="attr">bus</span>=<span class="string">"virtio"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">boot</span> <span class="attr">order</span>=<span class="string">"1"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x04"</span> <span class="attr">slot</span>=<span class="string">"0x00"</span> <span class="attr">function</span>=<span class="string">"0x0"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">disk</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">disk</span> <span class="attr">type</span>=<span class="string">"file"</span> <span class="attr">device</span>=<span class="string">"disk"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">driver</span> <span class="attr">name</span>=<span class="string">"qemu"</span> <span class="attr">type</span>=<span class="string">"qcow2"</span> <span class="attr">cache</span>=<span class="string">"writeback"</span> <span class="attr">discard</span>=<span class="string">"ignore"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">source</span> <span class="attr">file</span>=<span class="string">"/home/twac/VM/storage/DATA.qcow2"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">target</span> <span class="attr">dev</span>=<span class="string">"vdb"</span> <span class="attr">bus</span>=<span class="string">"virtio"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x0a"</span> <span class="attr">slot</span>=<span class="string">"0x00"</span> <span class="attr">function</span>=<span class="string">"0x0"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">disk</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">disk</span> <span class="attr">type</span>=<span class="string">"file"</span> <span class="attr">device</span>=<span class="string">"cdrom"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">driver</span> <span class="attr">name</span>=<span class="string">"qemu"</span> <span class="attr">type</span>=<span class="string">"raw"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">source</span> <span class="attr">file</span>=<span class="string">"/home/twac/VM/ISO/Win10_21H2_Chinese(Simplified)_x64.iso"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">target</span> <span class="attr">dev</span>=<span class="string">"sdb"</span> <span class="attr">bus</span>=<span class="string">"sata"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">readonly</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">boot</span> <span class="attr">order</span>=<span class="string">"2"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"drive"</span> <span class="attr">controller</span>=<span class="string">"0"</span> <span class="attr">bus</span>=<span class="string">"0"</span> <span class="attr">target</span>=<span class="string">"0"</span> <span class="attr">unit</span>=<span class="string">"1"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">disk</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">disk</span> <span class="attr">type</span>=<span class="string">"file"</span> <span class="attr">device</span>=<span class="string">"cdrom"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">driver</span> <span class="attr">name</span>=<span class="string">"qemu"</span> <span class="attr">type</span>=<span class="string">"raw"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">source</span> <span class="attr">file</span>=<span class="string">"/home/twac/VM/ISO/virtio-win-0.1.208.iso"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">target</span> <span class="attr">dev</span>=<span class="string">"sdc"</span> <span class="attr">bus</span>=<span class="string">"sata"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">readonly</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"drive"</span> <span class="attr">controller</span>=<span class="string">"0"</span> <span class="attr">bus</span>=<span class="string">"0"</span> <span class="attr">target</span>=<span class="string">"0"</span> <span class="attr">unit</span>=<span class="string">"2"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">disk</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">controller</span> <span class="attr">type</span>=<span class="string">"usb"</span> <span class="attr">index</span>=<span class="string">"0"</span> <span class="attr">model</span>=<span class="string">"qemu-xhci"</span> <span class="attr">ports</span>=<span class="string">"15"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x02"</span> <span class="attr">slot</span>=<span class="string">"0x00"</span> <span class="attr">function</span>=<span class="string">"0x0"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">controller</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">controller</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">index</span>=<span class="string">"0"</span> <span class="attr">model</span>=<span class="string">"pcie-root"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">controller</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">index</span>=<span class="string">"1"</span> <span class="attr">model</span>=<span class="string">"pcie-root-port"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">model</span> <span class="attr">name</span>=<span class="string">"pcie-root-port"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">target</span> <span class="attr">chassis</span>=<span class="string">"1"</span> <span class="attr">port</span>=<span class="string">"0x10"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x00"</span> <span class="attr">slot</span>=<span class="string">"0x02"</span> <span class="attr">function</span>=<span class="string">"0x0"</span> <span class="attr">multifunction</span>=<span class="string">"on"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">controller</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">controller</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">index</span>=<span class="string">"2"</span> <span class="attr">model</span>=<span class="string">"pcie-root-port"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">model</span> <span class="attr">name</span>=<span class="string">"pcie-root-port"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">target</span> <span class="attr">chassis</span>=<span class="string">"2"</span> <span class="attr">port</span>=<span class="string">"0x11"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x00"</span> <span class="attr">slot</span>=<span class="string">"0x02"</span> <span class="attr">function</span>=<span class="string">"0x1"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">controller</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">controller</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">index</span>=<span class="string">"3"</span> <span class="attr">model</span>=<span class="string">"pcie-root-port"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">model</span> <span class="attr">name</span>=<span class="string">"pcie-root-port"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">target</span> <span class="attr">chassis</span>=<span class="string">"3"</span> <span class="attr">port</span>=<span class="string">"0x12"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x00"</span> <span class="attr">slot</span>=<span class="string">"0x02"</span> <span class="attr">function</span>=<span class="string">"0x2"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">controller</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">controller</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">index</span>=<span class="string">"4"</span> <span class="attr">model</span>=<span class="string">"pcie-root-port"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">model</span> <span class="attr">name</span>=<span class="string">"pcie-root-port"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">target</span> <span class="attr">chassis</span>=<span class="string">"4"</span> <span class="attr">port</span>=<span class="string">"0x13"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x00"</span> <span class="attr">slot</span>=<span class="string">"0x02"</span> <span class="attr">function</span>=<span class="string">"0x3"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">controller</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">controller</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">index</span>=<span class="string">"5"</span> <span class="attr">model</span>=<span class="string">"pcie-root-port"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">model</span> <span class="attr">name</span>=<span class="string">"pcie-root-port"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">target</span> <span class="attr">chassis</span>=<span class="string">"5"</span> <span class="attr">port</span>=<span class="string">"0x14"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x00"</span> <span class="attr">slot</span>=<span class="string">"0x02"</span> <span class="attr">function</span>=<span class="string">"0x4"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">controller</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">controller</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">index</span>=<span class="string">"6"</span> <span class="attr">model</span>=<span class="string">"pcie-root-port"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">model</span> <span class="attr">name</span>=<span class="string">"pcie-root-port"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">target</span> <span class="attr">chassis</span>=<span class="string">"6"</span> <span class="attr">port</span>=<span class="string">"0x15"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x00"</span> <span class="attr">slot</span>=<span class="string">"0x02"</span> <span class="attr">function</span>=<span class="string">"0x5"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">controller</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">controller</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">index</span>=<span class="string">"7"</span> <span class="attr">model</span>=<span class="string">"pcie-root-port"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">model</span> <span class="attr">name</span>=<span class="string">"pcie-root-port"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">target</span> <span class="attr">chassis</span>=<span class="string">"7"</span> <span class="attr">port</span>=<span class="string">"0x16"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x00"</span> <span class="attr">slot</span>=<span class="string">"0x02"</span> <span class="attr">function</span>=<span class="string">"0x6"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">controller</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">controller</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">index</span>=<span class="string">"8"</span> <span class="attr">model</span>=<span class="string">"pcie-root-port"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">model</span> <span class="attr">name</span>=<span class="string">"pcie-root-port"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">target</span> <span class="attr">chassis</span>=<span class="string">"8"</span> <span class="attr">port</span>=<span class="string">"0x17"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x00"</span> <span class="attr">slot</span>=<span class="string">"0x02"</span> <span class="attr">function</span>=<span class="string">"0x7"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">controller</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">controller</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">index</span>=<span class="string">"9"</span> <span class="attr">model</span>=<span class="string">"pcie-root-port"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">model</span> <span class="attr">name</span>=<span class="string">"pcie-root-port"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">target</span> <span class="attr">chassis</span>=<span class="string">"9"</span> <span class="attr">port</span>=<span class="string">"0x18"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x00"</span> <span class="attr">slot</span>=<span class="string">"0x03"</span> <span class="attr">function</span>=<span class="string">"0x0"</span> <span class="attr">multifunction</span>=<span class="string">"on"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">controller</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">controller</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">index</span>=<span class="string">"10"</span> <span class="attr">model</span>=<span class="string">"pcie-root-port"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">model</span> <span class="attr">name</span>=<span class="string">"pcie-root-port"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">target</span> <span class="attr">chassis</span>=<span class="string">"10"</span> <span class="attr">port</span>=<span class="string">"0x19"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x00"</span> <span class="attr">slot</span>=<span class="string">"0x03"</span> <span class="attr">function</span>=<span class="string">"0x1"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">controller</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">controller</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">index</span>=<span class="string">"11"</span> <span class="attr">model</span>=<span class="string">"pcie-root-port"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">model</span> <span class="attr">name</span>=<span class="string">"pcie-root-port"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">target</span> <span class="attr">chassis</span>=<span class="string">"11"</span> <span class="attr">port</span>=<span class="string">"0x1a"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x00"</span> <span class="attr">slot</span>=<span class="string">"0x03"</span> <span class="attr">function</span>=<span class="string">"0x2"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">controller</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">controller</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">index</span>=<span class="string">"12"</span> <span class="attr">model</span>=<span class="string">"pcie-root-port"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">model</span> <span class="attr">name</span>=<span class="string">"pcie-root-port"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">target</span> <span class="attr">chassis</span>=<span class="string">"12"</span> <span class="attr">port</span>=<span class="string">"0x1b"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x00"</span> <span class="attr">slot</span>=<span class="string">"0x03"</span> <span class="attr">function</span>=<span class="string">"0x3"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">controller</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">controller</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">index</span>=<span class="string">"13"</span> <span class="attr">model</span>=<span class="string">"pcie-root-port"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">model</span> <span class="attr">name</span>=<span class="string">"pcie-root-port"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">target</span> <span class="attr">chassis</span>=<span class="string">"13"</span> <span class="attr">port</span>=<span class="string">"0x1c"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x00"</span> <span class="attr">slot</span>=<span class="string">"0x03"</span> <span class="attr">function</span>=<span class="string">"0x4"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">controller</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">controller</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">index</span>=<span class="string">"14"</span> <span class="attr">model</span>=<span class="string">"pcie-root-port"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">model</span> <span class="attr">name</span>=<span class="string">"pcie-root-port"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">target</span> <span class="attr">chassis</span>=<span class="string">"14"</span> <span class="attr">port</span>=<span class="string">"0x1d"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x00"</span> <span class="attr">slot</span>=<span class="string">"0x03"</span> <span class="attr">function</span>=<span class="string">"0x5"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">controller</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">controller</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">index</span>=<span class="string">"15"</span> <span class="attr">model</span>=<span class="string">"pcie-root-port"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">model</span> <span class="attr">name</span>=<span class="string">"pcie-root-port"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">target</span> <span class="attr">chassis</span>=<span class="string">"15"</span> <span class="attr">port</span>=<span class="string">"0x8"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x00"</span> <span class="attr">slot</span>=<span class="string">"0x01"</span> <span class="attr">function</span>=<span class="string">"0x0"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">controller</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">controller</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">index</span>=<span class="string">"16"</span> <span class="attr">model</span>=<span class="string">"pcie-to-pci-bridge"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">model</span> <span class="attr">name</span>=<span class="string">"pcie-pci-bridge"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x0b"</span> <span class="attr">slot</span>=<span class="string">"0x00"</span> <span class="attr">function</span>=<span class="string">"0x0"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">controller</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">controller</span> <span class="attr">type</span>=<span class="string">"sata"</span> <span class="attr">index</span>=<span class="string">"0"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x00"</span> <span class="attr">slot</span>=<span class="string">"0x1f"</span> <span class="attr">function</span>=<span class="string">"0x2"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">controller</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">controller</span> <span class="attr">type</span>=<span class="string">"virtio-serial"</span> <span class="attr">index</span>=<span class="string">"0"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x03"</span> <span class="attr">slot</span>=<span class="string">"0x00"</span> <span class="attr">function</span>=<span class="string">"0x0"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">controller</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">interface</span> <span class="attr">type</span>=<span class="string">"network"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">mac</span> <span class="attr">address</span>=<span class="string">"52:54:00:98:77:e9"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">source</span> <span class="attr">network</span>=<span class="string">"default"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">model</span> <span class="attr">type</span>=<span class="string">"virtio"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x0c"</span> <span class="attr">slot</span>=<span class="string">"0x00"</span> <span class="attr">function</span>=<span class="string">"0x0"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">interface</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"mouse"</span> <span class="attr">bus</span>=<span class="string">"ps2"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"keyboard"</span> <span class="attr">bus</span>=<span class="string">"ps2"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">sound</span> <span class="attr">model</span>=<span class="string">"ich6"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x10"</span> <span class="attr">slot</span>=<span class="string">"0x01"</span> <span class="attr">function</span>=<span class="string">"0x0"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">sound</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">audio</span> <span class="attr">id</span>=<span class="string">"1"</span> <span class="attr">type</span>=<span class="string">"none"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">hostdev</span> <span class="attr">mode</span>=<span class="string">"subsystem"</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">managed</span>=<span class="string">"yes"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">driver</span> <span class="attr">name</span>=<span class="string">"vfio"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">source</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x01"</span> <span class="attr">slot</span>=<span class="string">"0x00"</span> <span class="attr">function</span>=<span class="string">"0x0"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">source</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">rom</span> <span class="attr">bar</span>=<span class="string">"on"</span> <span class="attr">file</span>=<span class="string">"/var/tmp/1660ti.rom"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x06"</span> <span class="attr">slot</span>=<span class="string">"0x00"</span> <span class="attr">function</span>=<span class="string">"0x0"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">hostdev</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">hostdev</span> <span class="attr">mode</span>=<span class="string">"subsystem"</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">managed</span>=<span class="string">"yes"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">source</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x01"</span> <span class="attr">slot</span>=<span class="string">"0x00"</span> <span class="attr">function</span>=<span class="string">"0x1"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">source</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">rom</span> <span class="attr">bar</span>=<span class="string">"on"</span> <span class="attr">file</span>=<span class="string">"/var/tmp/1660ti.rom"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x07"</span> <span class="attr">slot</span>=<span class="string">"0x00"</span> <span class="attr">function</span>=<span class="string">"0x0"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">hostdev</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">hostdev</span> <span class="attr">mode</span>=<span class="string">"subsystem"</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">managed</span>=<span class="string">"yes"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">source</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x01"</span> <span class="attr">slot</span>=<span class="string">"0x00"</span> <span class="attr">function</span>=<span class="string">"0x2"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">source</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">rom</span> <span class="attr">bar</span>=<span class="string">"on"</span> <span class="attr">file</span>=<span class="string">"/var/tmp/1660ti.rom"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x08"</span> <span class="attr">slot</span>=<span class="string">"0x00"</span> <span class="attr">function</span>=<span class="string">"0x0"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">hostdev</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">hostdev</span> <span class="attr">mode</span>=<span class="string">"subsystem"</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">managed</span>=<span class="string">"yes"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">source</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x01"</span> <span class="attr">slot</span>=<span class="string">"0x00"</span> <span class="attr">function</span>=<span class="string">"0x3"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">source</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">rom</span> <span class="attr">bar</span>=<span class="string">"on"</span> <span class="attr">file</span>=<span class="string">"/var/tmp/1660ti.rom"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x09"</span> <span class="attr">slot</span>=<span class="string">"0x00"</span> <span class="attr">function</span>=<span class="string">"0x0"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">hostdev</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">hostdev</span> <span class="attr">mode</span>=<span class="string">"subsystem"</span> <span class="attr">type</span>=<span class="string">"usb"</span> <span class="attr">managed</span>=<span class="string">"yes"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">source</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">vendor</span> <span class="attr">id</span>=<span class="string">"0x046d"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">product</span> <span class="attr">id</span>=<span class="string">"0xc332"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">source</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"usb"</span> <span class="attr">bus</span>=<span class="string">"0"</span> <span class="attr">port</span>=<span class="string">"1"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">hostdev</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">hostdev</span> <span class="attr">mode</span>=<span class="string">"subsystem"</span> <span class="attr">type</span>=<span class="string">"usb"</span> <span class="attr">managed</span>=<span class="string">"yes"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">source</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">vendor</span> <span class="attr">id</span>=<span class="string">"0x05ac"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">product</span> <span class="attr">id</span>=<span class="string">"0x024f"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">source</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"usb"</span> <span class="attr">bus</span>=<span class="string">"0"</span> <span class="attr">port</span>=<span class="string">"2"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">hostdev</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">hostdev</span> <span class="attr">mode</span>=<span class="string">"subsystem"</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">managed</span>=<span class="string">"yes"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">source</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x00"</span> <span class="attr">slot</span>=<span class="string">"0x1f"</span> <span class="attr">function</span>=<span class="string">"0x0"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">source</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x10"</span> <span class="attr">slot</span>=<span class="string">"0x02"</span> <span class="attr">function</span>=<span class="string">"0x0"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">hostdev</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">hostdev</span> <span class="attr">mode</span>=<span class="string">"subsystem"</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">managed</span>=<span class="string">"yes"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">source</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x00"</span> <span class="attr">slot</span>=<span class="string">"0x1f"</span> <span class="attr">function</span>=<span class="string">"0x3"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">source</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x10"</span> <span class="attr">slot</span>=<span class="string">"0x03"</span> <span class="attr">function</span>=<span class="string">"0x0"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">hostdev</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">hostdev</span> <span class="attr">mode</span>=<span class="string">"subsystem"</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">managed</span>=<span class="string">"yes"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">source</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x00"</span> <span class="attr">slot</span>=<span class="string">"0x1f"</span> <span class="attr">function</span>=<span class="string">"0x4"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">source</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x10"</span> <span class="attr">slot</span>=<span class="string">"0x04"</span> <span class="attr">function</span>=<span class="string">"0x0"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">hostdev</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">hostdev</span> <span class="attr">mode</span>=<span class="string">"subsystem"</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">managed</span>=<span class="string">"yes"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">source</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x00"</span> <span class="attr">slot</span>=<span class="string">"0x1f"</span> <span class="attr">function</span>=<span class="string">"0x5"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">source</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x10"</span> <span class="attr">slot</span>=<span class="string">"0x05"</span> <span class="attr">function</span>=<span class="string">"0x0"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">hostdev</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">memballoon</span> <span class="attr">model</span>=<span class="string">"virtio"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">address</span> <span class="attr">type</span>=<span class="string">"pci"</span> <span class="attr">domain</span>=<span class="string">"0x0000"</span> <span class="attr">bus</span>=<span class="string">"0x05"</span> <span class="attr">slot</span>=<span class="string">"0x00"</span> <span class="attr">function</span>=<span class="string">"0x0"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">memballoon</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">devices</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">qemu:override</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">qemu:device</span> <span class="attr">alias</span>=<span class="string">"hostdev0"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">qemu:frontend</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">qemu:property</span> <span class="attr">name</span>=<span class="string">"x-pci-sub-vendor-id"</span> <span class="attr">type</span>=<span class="string">"unsigned"</span> <span class="attr">value</span>=<span class="string">"5464"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">qemu:property</span> <span class="attr">name</span>=<span class="string">"x-pci-sub-device-id"</span> <span class="attr">type</span>=<span class="string">"unsigned"</span> <span class="attr">value</span>=<span class="string">"34128"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">qemu:frontend</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">qemu:device</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">qemu:override</span>></span></span><br><span class="line"><span class="tag"></<span class="name">domain</span>></span></span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><h1 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h1><p>KVM(Kernel-based Virtual Machine)是一个开源的系统虚拟化模块,选择KVM的原因是因为自己的主力系统的Linu</summary>
<category term="瞎折腾" scheme="https://blog.xiaohao233.top/randomtoss/"/>
<category term="Linux" scheme="https://blog.xiaohao233.top/tags/Linux/"/>
<category term="KVM" scheme="https://blog.xiaohao233.top/tags/KVM/"/>
</entry>
<entry>
<title>第十三届蓝桥杯复盘</title>
<link href="https://blog.xiaohao233.top/lanqiao/%E7%AC%AC%E5%8D%81%E4%B8%89%E5%B1%8A%E8%93%9D%E6%A1%A5%E6%9D%AF%E5%A4%8D%E7%9B%98/"/>
<id>https://blog.xiaohao233.top/lanqiao/%E7%AC%AC%E5%8D%81%E4%B8%89%E5%B1%8A%E8%93%9D%E6%A1%A5%E6%9D%AF%E5%A4%8D%E7%9B%98/</id>
<published>2022-06-08T16:22:39.000Z</published>
<updated>2022-06-09T07:21:32.753Z</updated>
<content type="html"><![CDATA[<p>参加了第十三届蓝桥杯JavaB组省赛,感觉还是很多题粗心错了。。坑坑挺多的。今年只有两道填空题,难度也稍微上来了。</p><h2 id="试题A-星期计算"><a href="#试题A-星期计算" class="headerlink" title="试题A:星期计算"></a>试题A:星期计算</h2><p>问题描述:</p><p>已知今天是星期六,请问 2022 天后是星期几?<br>注意用数字 1 到 7 表示星期一到星期日。</p><p>思路:直接求出值然后对7取余加1即可</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.math.BigInteger;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Solution</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">BigInteger</span> <span class="variable">n</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BigInteger</span>(<span class="string">"20"</span>);</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">1</span>; i <= <span class="number">22</span>; i++) {</span><br><span class="line"> n = n.multiply(<span class="keyword">new</span> <span class="title class_">BigInteger</span>(<span class="string">"20"</span>));</span><br><span class="line"> }</span><br><span class="line"> System.out.println(n.remainder(<span class="keyword">new</span> <span class="title class_">BigInteger</span>(<span class="string">"7"</span>)).add(<span class="keyword">new</span> <span class="title class_">BigInteger</span>(<span class="string">"1"</span>)));</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>输出: <code>7</code></p><h2 id="试题B-山"><a href="#试题B-山" class="headerlink" title="试题B:山"></a>试题B:山</h2><p>问题描述:</p><p>这天小明正在学数数。<br>他突然发现有些正整数的形状像一座“山”,比如 123565321、145541,它<br>们左右对称(回文)且数位上的数字先单调不减,后单调不增。<br>小明数了很久也没有数完,他想让你告诉他在区间 [2022, 2022222022] 中有<br>多少个数的形状像一座“山”。</p><p>这道题做的时候非常的粗心,抓住条件<code>先单调不减,后单调不增</code>,忽略了连续相等的数</p><p>思路:利用<code>先单调不减,后单调不增</code>这个条件进行判断,如果某数位的值大于相邻数位的值则不符合<code>单调不减</code>的条件,后面则相同</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Solution</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">int</span> <span class="variable">count</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">2022</span>; i <= <span class="number">2022222022</span>; i++) {</span><br><span class="line"> <span class="keyword">if</span> (check(i)) {</span><br><span class="line"> count++;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> System.out.println(count);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="type">boolean</span> <span class="title function_">check</span><span class="params">(<span class="type">int</span> i)</span> {</span><br><span class="line"> <span class="type">char</span>[] chars = String.valueOf(i).toCharArray();</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">k</span> <span class="operator">=</span> <span class="number">0</span>; k < chars.length / <span class="number">2</span>; k++) {</span><br><span class="line"> <span class="keyword">if</span> (chars[k] > chars[k + <span class="number">1</span>]) {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (chars[k] != chars[chars.length - <span class="number">1</span> - k]) {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>输出: <code>3138</code></p><h2 id="试题C-字符统计"><a href="#试题C-字符统计" class="headerlink" title="试题C:字符统计"></a>试题C:字符统计</h2><p>问题描述:</p><p>给定一个只包含大写字母的字符串 S,请你输出其中出现次数最多的字母。<br>如果有多个字母均出现了最多次,按字母表顺序依次输出所有这些字母。</p><p>输入格式:一个只包含大写字母的字符串S</p><p>样例输入:<code>BABBACAC</code></p><p>样例输出:<code>AB</code></p><p>思路:这道题一开始是想用<code>map</code>去统计然后遍历求出最大值在比对字典序,写到一半发现根本不用这么麻烦,既然是字典序,那就直接new一个数组去存字符的ASCII码,根据题目全大写字母,已知<code>A</code>的ASCII是65, 将字母的ASCII减去<code>A</code>存入数组然后遍历最大值即可。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.Scanner;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Solution</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">Scanner</span> <span class="variable">sc</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in);</span><br><span class="line"> <span class="type">String</span> <span class="variable">str</span> <span class="operator">=</span> sc.next();</span><br><span class="line"> <span class="type">int</span>[] alphabet = <span class="keyword">new</span> <span class="title class_">int</span>[<span class="number">26</span>];</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < str.length(); i++) {</span><br><span class="line"> alphabet[str.charAt(i) - <span class="number">65</span>]++;</span><br><span class="line"> }</span><br><span class="line"> <span class="type">int</span> <span class="variable">max</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> frequency : alphabet) {</span><br><span class="line"> <span class="keyword">if</span> (frequency > max) {</span><br><span class="line"> max = frequency;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < alphabet.length; i++) {</span><br><span class="line"> <span class="keyword">if</span> (alphabet[i] == max) {</span><br><span class="line"> System.out.print((<span class="type">char</span>) (i + <span class="number">65</span>));</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="试题D-最少刷题数"><a href="#试题D-最少刷题数" class="headerlink" title="试题D:最少刷题数"></a>试题D:最少刷题数</h2><p>问题描述:</p><p>小蓝老师教的编程课有 N 名学生,编号依次是 1 . . . N。第 i 号学生这学期<br>刷题的数量是 Ai。<br>对于每一名学生,请你计算他至少还要再刷多少道题,才能使得全班刷题<br>比他多的学生数不超过刷题比他少的学生数。</p><p>样例输入:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">5</span><br><span class="line">12 10 15 20 6</span><br></pre></td></tr></table></figure><p>样例输出:<code>0 3 0 0 7</code></p><p>思路:</p><p>这里要利用中位数,条件是<code>比他多的学生数 <= 比他少的学生数</code>,那么我们可以利用中位数,求每个数离中位数差多少位,设中位数为<code>midVal</code>,比<code>midVal</code>大的数自然符合条件,如果比<code>midVal</code>小的数则需要刷到<code>midVal + 1</code>,但这里还要考虑一个奇偶的问题,以<code>midVal</code>为标准,统计两边的刷题数目<code>leftNum</code>和<code>rightNum</code></p><p><strong>1.奇数情况</strong></p><p>leftNum >= rightNum且刷题数等于<code>midVal</code>,则不需要刷题</p><p><strong>1.偶数情况</strong></p><p>偶数只需要刷到和中位数相等即可</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"><span class="keyword">import</span> java.util.Scanner;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Solution</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">Scanner</span> <span class="variable">sc</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in);</span><br><span class="line"> <span class="type">int</span> <span class="variable">n</span> <span class="operator">=</span> sc.nextInt();</span><br><span class="line"> <span class="type">int</span>[] arr = <span class="keyword">new</span> <span class="title class_">int</span>[n];</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < n; i++) {</span><br><span class="line"> arr[i] = sc.nextInt();</span><br><span class="line"> }</span><br><span class="line"> <span class="type">int</span>[] copyArr = Arrays.copyOfRange(arr, <span class="number">0</span>, arr.length);</span><br><span class="line"> Arrays.sort(copyArr);</span><br><span class="line"> <span class="type">int</span> <span class="variable">midVal</span> <span class="operator">=</span> copyArr[copyArr.length / <span class="number">2</span>];</span><br><span class="line"> <span class="type">int</span> <span class="variable">leftNum</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="type">int</span> <span class="variable">rightNum</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="comment">// 统计中间值两边的权重</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < n; i++) {</span><br><span class="line"> <span class="keyword">if</span> (copyArr[i] < midVal) {</span><br><span class="line"> leftNum++;</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (copyArr[i] > midVal) {</span><br><span class="line"> rightNum++;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="type">StringBuilder</span> <span class="variable">sb</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringBuilder</span>();</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < n; i++) {</span><br><span class="line"> <span class="keyword">if</span> (arr[i] > midVal || (leftNum >= rightNum && arr[i] == midVal)) {</span><br><span class="line"> sb.append(<span class="number">0</span>).append(<span class="string">" "</span>);</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (leftNum < rightNum || (arr[i] != midVal && leftNum == rightNum)) {</span><br><span class="line"> sb.append(midVal + <span class="number">1</span> - arr[i]).append(<span class="string">" "</span>);</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"> sb.append(midVal - arr[i]).append(<span class="string">" "</span>); <span class="comment">//偶数</span></span><br><span class="line"> }</span><br><span class="line"> System.out.println(sb.toString());</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="试题E-求阶乘"><a href="#试题E-求阶乘" class="headerlink" title="试题E:求阶乘"></a>试题E:求阶乘</h2><p>问题描述:</p><p>满足 N! 的末尾恰好有 K 个 0 的最小的 N 是多少?<br>如果这样的 N 不存在输出 −1。</p><p>样例输入:<code>2</code></p><p>样例输出:<code>10</code></p><p>当时直接暴力过例子了,30%没问题,要知道阶乘的增幅是很恐怖的,暴力是过不了全部例子,复盘才发现数学的神奇之处 <code>数学很重要(确信)</code></p><p>思路:</p><p>排除暴力算法,从数学的角度看问题,既然题目要求尾数0的个数,那么我们可以联想一下<code>0</code>是从何而来?肯定是有因子相乘等于10产生<code>0</code>,也就是<br><code>10 = 2 * 5</code></p><p>再看阶乘,比如<code>10!</code>,但凡是偶数肯定能分出因子2,所以因子2肯定会比5多,那么问题就可以转化成<code>有几个5,就有几个0出现</code>,这样问题就简单起来了,<code>10!</code>中,10可以提供一个5,5本身是一个,那么就有两个,也就是说<code>10!</code>末尾有两个0</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Solution</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">Scanner</span> <span class="variable">sc</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in);</span><br><span class="line"> <span class="type">long</span> <span class="variable">k</span> <span class="operator">=</span> sc.nextLong();</span><br><span class="line"> <span class="type">long</span> <span class="variable">pre</span> <span class="operator">=</span> k * <span class="number">5</span>;</span><br><span class="line"> <span class="keyword">while</span> (pre - <span class="number">5</span> >= <span class="number">5</span> && process(pre - <span class="number">5</span>) >= k) {</span><br><span class="line"> pre -= <span class="number">5</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (process(pre) == k) {</span><br><span class="line"> System.out.println(pre);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> System.out.println(-<span class="number">1</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="type">long</span> <span class="title function_">process</span><span class="params">(<span class="type">long</span> l)</span> {</span><br><span class="line"> <span class="type">int</span> <span class="variable">res</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">while</span> (l >= <span class="number">5</span>) {</span><br><span class="line"> res += (l / <span class="number">5</span>);</span><br><span class="line"> l /= <span class="number">5</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> res;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="试题F-最大子矩阵"><a href="#试题F-最大子矩阵" class="headerlink" title="试题F:最大子矩阵"></a>试题F:最大子矩阵</h2><p>问题描述:</p><p>小明有一个大小为 N × M 的矩阵,可以理解为一个 N 行 M 列的二维数组。<br>我们定义一个矩阵 m 的稳定度 f(m) 为 f(m) = max(m) − min(m),其中 max(m)<br>表示矩阵 m 中的最大值,min(m) 表示矩阵 m 中的最小值。现在小明想要从这<br>个矩阵中找到一个稳定度不大于 limit 的子矩阵,同时他还希望这个子矩阵的面<br>积越大越好(面积可以理解为矩阵中元素个数)。<br>子矩阵定义如下:从原矩阵中选择一组连续的行和一组连续的列,这些行<br>列交点上的元素组成的矩阵即为一个子矩阵。</p><p>输入格式:</p><p>第一行输入两个整数 N,M,表示矩阵的大小。<br>接下来 N 行,每行输入 M 个整数,表示这个矩阵。<br>最后一行输入一个整数 limit,表示限制</p><p>样例输入:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">3 4</span><br><span class="line">2 0 7 9</span><br><span class="line">0 6 9 7</span><br><span class="line">8 4 6 4</span><br><span class="line">8</span><br></pre></td></tr></table></figure><p>样例输出:<code>6</code></p><p>太难了QAQ 复盘也不会,我是菜菜,不过这道题的原型好像是<code>滑动窗口的单调队列</code>,先挖个坑,往后肯定补上:P</p><h2 id="试题G-数组切分"><a href="#试题G-数组切分" class="headerlink" title="试题G:数组切分"></a>试题G:数组切分</h2><p>问题描述:</p><p>已知一个长度为 N 的数组:A1, A2, A3, …AN 恰好是 1 ∼ N 的一个排列。现<br>在要求你将 A 数组切分成若干个 (最少一个,最多 N 个) 连续的子数组,并且<br>每个子数组中包含的整数恰好可以组成一段连续的自然数。<br>例如对于 A = {1, 3, 2, 4}, 一共有 5 种切分方法:<br>{1}{3}{2}{4}:每个单独的数显然是 (长度为 1 的) 一段连续的自然数。<br>{1}{3, 2}{4}:{3, 2} 包含 2 到 3,是 一段连续的自然数,另外 {1} 和 {4} 显然<br>也是。<br>{1}{3, 2, 4}:{3, 2, 4} 包含 2 到 4,是 一段连续的自然数,另外 {1} 显然也是。<br>{1, 3, 2}{4}:{1, 3, 2} 包含 1 到 3,是 一段连续的自然数,另外 {4} 显然也是。<br>{1, 3, 2, 4}:只有一个子数组,包含 1 到 4,是 一段连续的自然数。</p><p>样例输入:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">4</span><br><span class="line">1 3 2 4</span><br></pre></td></tr></table></figure><p>样例输出:<code>5</code></p><p>思路:</p><p>第一种可以暴力递归,第二种可以用动态规划去解决,暴力递归的话,关键在于连续切有一个规律,只要区间的最大值 - 最小值 + 1 = 区间长度,则可以认为此区间的数字是连续的,然后可以不断的去递归找到全部答案</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.Scanner;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Solution</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">static</span> <span class="type">int</span> n;</span><br><span class="line"> <span class="keyword">static</span> <span class="type">int</span>[] a;</span><br><span class="line"> <span class="keyword">static</span> <span class="type">int</span> <span class="variable">ans</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">static</span> <span class="type">int</span> <span class="variable">mod</span> <span class="operator">=</span> (<span class="type">int</span>) (<span class="number">1e9</span> + <span class="number">7</span>);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">dfs</span><span class="params">(<span class="type">int</span> start)</span> {</span><br><span class="line"> <span class="keyword">if</span> (start >= n) {</span><br><span class="line"> ans++;</span><br><span class="line"> <span class="keyword">if</span> (ans == mod) ans = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="type">int</span> <span class="variable">max</span> <span class="operator">=</span> a[start];</span><br><span class="line"> <span class="type">int</span> <span class="variable">min</span> <span class="operator">=</span> a[start];</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">len</span> <span class="operator">=</span> <span class="number">1</span>; start + len <= n; len++) {</span><br><span class="line"> <span class="keyword">if</span> (max - min + <span class="number">1</span> == len) {</span><br><span class="line"> dfs(start + len);</span><br><span class="line"> }</span><br><span class="line"> max = Math.max(max, a[start + len]);</span><br><span class="line"> min = Math.min(min, a[start + len]);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">Scanner</span> <span class="variable">sc</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in);</span><br><span class="line"> n = sc.nextInt();</span><br><span class="line"> a = <span class="keyword">new</span> <span class="title class_">int</span>[n + <span class="number">1</span>];</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < n; i++) {</span><br><span class="line"> a[i] = sc.nextInt();</span><br><span class="line"> }</span><br><span class="line"> dfs(<span class="number">0</span>);</span><br><span class="line"> System.out.println(ans);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="试题H-回忆迷宫"><a href="#试题H-回忆迷宫" class="headerlink" title="试题H:回忆迷宫"></a>试题H:回忆迷宫</h2><p>问题描述:</p><p>爱丽丝刚从一处地下迷宫中探险归来,你能根据她对于自己行动路径的回<br>忆,帮她画出迷宫地图吗?<br>迷宫地图是基于二维网格的。爱丽丝会告诉你一系列她在迷宫中的移动步<br>骤,每个移动步骤可能是上下左右四个方向中的一种,表示爱丽丝往这个方向<br>走了一格。你需要根据这些移动步骤给出一个迷宫地图,并满足以下条件:<br>1、爱丽丝能在迷宫内的某个空地开始,顺利的走完她回忆的所有移动步<br>骤。<br>2、迷宫内不存在爱丽丝没有走过的空地。<br>3、迷宫是封闭的,即可通过墙分隔迷宫内与迷宫外。任意方向的无穷远处<br>视为迷宫外,所有不与迷宫外联通的空地都视为是迷宫内。(迷宫地图为四联<br>通,即只有上下左右视为联通)<br>4、在满足前面三点的前提下,迷宫的墙的数量要尽可能少。</p><p>思路:暴力qvq</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"><span class="keyword">import</span> java.util.Scanner;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Solution</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">Scanner</span> <span class="variable">sc</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in);</span><br><span class="line"> <span class="type">int</span> <span class="variable">N</span> <span class="operator">=</span> sc.nextInt();</span><br><span class="line"> <span class="type">char</span>[] steps = sc.next().toCharArray();</span><br><span class="line"> <span class="type">char</span>[][] maze = <span class="keyword">new</span> <span class="title class_">char</span>[<span class="number">256</span>][<span class="number">256</span>];</span><br><span class="line"> <span class="comment">//初始化迷宫</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">char</span>[] row : maze) {</span><br><span class="line"> Arrays.fill(row, <span class="string">'*'</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//初始化坐标</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">x</span> <span class="operator">=</span> <span class="number">100</span>, y = <span class="number">100</span>;</span><br><span class="line"> maze[x][y] = <span class="string">' '</span>;</span><br><span class="line"> <span class="type">int</span> <span class="variable">u</span> <span class="operator">=</span> <span class="number">99</span>, d = <span class="number">101</span>, l = <span class="number">99</span>, r = <span class="number">101</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">char</span> step : steps) {</span><br><span class="line"> <span class="keyword">switch</span> (step) {</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'U'</span>:</span><br><span class="line"> x--;</span><br><span class="line"> <span class="keyword">if</span> (u >= x) {</span><br><span class="line"> u = x - <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> maze[x][y] = <span class="string">' '</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'L'</span>:</span><br><span class="line"> y--;</span><br><span class="line"> <span class="keyword">if</span> (l >= y) {</span><br><span class="line"> l = y - <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> maze[x][y] = <span class="string">' '</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'D'</span>:</span><br><span class="line"> x++;</span><br><span class="line"> <span class="keyword">if</span> (d <= x) {</span><br><span class="line"> d = x + <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> maze[x][y] = <span class="string">' '</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'R'</span>:</span><br><span class="line"> y++;</span><br><span class="line"> <span class="keyword">if</span> (r <= y) {</span><br><span class="line"> r = y + <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> maze[x][y] = <span class="string">' '</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//修正边框</span></span><br><span class="line"> maze[u][l] = maze[u][r] = maze[d][l] = maze[d][r] = <span class="string">' '</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> u; i <= d; i++) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> l; j <= r; j++) {</span><br><span class="line"> System.out.print(maze[i][j]);</span><br><span class="line"> }</span><br><span class="line"> System.out.println();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><p>参加了第十三届蓝桥杯JavaB组省赛,感觉还是很多题粗心错了。。坑坑挺多的。今年只有两道填空题,难度也稍微上来了。</p>
<h2 id="试题A-星期计算"><a href="#试题A-星期计算" class="headerlink" title="试题A:星期计算"><</summary>
<category term="蓝桥杯" scheme="https://blog.xiaohao233.top/lanqiao/"/>
<category term="算法" scheme="https://blog.xiaohao233.top/tags/algorithm/"/>
</entry>
<entry>
<title>我所喜欢的Unix哲学</title>
<link href="https://blog.xiaohao233.top/uncategorized/%E6%88%91%E5%96%9C%E6%AC%A2%E7%9A%84Unix%E5%93%B2%E5%AD%A6/"/>
<id>https://blog.xiaohao233.top/uncategorized/%E6%88%91%E5%96%9C%E6%AC%A2%E7%9A%84Unix%E5%93%B2%E5%AD%A6/</id>
<published>2021-11-24T10:14:39.000Z</published>
<updated>2022-11-24T10:21:15.127Z</updated>
<content type="html"><![CDATA[<blockquote><p>摘录我所喜欢的Unix哲学, 保持简单</p></blockquote><p>Unix 哲学起源于 Ken Thompson 早期关于如果设计一个服务接口简洁、小巧精干的操作系统的思考,随着 Unix 文化在学习如何尽可能发掘 Thompon 设计思想的过程中不断成长,同时一路上还从其它许多地方博采众长。</p><p>Unix 设哲学说来不算是一种正规设计方法。它不打算从计算机科学的理论高度来产生理论上完美的软件。那些毫无动力、松松跨跨而且薪水微薄的程序员们,能在短短期限内,如果神灵附体般造出稳定而新颖的软件-–—这只不过是经理人永远的梦呓罢了。</p><p>Unix 哲学(同其它工程领域的民间传统一样)是自下而上的,而不是自上而下的。Unix 哲学注重实效,立足于丰富的经验。你不会在正规方法学和标准中找到它,它更接近于隐性的半本能的知识,即 Unix 文化所传播的专业经验。它鼓励那种分清轻重缓急的感觉,以及怀疑一切的态度,并鼓励你以幽默达观的态度对待这些。</p><hr><p>Unix 管道的发明人、Unix 传统的奠基人之一 Doug Mcllroy 曾经说过:</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">1. 让每个程序就做好一件事。如果有新任务,就重新开始,不要往原程序中加入新功能而搞得复杂。</span><br><span class="line">2. 假定每个程序的输出都会成为另一个程序的输入,哪怕那个程序还是未知的。输出中不要有无关的信息干扰。避免使用严格的分栏格式和二进制格式输入。不要坚持使用交互式输入。</span><br><span class="line">3. 尽可能早地将设计和编译的软件投入试用,哪怕是操作系统也不例外,理想情况下,应该是在几个星期内。对拙劣的代码别犹豫,扔掉重写。</span><br><span class="line">4. 优先使用工具而不是拙劣的帮助来减轻编程任务的负担。工欲善其事,必先利其器。</span><br></pre></td></tr></table></figure><p>Rob Pike, 最伟大的 C 语言大师之一,在《Notes on C Programming》中从另一个稍微不同的角度表述了 Unix 的哲学:</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">原则1 :你无法断定程序会在什么地方耗费运行时间。瓶颈经常出现在想不到的地方。所以别急于胡乱找个地方写代码,除非你已经证实那儿就是瓶颈所在。</span><br><span class="line"></span><br><span class="line">原则2 :估量。在你没对代码进行估量,特别是没找到最耗时的那部分之前,别去优化速度。</span><br><span class="line"></span><br><span class="line">原则3 :花哨的算法在n很小时通常很慢,而n通常很小。花哨算法的常数复杂度很大。除非你确定n总是很大,否则不要去用花哨算法(即使n很大,也优先考虑原则2)。</span><br><span class="line"></span><br><span class="line">原则4 :花哨的算法比简单算法更容易出bug、更难实现。尽量使用简单的算法配合简单的数据结构。</span><br><span class="line"></span><br><span class="line">原则5 :数据压倒一切。如果已经选择了正确的数据结构并且把一切都组织的井井有条,正确的算法也就不言自明。编程的核心是数据结构,而不是算法。</span><br><span class="line"></span><br><span class="line">原则6 :没有原则6。</span><br></pre></td></tr></table></figure><hr><p>Unix 哲学中更多的内容不这些先哲们口头表述出来的,而是由他们所作的一切和 Unix 本身所作出的榜样体现出来的。从整体上来说,可以概括为以下几点:</p><ol><li>模块原则:使用简单的接口拼接简单的部件。</li><li>清晰原则:清晰胜于机巧。</li><li>组合原则:设计时考虑拼接组合。</li><li>分离原则:策略同机制分离,接口同引擎分离。</li><li>简洁原则:设计要简洁,复杂度能低则低。</li><li>吝啬原则:除非确无它法,不要编写庞大的程序。</li><li>透明性原则:设计要可见,以便审查和调试。</li><li>健壮原则:健壮源于透明与简洁。</li><li>表示原则:把知识叠入数据以求逻辑质朴而健壮。</li><li>通俗原则:接口设计避免标新立异。</li><li>缄默原则:如果一个程序没什么好说的,就沉默。</li><li>补救原则:出现异常时,马上退出并给出足够错误信息。</li><li>经济原则:宁花机器一分,不花程序员一秒。</li><li>生成原则:避免手工 hack,尽量编写程序去生成程序。</li><li>优化原则:雕琢前先要有原型,跑之前先学会走。</li><li>多样原则:决不相信所谓“不二法门”的断言。</li><li>扩展原则:设计着眼未来,未来总比预想来得快。</li></ol><p>总之,如果要让所有的 Unix 哲学浓缩为一条铁律,那就是各地编程大师奉为圭皋的“KISS”原则: <strong>Keep It Simple, Stupid!</strong></p>]]></content>
<summary type="html"><blockquote>
<p>摘录我所喜欢的Unix哲学, 保持简单</p>
</blockquote>
<p>Unix 哲学起源于 Ken Thompson 早期关于如果设计一个服务接口简洁、小巧精干的操作系统的思考,随着 Unix 文化在学习如何尽可能发掘 Thompon </summary>
<category term="瞎折腾" scheme="https://blog.xiaohao233.top/tags/%E7%9E%8E%E6%8A%98%E8%85%BE/"/>
</entry>
<entry>
<title>Linux常用命令</title>
<link href="https://blog.xiaohao233.top/backenddev/Linux%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/"/>
<id>https://blog.xiaohao233.top/backenddev/Linux%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</id>
<published>2021-06-29T05:36:04.000Z</published>
<updated>2022-07-10T14:48:04.818Z</updated>
<content type="html"><![CDATA[<h1 id="关机-x2F-重启-x2F-注销"><a href="#关机-x2F-重启-x2F-注销" class="headerlink" title="关机/重启/注销"></a>关机/重启/注销</h1><table><thead><tr><th>常用命令</th><th>作用</th></tr></thead><tbody><tr><td>shutdown -h now</td><td>即刻关机</td></tr><tr><td>shutdown -h 10</td><td>10分钟后关机</td></tr><tr><td>shutdown -h 11:00</td><td>11:00关机</td></tr><tr><td>shutdown -h +10</td><td>预定时间关机(10分钟后)</td></tr><tr><td>shutdown -c</td><td>取消指定时间关机</td></tr><tr><td>shutdown -r now</td><td>重启</td></tr><tr><td>shutdown -r 10</td><td>10分钟之后重启</td></tr><tr><td>shutdown -r 11:00</td><td>定时重启</td></tr><tr><td>reboot</td><td>重启</td></tr><tr><td>init 6</td><td>重启</td></tr><tr><td>init 0</td><td>⽴刻关机</td></tr><tr><td>telinit 0</td><td>关机</td></tr><tr><td>poweroff</td><td>⽴刻关机</td></tr><tr><td>halt</td><td>关机</td></tr><tr><td>sync</td><td>buff数据同步到磁盘</td></tr><tr><td>logout</td><td>退出登录Shell</td></tr></tbody></table><h1 id="系统信息和性能查看"><a href="#系统信息和性能查看" class="headerlink" title="系统信息和性能查看"></a>系统信息和性能查看</h1><table><thead><tr><th>常用命令</th><th>作用</th></tr></thead><tbody><tr><td>uname -a</td><td>查看内核/OS/CPU信息</td></tr><tr><td>uname -r</td><td>查看内核版本</td></tr><tr><td>uname -m</td><td>查看处理器架构</td></tr><tr><td>arch</td><td>查看处理器架构</td></tr><tr><td>hostname</td><td>查看计算机名</td></tr><tr><td>who</td><td>显示当前登录系统的⽤户</td></tr><tr><td>who am i</td><td>显示登录时的⽤户名</td></tr><tr><td>whoami</td><td>显示当前⽤户名</td></tr><tr><td>cat /proc/version</td><td>查看linux版本信息</td></tr><tr><td>cat /proc/cpuinfo</td><td>查看CPU信息</td></tr><tr><td>cat /proc/interrupts</td><td>查看中断</td></tr><tr><td>cat /proc/loadavg</td><td>查看系统负载</td></tr><tr><td>uptime</td><td>查看系统运⾏时间、⽤户数、负载</td></tr><tr><td>env</td><td>查看系统的环境变量</td></tr><tr><td>lsusb -tv</td><td>查看系统USB设备信息</td></tr><tr><td>lspci -tv</td><td>查看系统PCI设备信息</td></tr><tr><td>lsmod</td><td>查看已加载的系统模块</td></tr><tr><td>grep MemTotal /proc/meminfo</td><td>查看内存总量</td></tr><tr><td>grep MemFree /proc/meminfo</td><td>查看空闲内存量</td></tr><tr><td>free -m</td><td>查看内存⽤量和交换区⽤量</td></tr><tr><td>date</td><td>显示系统⽇期时间</td></tr><tr><td>cal 2021</td><td>显示2021⽇历表</td></tr><tr><td>top</td><td>动态显示cpu/内存/进程等情况</td></tr><tr><td>vmstat 1 20</td><td>每1秒采⼀次系统状态,采20次</td></tr><tr><td>iostat</td><td>查看io读写/cpu使⽤情况</td></tr><tr><td>查看io读写/cpu使⽤情况</td><td>查询cpu使⽤情况(1秒⼀次,共10次)</td></tr><tr><td>sar -d 1 10</td><td>查询磁盘性能</td></tr></tbody></table><h1 id="磁盘和分区"><a href="#磁盘和分区" class="headerlink" title="磁盘和分区"></a>磁盘和分区</h1><table><thead><tr><th>常用命令</th><th>作用</th></tr></thead><tbody><tr><td>fdisk -l</td><td>查看所有磁盘分区</td></tr><tr><td>swapon -s</td><td>查看所有交换分区</td></tr><tr><td>df -h</td><td>查看磁盘使⽤情况及挂载点</td></tr><tr><td>df -hl</td><td>同上</td></tr><tr><td>du -sh /dir</td><td>查看指定某个⽬录的⼤⼩</td></tr><tr><td>du -sk * | sort -rn</td><td>从⾼到低依次显示⽂件和⽬录⼤⼩</td></tr><tr><td>mount /dev/hda2 /mnt/hda2</td><td>挂载hda2盘</td></tr><tr><td>mount -t ntfs /dev/sdc1 /mnt/usbhd1</td><td>指定⽂件系统类型挂载(如ntfs)</td></tr><tr><td>mount -o loop xxx.iso /mnt/cdrom</td><td>挂 载 iso ⽂ 件</td></tr><tr><td>umount -v /dev/sda1</td><td>通过设备名卸载</td></tr><tr><td>umount -v /mnt/mymnt</td><td>通过挂载点卸载</td></tr><tr><td>fuser -km /mnt/hda1</td><td>强制卸载(慎⽤)</td></tr></tbody></table><h1 id="用户和用户组"><a href="#用户和用户组" class="headerlink" title="用户和用户组"></a>用户和用户组</h1><table><thead><tr><th>常用命令</th><th>作用</th></tr></thead><tbody><tr><td>useradd twac</td><td>创建⽤户</td></tr><tr><td>userdel -r twac</td><td>删除⽤户</td></tr><tr><td>usermod -g group_name user_name</td><td>修改⽤户的组</td></tr><tr><td>usermod -aG group_name user_name</td><td>将⽤户添加到组</td></tr><tr><td>usermod -s /bin/ksh -d /home/codepig –g dev twac</td><td>修改⽤户twac的登录Shell、主⽬录以及⽤户组</td></tr><tr><td>groups test</td><td>查看test⽤户所在的组</td></tr><tr><td>groupadd group_name</td><td>创建⽤户组</td></tr><tr><td>groupdel group_name</td><td>删除⽤户组</td></tr><tr><td>groupmod -n new_name old_name</td><td>重命名⽤户组</td></tr><tr><td>su - user_name</td><td>su - user_name</td></tr><tr><td>passwd</td><td>修改⼝令</td></tr><tr><td>passwd twac</td><td>修改某⽤户的⼝令</td></tr><tr><td>w</td><td>查看活动⽤户</td></tr><tr><td>id twac</td><td>查看指定⽤户twac信息</td></tr><tr><td>last</td><td>查看⽤户登录⽇志</td></tr><tr><td>crontab -l</td><td>查看当前⽤户的计划任务</td></tr><tr><td>cut -d: -f1 /etc/passwd</td><td>查看系统所有⽤户</td></tr><tr><td>cut -d: -f1 /etc/group</td><td>查看系统所有组</td></tr></tbody></table><h1 id="网络和进程管理"><a href="#网络和进程管理" class="headerlink" title="网络和进程管理"></a>网络和进程管理</h1><table><thead><tr><th>常用命令</th><th>作用</th></tr></thead><tbody><tr><td>ifconfig</td><td>查看⽹络接⼝属性</td></tr><tr><td>ifconfig eth0</td><td>查看某⽹卡的配置</td></tr><tr><td>route -n</td><td>查看路由表</td></tr><tr><td>netstat -lntp</td><td>查看所有监听端⼝</td></tr><tr><td>netstat -antp</td><td>查看已经建⽴的TCP连接</td></tr><tr><td>netstat -lutp</td><td>查看TCP/UDP的状态信息</td></tr><tr><td>ifup eth0</td><td>启⽤eth0⽹络设备</td></tr><tr><td>ifdown eth0</td><td>禁⽤eth0⽹络设备</td></tr><tr><td>iptables -L</td><td>查看iptables规则</td></tr><tr><td>ifconfig eth0 192.168.1.1 netmask 255.255.255.0</td><td>配置ip地址</td></tr><tr><td>dhclient eth0</td><td>以dhcp模式启⽤eth0</td></tr><tr><td>route add -net 0/0 gw Gateway_IP</td><td>配置默认⽹关</td></tr><tr><td>route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1</td><td>配置静态路由到达⽹络’192.168.0.0/16’</td></tr><tr><td>route del 0/0 gw Gateway_IP</td><td>删除静态路由</td></tr><tr><td>hostname</td><td>查看主机名</td></tr><tr><td>host <a href="http://www.baidu.com/">www.baidu.com</a></td><td>解析主机名</td></tr><tr><td>nslookup <a href="http://www.baidu.com/">www.baidu.com</a></td><td>查询DNS记录,查看域名解析是否正常</td></tr><tr><td>ps -ef</td><td>查看所有进程</td></tr><tr><td>ps -ef | grep twac</td><td>过滤出你需要的进程</td></tr><tr><td>kill -s name</td><td>kill指定名称的进程</td></tr><tr><td>kill -s pid</td><td>kill指定pid的进程</td></tr><tr><td>top</td><td>实时显示进程状态</td></tr><tr><td>vmstat 1 20</td><td>每1秒采⼀次系统状态,采20次</td></tr><tr><td>iostat</td><td>iostat</td></tr><tr><td>sar -u 1 10</td><td>查询cpu使⽤情况(1秒⼀次,共10次)</td></tr><tr><td>sar -d 1 10</td><td>查询磁盘性能</td></tr></tbody></table><h1 id="常见系统服务命令"><a href="#常见系统服务命令" class="headerlink" title="常见系统服务命令"></a>常见系统服务命令</h1><table><thead><tr><th>常用命令</th><th>作用</th></tr></thead><tbody><tr><td>chkconfig –list</td><td>列出系统服务</td></tr><tr><td>service <服务名> status</td><td>查看某个服务</td></tr><tr><td>service <服务名> start</td><td>启动某个服务</td></tr><tr><td>service <服务名> stop</td><td>终⽌某个服务</td></tr><tr><td>service <服务名> restart</td><td>重启某个服务</td></tr><tr><td>systemctl status <服务名></td><td>查看某个服务</td></tr><tr><td>systemctl start <服务名></td><td>启动某个服务</td></tr><tr><td>systemctl stop <服务名></td><td>终⽌某个服务</td></tr><tr><td>systemctl restart <服务名></td><td>重启某个服务</td></tr><tr><td>systemctl enable <服务名></td><td>关闭⾃启动</td></tr><tr><td>systemctl disable <服务名></td><td>关闭⾃启动</td></tr></tbody></table><h1 id="文件和目录操作"><a href="#文件和目录操作" class="headerlink" title="文件和目录操作"></a>文件和目录操作</h1><table><thead><tr><th>常用命令</th><th>作用</th></tr></thead><tbody><tr><td>cd <⽬录名></td><td>进⼊某个⽬录</td></tr><tr><td>cd ..</td><td>回上级⽬录</td></tr><tr><td>cd ../..</td><td>回上两级⽬录</td></tr><tr><td>cd</td><td>进个⼈主⽬录</td></tr><tr><td>cd -</td><td>回上⼀步所在⽬录</td></tr><tr><td>pwd</td><td>显示当前路径</td></tr><tr><td>ls</td><td>查看⽂件⽬录列表</td></tr><tr><td>ls -F</td><td>查看⽬录中内容(显示是⽂件还是⽬录)</td></tr><tr><td>ls -l</td><td>查看⽂件和⽬录的详情列表</td></tr><tr><td>ls -a</td><td>查看隐藏⽂件</td></tr><tr><td>ls -lh</td><td>查看⽂件和⽬录的详情列表(增强⽂件⼤⼩易读性)</td></tr><tr><td>ls -lSr</td><td>查看⽂件和⽬录列表(以⽂件⼤⼩升序查看)</td></tr><tr><td>tree</td><td>查看⽂件和⽬录的树形结构</td></tr><tr><td>mkdir <⽬录名></td><td>创建⽬录</td></tr><tr><td>mkdir dir1 dir2</td><td>同时创建两个⽬录</td></tr><tr><td>mkdir -p /tmp/dir1/dir2</td><td>创建⽬录树</td></tr><tr><td>rm -f file1</td><td>删除’file1’⽂件</td></tr><tr><td>rmdir dir1</td><td>删除’dir1’⽬录</td></tr><tr><td>rm -rf dir1</td><td>删除’dir1’⽬录和其内容</td></tr><tr><td>rm -rf dir1 dir2</td><td>同时删除两个⽬录及其内容</td></tr><tr><td>mv old_dir new_dir</td><td>重命名/移动⽬录</td></tr><tr><td>cp file1 file2</td><td>复制⽂件</td></tr><tr><td>cp dir/* .</td><td>复制某⽬录下的所有⽂件⾄当前⽬录</td></tr><tr><td>cp -a dir1 dir2</td><td>复制⽬录</td></tr><tr><td>cp -a /tmp/dir1 .</td><td>复制⼀个⽬录⾄当前⽬录</td></tr><tr><td>ln -s file1 link1</td><td>创建指向⽂件/⽬录的软链接</td></tr><tr><td>ln file1 lnk1</td><td>创建指向⽂件/⽬录的物理链接</td></tr><tr><td>find / -name file1</td><td>从跟⽬录开始搜索⽂件/⽬录</td></tr><tr><td>find / -user user1</td><td>搜索⽤户user1的⽂件/⽬录</td></tr><tr><td>find /dir -name *.bin</td><td>在⽬录/dir中搜带有.bin后缀的⽂件</td></tr><tr><td>locate <关键词></td><td>快速定位⽂件</td></tr><tr><td>locate *.mp4</td><td>寻找.mp4结尾的⽂件</td></tr><tr><td>whereis <关键词></td><td>显示某⼆进制⽂件/可执⾏⽂件的路径</td></tr><tr><td>which <关键词></td><td>查找系统⽬录下某的⼆进制⽂件</td></tr><tr><td>chmod ugo+rwx dir1</td><td>设置⽬录所有者(u)、群组(g)及其他⼈(o)的读(r)写(w)执⾏(x)权限</td></tr><tr><td>chmod go-rwx dir1</td><td>移除群组(g)与其他⼈(o)对⽬录的读写执⾏权限</td></tr><tr><td>chown user1 file1</td><td>改变⽂件的所有者属性</td></tr><tr><td>chown -R user1 dir1</td><td>改变⽬录的所有者属性</td></tr><tr><td>chgrp group1 file1</td><td>改变⽂件群组</td></tr><tr><td>chown user1:group1 file1</td><td>改变⽂件的所有⼈和群组</td></tr></tbody></table><h1 id="文件查看和处理"><a href="#文件查看和处理" class="headerlink" title="文件查看和处理"></a>文件查看和处理</h1><table><thead><tr><th>常用命令</th><th>作用</th></tr></thead><tbody><tr><td>cat file1</td><td>查看⽂件内容</td></tr><tr><td>cat -n file1</td><td>查看内容并标示⾏数</td></tr><tr><td>tac file1</td><td>从最后⼀⾏开始反看⽂件内容</td></tr><tr><td>more file1</td><td>more file1</td></tr><tr><td>less file1</td><td>类似more命令,但允许反向操作</td></tr><tr><td>head -2 file1</td><td>查看⽂件前两⾏</td></tr><tr><td>tail -2 file1</td><td>查看⽂件后两⾏</td></tr><tr><td>tail -f /log/msg</td><td>实时查看添加到⽂件中的内容</td></tr><tr><td>grep twac hello.txt</td><td>在⽂件hello.txt中查找关键词twac</td></tr><tr><td>grep ^sheep hello.txt</td><td>在⽂件hello.txt中查找以sheep开头的内容</td></tr><tr><td>grep [0-9] hello.txt</td><td>选择hello.txt⽂件中所有包含数字的⾏</td></tr><tr><td>sed ‘s/s1/s2/g’ hello.txt</td><td>将hello.txt⽂件中的s1替换成s2</td></tr><tr><td>sed ‘/^$/d’ hello.txt</td><td>从hello.txt⽂件中删除所有空⽩⾏</td></tr><tr><td>sed ‘/ *#/d; /^$/d’ hello.txt</td><td>从hello.txt⽂件中删除所有注释和空⽩⾏</td></tr><tr><td>sed -e ‘1d’ hello.txt</td><td>从⽂件hello.txt 中排除第⼀⾏</td></tr><tr><td>sed -n ‘/s1/p’ hello.txt</td><td>查看只包含关键词”s1”的⾏</td></tr><tr><td>sed -e ‘s/ *$//‘ hello.txt</td><td>删除每⼀⾏最后的空⽩字符</td></tr><tr><td>sed -e ‘s/s1//g’ hello.txt</td><td>从⽂档中只删除词汇s1并保留剩余全部</td></tr><tr><td>sed -n ‘1,5p;5q’ hello.txt</td><td>查看从第⼀⾏到第5⾏内容</td></tr><tr><td>sed -n ‘5p;5q’ hello.txt</td><td>查看第5⾏</td></tr><tr><td>paste file1 file2</td><td>合并两个⽂件或两栏的内容</td></tr><tr><td>paste -d ‘+’ file1 file2</td><td>合并两个⽂件或两栏的内容,中间⽤”+”区分</td></tr><tr><td>sort file1 file2</td><td>排序两个⽂件的内容</td></tr><tr><td>comm -1 file1 file2</td><td>⽐较两个⽂件的内容(去除’file1’所含内容)</td></tr><tr><td>comm -2 file1 file2</td><td>⽐较两个⽂件的内容(去除’file2’所含内容</td></tr><tr><td>comm -3 file1 file2</td><td>⽐较两个⽂件的内容(去除两⽂件共有部分)</td></tr></tbody></table><h1 id="打包和解压"><a href="#打包和解压" class="headerlink" title="打包和解压"></a>打包和解压</h1><table><thead><tr><th>常用命令</th><th>作用</th></tr></thead><tbody><tr><td>zip xxx.zip file</td><td>压缩⾄zip包</td></tr><tr><td>zip -r xxx.zip file1 file2 dir1</td><td>将多个⽂件+⽬录压成zip包</td></tr><tr><td>unzip xxx.zip</td><td>解压zip包</td></tr><tr><td>tar -cvf xxx.tar file</td><td>创建⾮压缩tar包</td></tr><tr><td>tar -cvf xxx.tar file1 file2 dir1</td><td>将多个⽂件+⽬录打tar包</td></tr><tr><td>tar -tf xxx.tar</td><td>查看tar包的内容</td></tr><tr><td>tar -xvf xxx.tar</td><td>解压tar包</td></tr><tr><td>tar -xvf xxx.tar -C /dir</td><td>将tar包解压⾄指定⽬录</td></tr><tr><td>tar -cvfj xxx.tar.bz2 dir</td><td>创建bz2压缩包</td></tr><tr><td>tar -jxvf xxx.tar.bz2</td><td>解压bz2压缩包</td></tr><tr><td>tar -cvfz xxx.tar.gz dir</td><td>创建gzip压缩包</td></tr><tr><td>tar -zxvf xxx.tar.gz</td><td>解压gzip压缩包</td></tr><tr><td>bunzip2 xxx.bz2</td><td>解压bz2压缩包</td></tr><tr><td>bzip2 filename</td><td>压缩⽂件</td></tr><tr><td>gunzip xxx.gz</td><td>解压gzip压缩包</td></tr><tr><td>gzip filename</td><td>压缩⽂件</td></tr><tr><td>gzip -9 filename</td><td>最⼤程度压缩</td></tr></tbody></table><h1 id="RPM包管理命令"><a href="#RPM包管理命令" class="headerlink" title="RPM包管理命令"></a>RPM包管理命令</h1><table><thead><tr><th>常用命令</th><th>作用</th></tr></thead><tbody><tr><td>rpm -qa</td><td>查看已安装的rpm包</td></tr><tr><td>rpm -q pkg_name</td><td>查询某个rpm包</td></tr><tr><td>rpm -q –whatprovides xxx</td><td>显示xxx功能是由哪个包提供的</td></tr><tr><td>rpm -q –whatrequires xxx</td><td>显示xxx功能被哪个程序包依赖的</td></tr><tr><td>rpm -q –changelog xxx</td><td>显示xxx包的更改记录</td></tr><tr><td>rpm -qi pkg_name</td><td>查看⼀个包的详细信息</td></tr><tr><td>rpm -qd pkg_name</td><td>查询⼀个包所提供的⽂档</td></tr><tr><td>rpm -qc pkg_name</td><td>查看已安装rpm包提供的配置⽂件</td></tr><tr><td>rpm -ql pkg_name</td><td>查看⼀个包安装了哪些⽂件</td></tr><tr><td>rpm -qf filename</td><td>查看某个⽂件属于哪个包</td></tr><tr><td>rpm -qR pkg_name</td><td>查询包的依赖关系</td></tr><tr><td>rpm -ivh xxx.rpm</td><td>安装rpm包</td></tr><tr><td>rpm -ivh –test xxx.rpm</td><td>测试安装rpm包</td></tr><tr><td>rpm -ivh –nodeps xxx.rpm</td><td>安装rpm包时忽略依赖关系</td></tr><tr><td>rpm -e xxx</td><td>卸载程序包</td></tr><tr><td>rpm -Fvh pkg_name</td><td>升级确定已安装的rpm包</td></tr><tr><td>rpm -Uvh pkg_name</td><td>升级rpm包(若未安装则会安装)</td></tr><tr><td>rpm -V pkg_name</td><td>RPM包详细信息校验</td></tr></tbody></table><h1 id="YUM包管理命令"><a href="#YUM包管理命令" class="headerlink" title="YUM包管理命令"></a>YUM包管理命令</h1><table><thead><tr><th>常用命令</th><th>作用</th></tr></thead><tbody><tr><td>yum repolist enabled</td><td>显示可⽤的源仓库</td></tr><tr><td>yum search pkg_name</td><td>搜索软件包</td></tr><tr><td>yum install pkg_name</td><td>下载并安装软件包</td></tr><tr><td>yum install –downloadonly pkg_name</td><td>只 下 载 不 安 装</td></tr><tr><td>yum list</td><td>显示所有程序包</td></tr><tr><td>yum list installed</td><td>查看当前系统已安装包</td></tr><tr><td>yum list updates</td><td>查看可以更新的包列表</td></tr><tr><td>yum check-update</td><td>查看可升级的软件包</td></tr><tr><td>yum update</td><td>更新所有软件包</td></tr><tr><td>yum update pkg_name</td><td>升级指定软件包</td></tr><tr><td>yum deplist pkg_name</td><td>列出软件包依赖关系</td></tr><tr><td>yum remove pkg_name</td><td>删除软件包</td></tr><tr><td>yum clean all</td><td>清除缓存</td></tr><tr><td>yum clean packages</td><td>清除缓存的软件包</td></tr><tr><td>yum clean headers</td><td>清除缓存的header</td></tr></tbody></table><h1 id="DPKG包管理命令"><a href="#DPKG包管理命令" class="headerlink" title="DPKG包管理命令"></a>DPKG包管理命令</h1><table><thead><tr><th>常用命令</th><th>作用</th></tr></thead><tbody><tr><td>dpkg -c xxx.deb</td><td>列出deb包的内容</td></tr><tr><td>dpkg -i xxx.deb</td><td>安装/更新deb包</td></tr><tr><td>dpkg -r pkg_name</td><td>移除deb包</td></tr><tr><td>dpkg -P pkg_name</td><td>移除deb包(不保留配置)</td></tr><tr><td>dpkg -l</td><td>查看系统中已安装deb包</td></tr><tr><td>dpkg -l pkg_name</td><td>显示包的⼤致信息</td></tr><tr><td>dpkg -L pkg_name</td><td>查看deb包安装的⽂件</td></tr><tr><td>dpkg -s pkg_name</td><td>查看包的详细信息</td></tr><tr><td>dpkg –unpack xxx.deb</td><td>解开deb包的内容</td></tr></tbody></table><h1 id="APT软件⼯具"><a href="#APT软件⼯具" class="headerlink" title="APT软件⼯具"></a>APT软件⼯具</h1><table><thead><tr><th>常用命令</th><th>作用</th></tr></thead><tbody><tr><td>apt-cache search pkg_name</td><td>搜索程序包</td></tr><tr><td>apt-cache show pkg_name</td><td>获取包的概览信息</td></tr><tr><td>apt-get install pkg_name</td><td>安装/升级软件包</td></tr><tr><td>apt-get purge pkg_name</td><td>卸载软件(包括配置)</td></tr><tr><td>apt-get remove pkg_name</td><td>卸载软件(不包括配置)</td></tr><tr><td>apt-get update</td><td>更新包索引信息</td></tr><tr><td>apt-get upgrade</td><td>更新已安装软件包</td></tr><tr><td>apt-get clean</td><td>清理缓存</td></tr></tbody></table>]]></content>
<summary type="html"><h1 id="关机-x2F-重启-x2F-注销"><a href="#关机-x2F-重启-x2F-注销" class="headerlink" title="关机&#x2F;重启&#x2F;注销"></a>关机&#x2F;重启&#x2F;注销</h1><table>
<thea</summary>
<category term="后端学习" scheme="https://blog.xiaohao233.top/backenddev/"/>
<category term="Linux" scheme="https://blog.xiaohao233.top/tags/Linux/"/>
</entry>
<entry>
<title>日语核心基础语法框架小记</title>
<link href="https://blog.xiaohao233.top/uncategorized/%E6%97%A5%E8%AF%AD%E6%A0%B8%E5%BF%83%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95%E6%A1%86%E6%9E%B6%E5%B0%8F%E8%AE%B0/"/>
<id>https://blog.xiaohao233.top/uncategorized/%E6%97%A5%E8%AF%AD%E6%A0%B8%E5%BF%83%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95%E6%A1%86%E6%9E%B6%E5%B0%8F%E8%AE%B0/</id>
<published>2021-06-25T12:17:23.000Z</published>
<updated>2022-07-10T14:42:12.955Z</updated>
<content type="html"><![CDATA[<!-- wp:paragraph --><p>迷迷糊糊学日语也有两年多了(还在备考的菜菜),日语学习可以分为学 单词 发音 语法;发音的话在日常交流中不是很会在意,交流意在意会即可;而单词呢,就是靠平时的日积月累而丰富起来;最重要的也是最复杂的就是语法,再最初学日语的时候(我不是学标日起步的,我是必修书起步,不过应该都一样),我们都是从一点一滴的零碎日语语法开始学习,学久了发现其实是有一个类似框架的形式存在,可以打破现有的日语语法学习,以下是我个人翻阅资料和浏览视频总结下来的日语语法一个整体的框架,学习语法就是为了造句,这个小框架从一个全新的角度去学习日语语法,如有描述的不妥的地方欢迎大佬们指教QAQ(害怕</p><!-- /wp:paragraph --><blockquote><p>2021.12月达成N2成就qwq</p></blockquote><!-- wp:image {"align":"center","id":90,"sizeSlug":"large","linkDestination":"none","className":"is-style-default"} --><div class="wp-block-image is-style-default"><figure class="aligncenter size-large"><img src="https://blog.xiaohao233.top/wp-content/uploads/2021/06/image.png" alt="" class="wp-image-90"/></figure></div><!-- /wp:image --><!-- wp:heading --><h2>基本句型(四大句型)</h2><!-- /wp:heading --><!-- wp:paragraph --><p>学语法就是为了造句,我学的第一个语法就是(....は...です/ 什么是什么 | 什么怎么样), 这个也是基本句型的<span class="has-inline-color has-luminous-vivid-amber-color">核心</span></p><!-- /wp:paragraph --><!-- wp:enlighter/codeblock {"language":"md"} --><pre class="EnlighterJSRAW" data-enlighter-language="md" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">李さんは中国人です。</pre><!-- /wp:enlighter/codeblock --><!-- wp:paragraph --><p>这个熟悉的例句,其实就是四大句型之一的“名词谓语句” 那么什么是谓语呢,官方解释是</p><!-- /wp:paragraph --><!-- wp:enlighter/codeblock {"language":"md"} --><pre class="EnlighterJSRAW" data-enlighter-language="md" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">谓语是对主语动作状态或特征的陈述和说明</pre><!-- /wp:enlighter/codeblock --><!-- wp:paragraph --><p>这个就是刚刚说到的核心,<span class="has-inline-color has-luminous-vivid-amber-color"> 什么 + 怎么样</span> 如果把"什么"当成主语的话,那么"怎么样"就是谓语了</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>在日语中能充当谓语的只有四类:</p><!-- /wp:paragraph --><!-- wp:list {"ordered":true} --><ol><li>名词</li><li>形容词</li><li>形容动词</li><li>动词</li></ol><!-- /wp:list --><!-- wp:paragraph --><p>因此基本句型(也叫<span class="has-inline-color has-luminous-vivid-amber-color">四大句型</span>)也只有四个分别是:</p><!-- /wp:paragraph --><!-- wp:list {"ordered":true} --><ol><li>名词谓语句</li><li>形容词谓语句</li><li>形容动谓语句</li><li>动词谓语句</li></ol><!-- /wp:list --><!-- wp:enlighter/codeblock {"language":"md"} --><pre class="EnlighterJSRAW" data-enlighter-language="md" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">李さんは中国人です。(名词谓语句小李是中国人。李さんは高いです。(形容词谓语句小李很高。李さんは有名です。(形容动词谓语句小李很有名。李さんは七時に起きます。(动词谓语句小李七点起床。</pre><!-- /wp:enlighter/codeblock --><!-- wp:paragraph --><p>上面四个例子都是以小李为主语,以名词形容词形容动词和动词做谓语共同叙述小李这个主语,核心就是<span class="has-inline-color has-luminous-vivid-amber-color">小李 怎么样</span>,都是对小李主语的叙述,只要掌握四大句型感觉就可以组一些简单句子了</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>当然,日语肯定不会这么简单<span class="has-inline-color has-luminous-vivid-amber-color">嘤嘤嘤</span></p><!-- /wp:paragraph --><!-- wp:paragraph --><p>日语分为简体和敬体(要熟练简体敬体的转换,敬体老菜了</p><!-- /wp:paragraph --><!-- wp:heading --><h2>日语是黏着语</h2><!-- /wp:heading --><!-- wp:paragraph --><p>由于日语的特性是黏着语,也就是要将词语与词语之间黏着起来,这个“胶水”就是助词</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>助词的出现使得日语的结构就是 名词+助词+名词+助词.....</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>除了这些还有重要的动词谓语句中的动词活用</p><!-- /wp:paragraph --><!-- wp:heading --><h2>三大关系</h2><!-- /wp:heading --><!-- wp:paragraph --><p>以上是对基本句型(简单句型)的一个描述,他们往往只涉及<span class="has-inline-color has-luminous-vivid-amber-color">一个对象(主语)</span></p><!-- /wp:paragraph --><!-- wp:paragraph --><p>如果要引入<span class="has-inline-color has-luminous-vivid-amber-color">多个对象</span>,那么就要用到三大关系,三大关系分别是:</p><!-- /wp:paragraph --><!-- wp:list {"ordered":true} --><ol><li>主题和主语的关系</li><li>授受关系</li><li>比较关系</li></ol><!-- /wp:list --><!-- wp:paragraph {"fontSize":"medium"} --><p class="has-medium-font-size">主题和主语的关系:</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>这个最经典的就是 は和が的关系</p><!-- /wp:paragraph --><!-- wp:enlighter/codeblock {"language":"md"} --><pre class="EnlighterJSRAW" data-enlighter-language="md" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">象は鼻が長いです。大象的鼻子很长。</pre><!-- /wp:enlighter/codeblock --><!-- wp:paragraph --><p>上面例子,其中は提示主题,が提示主语,这个句子用来表示<span class="has-inline-color has-luminous-vivid-amber-color">整体和部分</span>的关系(主题和主语关系的一种</p><!-- /wp:paragraph --><!-- wp:paragraph {"fontSize":"medium"} --><p class="has-medium-font-size">授受关系</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>涉及授受动词的用法(あげる もらう くれる)</p><!-- /wp:paragraph --><!-- wp:enlighter/codeblock {"language":"md"} --><pre class="EnlighterJSRAW" data-enlighter-language="md" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">私は小野さんにお土産をあげます。我给小野土特产。昨日友達から手紙をもらいました。昨天接到朋友的信。兄は私に英語を教えてくれます。哥哥教我英语。</pre><!-- /wp:enlighter/codeblock --><!-- wp:paragraph {"fontSize":"medium"} --><p class="has-medium-font-size">比较关系</p><!-- /wp:paragraph --><!-- wp:enlighter/codeblock {"language":"md"} --><pre class="EnlighterJSRAW" data-enlighter-language="md" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">李さんは森さんより若いです。小李比森年轻。森さんより李さんのほうが若いです。比起森小李比较年轻。</pre><!-- /wp:enlighter/codeblock --><!-- wp:heading --><h2>中高级语法</h2><!-- /wp:heading --><!-- wp:paragraph --><p>日语的中高级语法其实就是从简单句到复杂句的过程(知道也头疼系列</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>虽然日语的语法并不强调从句的概念,但我们也可以把日语的句子分为从句类型的</p><!-- /wp:paragraph --><!-- wp:paragraph --><p><span class="has-inline-color has-luminous-vivid-amber-color">李さんはもうすぐ来る</span>と思います。(宾语从句)</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>これは<span class="has-inline-color has-luminous-vivid-amber-color">明日会議で使う</span>資料です。(定语从句)</p><!-- /wp:paragraph --><!-- wp:paragraph --><p><span class="has-inline-color has-luminous-vivid-amber-color">自転車に二人で乗るの</span>は危ないです。(主语从句)</p><!-- /wp:paragraph --><!-- wp:paragraph --><p><span class="has-inline-color has-luminous-vivid-amber-color">このボタンお押すと</span>、電源が入ります。(状语从句)</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>这些简单句会在中高级语法中被细化成很多分支,例如:</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>表示时间的:とたんに、うちに、にあたり...</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>表示递进的:はもちろん、うえに、ばかりか...</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>表示让步的:ながらも、ものの、にもかかわらず...</p><!-- /wp:paragraph --><!-- wp:paragraph {"fontSize":"medium"} --><p class="has-medium-font-size"><span class="has-inline-color has-luminous-vivid-orange-color">因此可以把中高级语法总结为表示各类意思的从句。</span></p><!-- /wp:paragraph --><!-- wp:paragraph --><p>相比英语的从句强调引导词,日语会更强调接续法(老师教的)</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>中高级语法的大坑——形式体言</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>の、こと、もの、ところ、わけ、はず... 都是形式体言,它占据了中高级语法的半壁江山</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>掌握形式体言 == 掌握一半的中高级语法</p><!-- /wp:paragraph --><!-- wp:heading --><h2>The End</h2><!-- /wp:heading --><!-- wp:paragraph --><p><span class="has-inline-color has-luminous-vivid-amber-color">日语的语法以四大句型和三大关系作为基础,用各种从句来丰富其表达的意义,其中特别注重接续词的用法,这就是日语语法的核心内容(概括)</span></p><!-- /wp:paragraph --><!-- wp:paragraph --><p>大概认清日语语法的实质后就是日复一日的积累,上面是个人的理解和借鉴部分资料和视频写的笔记(资料和视频占大部分吧)</p><!-- /wp:paragraph --><!-- wp:paragraph --><p>如有写的不好的地方请见谅QAQ</p><!-- /wp:paragraph --><!-- wp:paragraph --><p></p><!-- /wp:paragraph --><!-- wp:paragraph --><p></p><!-- /wp:paragraph --><!-- wp:paragraph --><p></p><!-- /wp:paragraph -->]]></content>
<summary type="html"><!-- wp:paragraph -->
<p>迷迷糊糊学日语也有两年多了(还在备考的菜菜),日语学习可以分为学 单词 发音 语法;发音的话在日常交流中不是很会在意,交流意在意会即可;而单词呢,就是靠平时的日积月累而丰富起来;最重要的也是最复杂的就是语法,再最初学日语的时候(我</summary>
<category term="日语学习" scheme="https://blog.xiaohao233.top/tags/%E6%97%A5%E8%AF%AD%E5%AD%A6%E4%B9%A0/"/>
</entry>
<entry>
<title>[刷题记录]第十一届蓝桥杯JavaB组省赛</title>
<link href="https://blog.xiaohao233.top/lanqiao/%E7%AC%AC%E5%8D%81%E4%B8%80%E5%B1%8A%E8%93%9D%E6%A1%A5%E6%9D%AFJavaB%E7%BB%84%E7%9C%81%E8%B5%9B/"/>
<id>https://blog.xiaohao233.top/lanqiao/%E7%AC%AC%E5%8D%81%E4%B8%80%E5%B1%8A%E8%93%9D%E6%A1%A5%E6%9D%AFJavaB%E7%BB%84%E7%9C%81%E8%B5%9B/</id>
<published>2021-03-31T14:12:31.000Z</published>
<updated>2022-05-26T00:48:16.742Z</updated>
<content type="html"><![CDATA[<blockquote><p>把会做的做了一遍,不会做的就不放题目了</p></blockquote><h2 id="试题A-–-门牌制作"><a href="#试题A-–-门牌制作" class="headerlink" title="试题A – 门牌制作"></a>试题A – 门牌制作</h2><p>问题描述:</p><p>小蓝要为一条街的住户制作门牌号。<br>这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。<br>小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字<br>符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个<br>字符 0,2 个字符 1,1 个字符 7。<br>请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?</p><p>输出: 624</p><p>思路:模除筛选,把符合条件的数位用计数器存起来即可。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Solution</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">int</span> <span class="variable">count</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">1</span>; i <= <span class="number">2020</span>; i++) {</span><br><span class="line"> <span class="type">int</span> <span class="variable">tmp</span> <span class="operator">=</span> i;</span><br><span class="line"> <span class="keyword">while</span> (tmp > <span class="number">0</span>) {</span><br><span class="line"> <span class="keyword">if</span> (tmp%<span class="number">10</span> == <span class="number">2</span>) {</span><br><span class="line"> count++;</span><br><span class="line"> }</span><br><span class="line"> tmp /= <span class="number">10</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> System.out.println(count);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="试题C-–-蛇形填数"><a href="#试题C-–-蛇形填数" class="headerlink" title="试题C – 蛇形填数"></a>试题C – 蛇形填数</h2><p>题目描述:</p><p>小明用从 1 开始的正整数“蛇形”填充无限大的矩阵。 1 2 6 7 15 …</p><p>3 5 8 14 …</p><p>4 9 13 …</p><p>10 12 …</p><p>11 … …</p><p>容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列 的数是多少?</p><p>输出:761</p><p>思路:</p><p>嘤嘤嘤这道题看着数字不是很大暴力就出来了,看大佬的思路直接找规律了。</p><p>第n行第n列 = n^2 + (n-1)^2 (tqlllllllllllllll</p><h2 id="试题E-–-排序"><a href="#试题E-–-排序" class="headerlink" title="试题E – 排序"></a>试题E – 排序</h2><p>题目描述:</p><p>小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。<br>在冒泡排序中,每次只能交换相邻的两个元素。<br>小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符,<br>则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。<br>例如,对于字符串 lan 排序,只需要 1 次交换。对于字符串 qiao 排序,<br>总共需要 4 次交换。<br>小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 100 次交<br>换,可是他忘了吧这个字符串记下来,现在找不到了。<br>请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对<br>该串的字符排序,正好需要 100 次交换。如果可能找到多个,请告诉小蓝最短<br>的那个。如果最短的仍然有多个,请告诉小蓝字典序最小的那个。请注意字符<br>串中可以包含相同的字符。</p><p>思路:</p><p>主要考的是冒泡排序的特点,最大排序次数应该是n*(n-1)/2次,题目要求求得移动次数最大为100,则n只能等于15,那代入公式就是需要排序105次,按照字典序的定义拿出前十五位字母abcdefghijklklmno; 如果把它反转的话,那么就是onmlkjighfedecba,冒泡排序一定需要排序105次,根据题目要求需要的是100次,那么我们只需要将第六位提到最前面就能省去五次排序,即符合题目要求100次交换。</p><p>输出:<code>jonmlkihgfedcba</code></p><h2 id="试题F-–-成绩分析"><a href="#试题F-–-成绩分析" class="headerlink" title="试题F – 成绩分析"></a>试题F – 成绩分析</h2><p>题目描述:</p><p>小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是 一个 0 到 100 的整数。 请计算这次考试的最高分、最低分和平均分。</p><p>样例输入:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">7</span><br><span class="line">80</span><br><span class="line">92</span><br><span class="line">56</span><br><span class="line">74</span><br><span class="line">88</span><br><span class="line">99</span><br><span class="line">10</span><br></pre></td></tr></table></figure><p>样例输出:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">99</span><br><span class="line">10</span><br><span class="line">71.29</span><br></pre></td></tr></table></figure><p>思路:经典数学问题正常写就好了</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.Scanner;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Solution</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">Scanner</span> <span class="variable">sc</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in);</span><br><span class="line"> <span class="type">int</span> <span class="variable">n</span> <span class="operator">=</span> sc.nextInt();</span><br><span class="line"> <span class="type">int</span> <span class="variable">maxScore</span> <span class="operator">=</span> <span class="number">0</span>,minScore = <span class="number">100</span>;</span><br><span class="line"> <span class="type">double</span> <span class="variable">total</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < n; i++) {</span><br><span class="line"> <span class="type">int</span> <span class="variable">tmp</span> <span class="operator">=</span> sc.nextInt();</span><br><span class="line"> <span class="keyword">if</span> (tmp > maxScore) maxScore = tmp;</span><br><span class="line"> <span class="keyword">if</span> (tmp < minScore) minScore = tmp;</span><br><span class="line"> total += tmp;</span><br><span class="line"> }</span><br><span class="line"> System.out.println(maxScore);</span><br><span class="line"> System.out.println(minScore);</span><br><span class="line"> System.out.printf(<span class="string">"%.2f"</span>,total/n);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="试题G-–-单词分析"><a href="#试题G-–-单词分析" class="headerlink" title="试题G – 单词分析"></a>试题G – 单词分析</h2><p>题目描述:</p><p>小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组<br>成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不<br>住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得<br>最多来分辨单词。<br>现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这<br>个字母出现的次数<br>PS :</p><p>输入一行包含一个单词,单词只由小写英文字母组成。</p><p>输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪 个。如果有多个字母出现的次数相等,输出字典序最小的那个。 第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。</p><p>样例输入:<code>lanqiao</code></p><p>样例输出:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">a</span><br><span class="line">2</span><br></pre></td></tr></table></figure><p>思路:分割字符串存入HashMap中,记录次数,遍历后输出最大次数的键值对。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"><span class="keyword">import</span> java.util.Scanner;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Solution</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">Scanner</span> <span class="variable">scanner</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in);</span><br><span class="line"> <span class="type">String</span> <span class="variable">str</span> <span class="operator">=</span> scanner.nextLine();</span><br><span class="line"> Map<Character,Integer> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> <span class="type">char</span> tmp;</span><br><span class="line"> <span class="type">Integer</span> <span class="variable">val</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < str.length(); i++) {</span><br><span class="line"> tmp = str.charAt(i);</span><br><span class="line"> val = map.get(tmp);</span><br><span class="line"> map.put(tmp,(val==<span class="literal">null</span>)?<span class="number">1</span>:++val);</span><br><span class="line"> }</span><br><span class="line"> <span class="type">int</span> <span class="variable">max</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="type">char</span> <span class="variable">keyword</span> <span class="operator">=</span> <span class="string">' '</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">char</span> key : map.keySet()) {</span><br><span class="line"> <span class="type">Integer</span> <span class="variable">value</span> <span class="operator">=</span> map.get(key);</span><br><span class="line"> <span class="keyword">if</span> (value > max) {</span><br><span class="line"> max = value;</span><br><span class="line"> keyword = key;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> System.out.println(keyword);</span><br><span class="line"> System.out.println(max);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="试题I-–-子串分值和"><a href="#试题I-–-子串分值和" class="headerlink" title="试题I – 子串分值和"></a>试题I – 子串分值和</h2><p>题目描述:</p><p>对于一个字符串 S,我们定义 S 的分值 f(S ) 为 S 中出现的不同的字符个<br>数。例如 f(”aba”) = 2,f(”abc”) = 3, f(”aaa”) = 1。<br>现在给定一个字符串 S [0..n 1](长度为 n),请你计算对于所有 S 的非空<br>子串 S [i.. j](0 ≤ i ≤ j < n),f(S [i.. j]) 的和是多少。</p><p>样例输入:ababc</p><p>样例输出:28</p><p>思路:将字符串分割成全部子串存入List里,然后子串分割字符存入set去重,算出最后的分值和。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">StringScoreSum</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">Scanner</span> <span class="variable">scanner</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in);</span><br><span class="line"> <span class="type">String</span> <span class="variable">str</span> <span class="operator">=</span> scanner.nextLine();</span><br><span class="line"> List<String> list = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < str.length(); i++) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> i+<span class="number">1</span>; j <= str.length(); j++) {</span><br><span class="line"> list.add(str.substring(i,j));</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="type">int</span> <span class="variable">count</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">k</span> <span class="operator">=</span> <span class="number">0</span>; k < list.size(); k++) {</span><br><span class="line"> Set<String> set = <span class="keyword">new</span> <span class="title class_">HashSet</span><>();</span><br><span class="line"> <span class="type">String</span> <span class="variable">tmp</span> <span class="operator">=</span> list.get(k);</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">v</span> <span class="operator">=</span> <span class="number">0</span>; v < tmp.length(); v++) {</span><br><span class="line"> set.add(tmp.charAt(v)+<span class="string">""</span>);</span><br><span class="line"> }</span><br><span class="line"> count += set.size();</span><br><span class="line"> }</span><br><span class="line"> System.out.println(count);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="The-End"><a href="#The-End" class="headerlink" title="The End"></a>The End</h2><p>好多题8会鸭~~~~~~ 特别是最后一道题装饰珠直接送走我QAQ</p>]]></content>
<summary type="html"><blockquote>
<p>把会做的做了一遍,不会做的就不放题目了</p>
</blockquote>
<h2 id="试题A-–-门牌制作"><a href="#试题A-–-门牌制作" class="headerlink" title="试题A – 门牌制作"></a>试题</summary>
<category term="蓝桥杯" scheme="https://blog.xiaohao233.top/lanqiao/"/>
<category term="算法" scheme="https://blog.xiaohao233.top/tags/algorithm/"/>
</entry>
</feed>