-
Notifications
You must be signed in to change notification settings - Fork 0
/
atom.xml
653 lines (428 loc) · 291 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
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Bwael's Blog</title>
<link href="/atom.xml" rel="self"/>
<link href="http://bwael.com/"/>
<updated>2020-08-22T15:02:29.066Z</updated>
<id>http://bwael.com/</id>
<author>
<name>bwael</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>顺丰开发、商汤测开、有赞测开笔试 - 20200820</title>
<link href="http://bwael.com/2020/08/22/Test-youzan-shangtang-shunfeng-20200820/"/>
<id>http://bwael.com/2020/08/22/Test-youzan-shangtang-shunfeng-20200820/</id>
<published>2020-08-22T14:59:50.000Z</published>
<updated>2020-08-22T15:02:29.066Z</updated>
<content type="html"><![CDATA[<p>不按照时间先后了,反正都是在一个晚上。</p><p>先是顺丰,若干选择,两道编程题。编程题:1.服务器管理(分配);2.赏金猎人。</p><p>一道贪心,一道动规。题目本身不难,据后了解好多同学做题时都是走错了路。我只做了第一道,还没AC……</p><h2 id="1-服务器管理"><a href="#1-服务器管理" class="headerlink" title="1. 服务器管理"></a>1. 服务器管理</h2><h3 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h3><p>小A有一批服务器要出租,每一个服务器有一个固定的带宽;客户根据自己需要的带宽租用服务器,一台服务器只能租给一个人。</p><p>小A现有n个服务器,第 i 台服务器对应的带宽为a_i;现有m个客户需要服务器,第 i 位客户需要的带宽为b_i,预算为c_i(注意:这里 i 的含义不同)。现在求小A的服务器最多能租多少钱?</p><p>要求:服务器带宽独立不可叠加,不能成功租出则输出0。输入输出规则和用例如下。</p><figure class="highlight html"><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">Input:</span><br><span class="line">3 4 【n m】</span><br><span class="line">1 2 3 【a1 a2 a3】</span><br><span class="line">2 1 【b1 c1】</span><br><span class="line">3 2 【b2 c2】</span><br><span class="line">3 3 【b3 c3】</span><br><span class="line">1 1 【b4 c4】</span><br><span class="line"></span><br><span class="line">Output:</span><br><span class="line">5</span><br></pre></td></tr></table></figure><h3 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h3><p>因为服务器带宽独立不可叠加,所以优先选择可以满足带宽需求的资金最充裕的客户。采用<strong>贪心算法</strong>求解,使用带宽最小的服务器来尝试满足客户需求,所以要先进行排序。</p><a id="more"></a><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">MainSF</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">rentServer</span><span class="params">(<span class="keyword">int</span> n, <span class="keyword">int</span> m, <span class="keyword">int</span>[] a, <span class="keyword">int</span>[][] bc)</span> </span>{</span><br><span class="line"> Arrays.sort(a);</span><br><span class="line"> <span class="keyword">int</span> result = <span class="number">0</span>;</span><br><span class="line"> <span class="comment">// 为当前服务器a_i选择客户</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < n; i++) {</span><br><span class="line"> <span class="keyword">int</span> temp = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">int</span> index = -<span class="number">1</span>;</span><br><span class="line"> <span class="keyword">int</span> need_a = a[i];</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j < m; j++) {</span><br><span class="line"> <span class="comment">// 客户需求带宽多于供给,跳过</span></span><br><span class="line"> <span class="keyword">if</span> (bc[j][<span class="number">0</span>] > need_a) {</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">// 保留满足需求且资金最大的客户的预算价格和对应索引</span></span><br><span class="line"> <span class="keyword">if</span> (bc[j][<span class="number">1</span>] > temp) {</span><br><span class="line"> temp = bc[j][<span class="number">1</span>];</span><br><span class="line"> index = j;</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="keyword">if</span> (index != -<span class="number">1</span>) {</span><br><span class="line"> bc[index][<span class="number">0</span>] = Integer.MAX_VALUE;</span><br><span class="line"> }</span><br><span class="line"> result = result + temp;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"> <span class="comment">// write your code here</span></span><br><span class="line"> Scanner sc = <span class="keyword">new</span> Scanner(System.in);</span><br><span class="line"> <span class="keyword">int</span> n = sc.nextInt();<span class="keyword">int</span> m = sc.nextInt();</span><br><span class="line"> <span class="keyword">int</span>[] a = <span class="keyword">new</span> <span class="keyword">int</span>[n];<span class="keyword">int</span>[][] bc = <span class="keyword">new</span> <span class="keyword">int</span>[m][<span class="number">2</span>];</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < n; i++) a[i] = sc.nextInt();</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j < m; j++) {</span><br><span class="line"> bc[j][<span class="number">0</span>] = sc.nextInt();bc[j][<span class="number">1</span>] = sc.nextInt();</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> MainSF sf = <span class="keyword">new</span> MainSF();</span><br><span class="line"> System.out.println(sf.rentServer(n, m, a, bc));</span><br><span class="line"> sc.close();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="2-赏金猎人"><a href="#2-赏金猎人" class="headerlink" title="2. 赏金猎人"></a>2. 赏金猎人</h2><h3 id="题目描述-1"><a href="#题目描述-1" class="headerlink" title="题目描述"></a>题目描述</h3><p>A是一名赏金猎人,最近他获得了一些任务,受时间限制只能完成其中一部分。任务用<code>l, r, w</code>来定义,其中<code>任务开始时间l</code>,<code>任务结束时间r</code>,<code>任务报酬w</code>。A非常贪心,他想知道在自己任务不冲突的情况下最多获得多少金钱。</p><figure class="highlight html"><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">Input:</span><br><span class="line">3</span><br><span class="line">1 3 5</span><br><span class="line">2 7 3</span><br><span class="line">5 10 1</span><br><span class="line"></span><br><span class="line">Output:</span><br><span class="line">6</span><br></pre></td></tr></table></figure><h3 id="解题思路-1"><a href="#解题思路-1" class="headerlink" title="解题思路"></a>解题思路</h3><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line">n=int(input()) <span class="comment"># 读数据</span></span><br><span class="line">renwu=[] </span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(n):</span><br><span class="line"> renwu.append(list(map(int,input().split())))</span><br><span class="line"></span><br><span class="line">renwu.sort() <span class="comment"># 任务按开始时间排序</span></span><br><span class="line">dp=[i[<span class="number">-1</span>] <span class="keyword">for</span> i <span class="keyword">in</span> renwu] <span class="comment"># 动态规划数组初始化为每个任务的收益</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(n): <span class="comment"># dp[i]是以当前任务 i 为最后一个任务可以取得的最大收益</span></span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> range(i):</span><br><span class="line"> <span class="keyword">if</span> renwu[j][<span class="number">1</span>]<renwu[i][<span class="number">0</span>]:</span><br><span class="line"> <span class="comment"># 这个转移方程真是精华</span></span><br><span class="line"> dp[i]=max(dp[i],dp[j]+renwu[i][<span class="number">-1</span>])</span><br><span class="line">print(max(dp))</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Shunfeng2</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"> Scanner scanner=<span class="keyword">new</span> Scanner(System.in);</span><br><span class="line"> <span class="keyword">int</span> a =scanner.nextInt();</span><br><span class="line"> <span class="keyword">long</span>[][] arr=<span class="keyword">new</span> <span class="keyword">long</span>[(<span class="keyword">int</span>) a][<span class="number">3</span>];</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < a; i++) {</span><br><span class="line"> arr[i][<span class="number">0</span>]=scanner.nextLong();</span><br><span class="line"> arr[i][<span class="number">1</span>]=scanner.nextLong();</span><br><span class="line"> arr[i][<span class="number">2</span>]=scanner.nextLong();</span><br><span class="line"> }</span><br><span class="line"> Arrays.sort(arr, <span class="keyword">new</span> Comparator<<span class="keyword">long</span>[]>() {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">compare</span><span class="params">(<span class="keyword">long</span>[] o1, <span class="keyword">long</span>[] o2)</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> (<span class="keyword">int</span>) (o1[<span class="number">1</span>]-o2[<span class="number">1</span>]);</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> <span class="keyword">long</span>[] dp = <span class="keyword">new</span> <span class="keyword">long</span>[(<span class="keyword">int</span>) a];</span><br><span class="line"> dp[<span class="number">0</span>] = arr[<span class="number">0</span>][<span class="number">2</span>];</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i < a; i++) {</span><br><span class="line"> <span class="keyword">int</span> begin = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">while</span> (arr[begin][<span class="number">1</span>] < arr[i][<span class="number">0</span>]){</span><br><span class="line"> begin++;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">long</span> tmp = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">if</span> (begin >= <span class="number">1</span>){</span><br><span class="line"> tmp = dp[begin-<span class="number">1</span>]+arr[i][<span class="number">2</span>];</span><br><span class="line"> }<span class="keyword">else</span> {</span><br><span class="line"> tmp = arr[i][<span class="number">2</span>];</span><br><span class="line"> }</span><br><span class="line"> dp[i] = Math.max(tmp,dp[i-<span class="number">1</span>]);</span><br><span class="line"> }</span><br><span class="line"> System.out.println(dp[a-<span class="number">1</span>]);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><strong>商汤</strong>应该是有三道题。记不太清了,基本上是LeetCode原题。</p><blockquote><p>1.给定字符串,包含字母数字和空格,问其中的字符能组成多少”Good”。</p><p>2.给定一个区间的集合,找到移除区间的最小数量,使剩余区间不重叠。</p><p>3.给定一个数字矩阵,找到一条最长的上升路径,只能上下左右移动。</p></blockquote><p><strong>有赞</strong>也是三道编程题。</p><blockquote><p>1.计算两个大数的模。我用了BigInteger但还是只过了一部分。</p><p>2.统计日志里级别为ERROR的类名及其ERROR的次数,并输出。</p><p>3.将文档目录层级转换成二叉树。</p></blockquote>]]></content>
<summary type="html">
<p>不按照时间先后了,反正都是在一个晚上。</p>
<p>先是顺丰,若干选择,两道编程题。编程题:1.服务器管理(分配);2.赏金猎人。</p>
<p>一道贪心,一道动规。题目本身不难,据后了解好多同学做题时都是走错了路。我只做了第一道,还没AC……</p>
<h2 id="1-服务器管理"><a href="#1-服务器管理" class="headerlink" title="1. 服务器管理"></a>1. 服务器管理</h2><h3 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h3><p>小A有一批服务器要出租,每一个服务器有一个固定的带宽;客户根据自己需要的带宽租用服务器,一台服务器只能租给一个人。</p>
<p>小A现有n个服务器,第 i 台服务器对应的带宽为a_i;现有m个客户需要服务器,第 i 位客户需要的带宽为b_i,预算为c_i(注意:这里 i 的含义不同)。现在求小A的服务器最多能租多少钱?</p>
<p>要求:服务器带宽独立不可叠加,不能成功租出则输出0。输入输出规则和用例如下。</p>
<figure class="highlight html"><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">Input:</span><br><span class="line">3 4 【n m】</span><br><span class="line">1 2 3 【a1 a2 a3】</span><br><span class="line">2 1 【b1 c1】</span><br><span class="line">3 2 【b2 c2】</span><br><span class="line">3 3 【b3 c3】</span><br><span class="line">1 1 【b4 c4】</span><br><span class="line"></span><br><span class="line">Output:</span><br><span class="line">5</span><br></pre></td></tr></table></figure>
<h3 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h3><p>因为服务器带宽独立不可叠加,所以优先选择可以满足带宽需求的资金最充裕的客户。采用<strong>贪心算法</strong>求解,使用带宽最小的服务器来尝试满足客户需求,所以要先进行排序。</p>
</summary>
<category term="学习笔记" scheme="http://bwael.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="学习笔记" scheme="http://bwael.com/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="算法" scheme="http://bwael.com/tags/%E7%AE%97%E6%B3%95/"/>
<category term="笔试" scheme="http://bwael.com/tags/%E7%AC%94%E8%AF%95/"/>
</entry>
<entry>
<title>用友笔试 - 20200818 - Java后台开发工程师</title>
<link href="http://bwael.com/2020/08/18/Test-Yongyou-20200818/"/>
<id>http://bwael.com/2020/08/18/Test-Yongyou-20200818/</id>
<published>2020-08-18T12:58:30.000Z</published>
<updated>2020-08-18T13:06:11.050Z</updated>
<content type="html"><![CDATA[<p>10道单选,多考察设计模式。</p><p>10道多选,Java基础为主。</p><p>3道编程题,总体不难。</p><h2 id="1-字符串压缩"><a href="#1-字符串压缩" class="headerlink" title="1. 字符串压缩"></a>1. 字符串压缩</h2><p>算是经典题目了,印象里做过好多次了。</p><h3 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h3><p>压缩字符串。</p><p>要求:如果压缩后字符串长于原字符串,则返回原字符串。</p><figure class="highlight html"><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">Input:</span><br><span class="line">"abbcccaadddd"</span><br><span class="line"></span><br><span class="line">Output:</span><br><span class="line">"a1b2c3a2d4"</span><br></pre></td></tr></table></figure><a id="more"></a><h3 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h3><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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Main</span></span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">compress</span> <span class="params">(String str)</span> </span>{</span><br><span class="line"> <span class="keyword">int</span> N = str.length();</span><br><span class="line"> <span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line"> StringBuilder sb = <span class="keyword">new</span> StringBuilder();</span><br><span class="line"> <span class="keyword">while</span> (i < N) {</span><br><span class="line"> <span class="keyword">int</span> j = i;</span><br><span class="line"> <span class="keyword">while</span> (j < N && str.charAt(j) == str.charAt(i)) {</span><br><span class="line"> j++;</span><br><span class="line"> }</span><br><span class="line"> sb.append(str.charAt(i));</span><br><span class="line"> sb.append(j - i);</span><br><span class="line"> i = j;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> String res = sb.toString();</span><br><span class="line"> <span class="keyword">if</span> (res.length() < str.length()) {</span><br><span class="line"> <span class="keyword">return</span> res;</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">return</span> str;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="2-将矩阵上下翻转(二维数组)"><a href="#2-将矩阵上下翻转(二维数组)" class="headerlink" title="2. 将矩阵上下翻转(二维数组)"></a>2. 将矩阵上下翻转(二维数组)</h2><p>不太清楚这道题目考察什么。</p><h3 id="题目描述-1"><a href="#题目描述-1" class="headerlink" title="题目描述"></a>题目描述</h3><figure class="highlight html"><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">Input:</span><br><span class="line">[[1,2,3],</span><br><span class="line"> [4,5,6],</span><br><span class="line"> [7,8,9]]</span><br><span class="line"></span><br><span class="line">Output:</span><br><span class="line">[[7,8,9],</span><br><span class="line"> [4,5,6],</span><br><span class="line"> [1,2,3]]</span><br></pre></td></tr></table></figure><h3 id="解题思路-1"><a href="#解题思路-1" class="headerlink" title="解题思路"></a>解题思路</h3><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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Main</span></span>{ </span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">int</span>[][] convert (<span class="keyword">int</span>[][] matrix) {</span><br><span class="line"> <span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">int</span> j = matrix.length - <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">int</span>[] temp;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">while</span> (i < j){</span><br><span class="line"> temp = matrix[i];</span><br><span class="line"> matrix[i] = matrix[j];</span><br><span class="line"> matrix[j] = temp;</span><br><span class="line"> i++;</span><br><span class="line"> j--;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> matrix;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="3-城市到其他城市的最短距离"><a href="#3-城市到其他城市的最短距离" class="headerlink" title="3. 城市到其他城市的最短距离"></a>3. 城市到其他城市的最短距离</h2><p>得分要求不一样,用Dijkstra得分最高,但实在想不起来怎么写了,最近刷题也没遇到啊。最后用动规做的,算是暴力法。</p><p>787.K 站中转内最便宜的航班[Medium]【这里用K限制了中转的数量】</p><p><a href="https://leetcode-cn.com/problems/cheapest-flights-within-k-stops/" target="_blank" rel="noopener">LeetCode</a></p><h3 id="题目描述-2"><a href="#题目描述-2" class="headerlink" title="题目描述"></a>题目描述</h3><p>有 n 个城市通过 m 个航班连接。每个航班都从城市 u 开始,以价格 w 抵达 v。</p><p>现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到从 src 到其他所有城市的最便宜的价格。 如果没有这样的路线,则输出 -1;两个城市间机票价格不超过Integer.MAX_VALUE。</p><figure class="highlight html"><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">Input:</span><br><span class="line">n = 3, flights = [[0, 1, 100], [1, 2, 100], [0, 2, 500]] ,src = 0</span><br><span class="line"></span><br><span class="line">Output:</span><br><span class="line">[0, 100, 200]</span><br></pre></td></tr></table></figure><h3 id="解题思路-2"><a href="#解题思路-2" class="headerlink" title="解题思路"></a>解题思路</h3><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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Main</span></span>{</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">int</span>[] findAllCheapestPrice(<span class="keyword">int</span> n, <span class="keyword">int</span>[][] flights, <span class="keyword">int</span> src) {</span><br><span class="line"> <span class="keyword">int</span> K = flights.length; <span class="comment">// 不限制中转</span></span><br><span class="line"> <span class="keyword">int</span>[][] dp = <span class="keyword">new</span> <span class="keyword">int</span>[n][K+<span class="number">2</span>];</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>; i < n; ++i){</span><br><span class="line"> Arrays.fill(dp[i], Integer.MAX_VALUE);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> k = <span class="number">0</span>; k <= K+<span class="number">1</span>; ++k){</span><br><span class="line"> dp[src][k] = <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> k = <span class="number">1</span>; k <= K+<span class="number">1</span>; ++k){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span>[] flight : flights){</span><br><span class="line"> <span class="keyword">if</span>(dp[flight[<span class="number">0</span>]][k-<span class="number">1</span>] != Integer.MAX_VALUE)</span><br><span class="line"> dp[flight[<span class="number">1</span>]][k] = Math.min(dp[flight[<span class="number">1</span>]][k], </span><br><span class="line"> dp[flight[<span class="number">0</span>]][k-<span class="number">1</span>] + flight[<span class="number">2</span>]);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">int</span>[] res = <span class="keyword">new</span> <span class="keyword">int</span>[n];</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>; i< n; i++)</span><br><span class="line"> res[i] = dp[i][K+<span class="number">1</span>] == Integer.MAX_VALUE ? -<span class="number">1</span> : dp[i][K+<span class="number">1</span>];</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">
<p>10道单选,多考察设计模式。</p>
<p>10道多选,Java基础为主。</p>
<p>3道编程题,总体不难。</p>
<h2 id="1-字符串压缩"><a href="#1-字符串压缩" class="headerlink" title="1. 字符串压缩"></a>1. 字符串压缩</h2><p>算是经典题目了,印象里做过好多次了。</p>
<h3 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h3><p>压缩字符串。</p>
<p>要求:如果压缩后字符串长于原字符串,则返回原字符串。</p>
<figure class="highlight html"><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">Input:</span><br><span class="line">"abbcccaadddd"</span><br><span class="line"></span><br><span class="line">Output:</span><br><span class="line">"a1b2c3a2d4"</span><br></pre></td></tr></table></figure>
</summary>
<category term="学习笔记" scheme="http://bwael.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="学习笔记" scheme="http://bwael.com/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="算法" scheme="http://bwael.com/tags/%E7%AE%97%E6%B3%95/"/>
<category term="笔试" scheme="http://bwael.com/tags/%E7%AC%94%E8%AF%95/"/>
</entry>
<entry>
<title>奇安信and大疆笔试 - 20200816 - 后端开发and测开</title>
<link href="http://bwael.com/2020/08/16/Test-Dji-20200816/"/>
<id>http://bwael.com/2020/08/16/Test-Dji-20200816/</id>
<published>2020-08-16T13:46:24.000Z</published>
<updated>2020-08-16T13:56:17.956Z</updated>
<content type="html"><![CDATA[<p>奇安信没有投,从旁划水,做了一道编程,不算难。好像暴露了。</p><a id="more"></a><h2 id="题目"><a href="#题目" class="headerlink" title="题目"></a>题目</h2><p><img src="image-20200816212210325.png" alt=""></p><h2 id="题解"><a href="#题解" class="headerlink" title="题解"></a>题解</h2><p>没有处理tab,这道题应该用栈处理更好一些。</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Main</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> String <span class="title">UndoRedoStr</span><span class="params">(String str)</span></span>{</span><br><span class="line"> String[] words = str.split(<span class="string">" "</span>);</span><br><span class="line"> String newStr = <span class="string">""</span>;</span><br><span class="line"> String preWord = <span class="string">""</span>; <span class="comment">// 被操作单词</span></span><br><span class="line"> <span class="keyword">int</span> flag = <span class="number">0</span>; <span class="comment">// 操作标记</span></span><br><span class="line"> <span class="keyword">int</span> undo = <span class="number">0</span>; <span class="comment">// "undo"操作前置标记</span></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>;i < words.length; i++){</span><br><span class="line"> <span class="keyword">if</span>(words[i].equals(<span class="string">"undo"</span>)){</span><br><span class="line"> newStr = newStr.replace(preWord, <span class="string">""</span>);</span><br><span class="line"> flag = <span class="number">1</span>;</span><br><span class="line"> undo = <span class="number">1</span>;</span><br><span class="line"> }<span class="keyword">else</span> <span class="keyword">if</span>(words[i].equals(<span class="string">"redo"</span>) ){</span><br><span class="line"> <span class="keyword">if</span>(undo == <span class="number">1</span>) newStr = newStr + preWord;</span><br><span class="line"> flag = <span class="number">1</span>;</span><br><span class="line"> undo = <span class="number">0</span>;</span><br><span class="line"> } </span><br><span class="line"> <span class="keyword">if</span>(flag == <span class="number">0</span>) {</span><br><span class="line"> newStr = newStr + <span class="string">" "</span> + words[i];</span><br><span class="line"> preWord = words[i];</span><br><span class="line"> }</span><br><span class="line"> flag = <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> newStr;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"> String str = <span class="string">"hello redo world undo redo redo end"</span>;</span><br><span class="line"> System.out.println(UndoRedoStr(str));</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="关于大疆"><a href="#关于大疆" class="headerlink" title="关于大疆"></a>关于大疆</h2><p>投的时候没有发现开发岗位,只好投的测开,主要考察Linux + Python。题不难,没有编程题,感觉拿不到面试啊!!!隔壁测试都有编程题,虽然也不难。见到了软件B卷,那个还是有点难度,题目描述也很抽象,能A一半的样子。</p><h3 id="题目-1"><a href="#题目-1" class="headerlink" title="题目"></a>题目</h3><p>问答题</p><ol><li>Python中线程和进程使用什么方法,二者的区别,围绕IO或CPU密集型的应用。</li><li>Python中的浅拷贝和深拷贝,前段时间看Java的相关内容顺便瞅了一眼,正好就用上了。</li><li>实现斐波那契数列的生成器。注意,是<strong>生成器</strong>!勉强算作编程题。</li></ol><p>做了一道测试的编程,同样的从旁划水。应该问题不大。</p><p><img src="image-20200816214213031.png" alt=""></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="class"><span class="keyword">class</span> <span class="title">MainDji</span> </span>{</span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">boolean</span> <span class="title">isAnagram</span><span class="params">(String s, String t)</span> </span>{</span><br><span class="line"> <span class="keyword">int</span>[] cnts = <span class="keyword">new</span> <span class="keyword">int</span>[<span class="number">26</span>];</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">char</span> c : s.toCharArray()){</span><br><span class="line"> cnts[c - <span class="string">'a'</span>] ++;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">char</span> c : t.toCharArray()){</span><br><span class="line"> cnts[c - <span class="string">'a'</span>] --;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> cnt : cnts){</span><br><span class="line"> <span class="keyword">if</span>(cnt < <span class="number">0</span>){</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"> <span class="comment">// write your code here</span></span><br><span class="line"> String s = <span class="string">"rkqodlw"</span>;</span><br><span class="line"> String t = <span class="string">"world"</span>;</span><br><span class="line"> System.out.println(isAnagram(s, t));</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p>奇安信没有投,从旁划水,做了一道编程,不算难。好像暴露了。</p>
</summary>
<category term="学习笔记" scheme="http://bwael.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="学习笔记" scheme="http://bwael.com/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="算法" scheme="http://bwael.com/tags/%E7%AE%97%E6%B3%95/"/>
<category term="笔试" scheme="http://bwael.com/tags/%E7%AC%94%E8%AF%95/"/>
</entry>
<entry>
<title>Bilibili笔试(内推)- 20200813 - Java后端开发</title>
<link href="http://bwael.com/2020/08/13/Test-Bilibili-20200813/"/>
<id>http://bwael.com/2020/08/13/Test-Bilibili-20200813/</id>
<published>2020-08-13T13:49:47.000Z</published>
<updated>2020-08-13T13:51:34.790Z</updated>
<content type="html"><![CDATA[<p>30道选择题,三道编程题。</p><h2 id="若干选择题"><a href="#若干选择题" class="headerlink" title="若干选择题"></a>若干选择题</h2><p>一、以下说法正确的是( )。 </p><p> <strong>A. 由先序序列、中序序列可以还原出树的原貌</strong> </p><p> B. 200,190,150,170,180,140,155,160,165,120是一个最大堆 </p><p> C. 排序之前必须把所有待排数据加载到内存 </p><p> D. 给定一组输入,可以输出一颗唯一的哈夫曼树</p><p>二、请选择正确的描述。( ) </p><p> <strong>A. 静态变量和全局变量是在程序一开始时分配内存的,这部分内存无法回收,直至程序结束</strong> </p><p> B. 通常常来说,在堆上分配内存比在栈上分配内存效率更高 </p><p> C. 当我预先知道待分配内存大小时,我就可以直接在栈上分配内存,只要不超过当前操作系统的可用内存大小,就永远会成功 </p><p> D. 内存泄漏就是指当A程序申请一块内存时,有可能操作系统把B程序的一块内存先交给A程序使用,等A程序结束后再返回给B程序,在内存借用的这段时间内,B程序就产生了内存泄漏</p><p>【解析】栈上分配内存效率更高;栈上申请内存并不总是成功;内存泄露是使用完成之后未回收。</p><a id="more"></a><p>三、在公司局域网上ping <a href="http://www.bilibili.com" target="_blank" rel="noopener">www.bilibili.com</a> 一定不涉及的网络协议是( )。</p><p><strong>A. UDP</strong></p><p>B. DNS</p><p>C. ICMP</p><p>D. RAAP</p><p>【解析】。</p><p>四、有Area和City两个表,两表的数据如下所示: </p><table><thead><tr><th>Area:</th><th></th><th></th><th>City</th><th></th><th></th></tr></thead><tbody><tr><td>ID</td><td>Name</td><td></td><td>ID</td><td>Name</td><td>AreaID</td></tr><tr><td>1</td><td>North</td><td></td><td>1</td><td>北京</td><td>1</td></tr><tr><td>2</td><td>South</td><td></td><td>2</td><td>上海</td><td>2</td></tr><tr><td>3</td><td>East</td><td></td><td>3</td><td>广州</td><td>3</td></tr><tr><td>4</td><td>West</td><td></td><td>4</td><td>深圳</td><td>4</td></tr><tr><td>null</td><td>null</td><td></td><td>5</td><td>null</td><td>null</td></tr></tbody></table><p>关于下面的sql语句,描述正确的是( )。 </p><p>select * form City left join Area on City_AreaID = Area.ID where AreaID>0 group by AreaID having count(Region)>0 order by count(Region) desc limit 1; </p><p>A.该SQL执行会形成City和Area两表的笛卡尔积 </p><p><strong>B.该语句执行顺序上,会先执行where再执行having再执行order by最后执行limit</strong> </p><p>C.该语句执行顺序上,会先执行from,再执行join,再执行where </p><p>D.select <em> form City left join Area on City_AreaID = Area.ID 和select </em> form City inner join Area on City_AreaID = Area.ID这两条SQL语句执行的结果是不同的</p><p>五、客户端C和服务器S之间建立了一个TCP连接,TCP最大段长度为2KB,客户端C当前的拥塞窗口是16KB,向服务器S连续发送2个最大段之后,成功接收到服务器S发送的第一段确认段,确认段中通告的接收窗口大小是8KB,那么此时客户端C还可以向服务器S发送最大字节数是( )。 </p><p> A. 16KB </p><p> B. 14KB </p><p> C. 8KB </p><p> <strong>D. 6KB</strong> </p><p>【解析】 min(16, 8) - 2 = 8-2=6。</p><p>六、下列关于linux中kernel space和user space描述错误的是()</p><p>A.user space不能直接对文件进行写操作</p><p><strong>B.程序代码能手动指定在哪个space中运行</strong></p><p>C.user space不能直接创建进程</p><p>D.user space和kernel space的运行空间是相互隔离的</p><p>七、采用递归方式对顺序表进行快速排序,下列关于递归次数的叙述中,正确的是()</p><ul><li>递归次数与初始数据的排列次序无关</li><li>每次划分后,先处理较长的分区可以减少递归次数</li><li>每次划分后,先处理较短的分区可以减少递归次数</li><li><strong>递归次数与每次划分后得到的分区处理顺序无关</strong></li></ul><p>【解析】递归次数与各元素的初始排列有关,认为是固定的。如果每一次划分后分区比较平衡,则递归次数少;如果划分后分区不平衡,则递归次数多。递归次数与处理顺序无关。</p><p>每次划分后,先处理较短的分区可以减少<strong>递归深度</strong>。</p><h2 id="1-24点游戏"><a href="#1-24点游戏" class="headerlink" title="1. 24点游戏"></a>1. 24点游戏</h2><p>给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利。</p><figure class="highlight html"><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">Input:</span><br><span class="line">7,2,1,10</span><br><span class="line"></span><br><span class="line">Output:</span><br><span class="line">true</span><br></pre></td></tr></table></figure><p><strong>暴力法求解,使用三层循环。</strong></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="class"><span class="keyword">class</span> <span class="title">Solution</span></span>{</span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">Game24Points</span> <span class="params">(<span class="keyword">int</span>[] arr)</span> </span>{</span><br><span class="line"> <span class="comment">// write code here</span></span><br><span class="line"> List<Double> list = <span class="keyword">new</span> ArrayList<>();</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> num : arr){</span><br><span class="line"> list.add((<span class="keyword">double</span>) num);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> dfs(list);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">boolean</span> <span class="title">dfs</span><span class="params">(List<Double> list)</span></span>{</span><br><span class="line"> <span class="keyword">if</span>(list.size() == <span class="number">1</span>){</span><br><span class="line"> <span class="keyword">if</span>(Math.abs(list.get(<span class="number">0</span>) - <span class="number">24.0</span>) < <span class="number">0.001</span>){</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>; i < list.size(); i++){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=i+<span class="number">1</span>; j < list.size(); j++){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">double</span> c : calc(list.get(i), list.get(j))){</span><br><span class="line"> List<Double> nextStep = <span class="keyword">new</span> ArrayList<>();</span><br><span class="line"></span><br><span class="line"> nextStep.add(c);</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> k = <span class="number">0</span>; k < list.size(); k++){</span><br><span class="line"> <span class="keyword">if</span>(k==j || k==i) <span class="keyword">continue</span>;</span><br><span class="line"> nextStep.add(list.get(k));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(dfs(nextStep)){</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line"> }</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> <span class="keyword">false</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> List<Double> <span class="title">calc</span><span class="params">(<span class="keyword">double</span> a, <span class="keyword">double</span> b)</span></span>{</span><br><span class="line"> List<Double> result = Arrays.asList(a+b, a-b, b-a, a*b, a/b, b/a);</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="2-括号匹配"><a href="#2-括号匹配" class="headerlink" title="2. 括号匹配"></a>2. 括号匹配</h2><p>给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串,判断字符串是否有效。</p><figure class="highlight html"><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">Input:</span><br><span class="line">([{}])]</span><br><span class="line"></span><br><span class="line">Output:</span><br><span class="line">false</span><br><span class="line"></span><br><span class="line">有效字符串需满足:</span><br><span class="line">1. 左括号必须用相同类型的右括号闭合。</span><br><span class="line">2. 左括号必须以正确的顺序闭合。</span><br><span class="line">注意空字符串可被认为是有效字符串。</span><br></pre></td></tr></table></figure><p><a href="https://leetcode.com/problems/valid-parentheses/description/" target="_blank" rel="noopener">Leetcode</a> / <a href="https://leetcode-cn.com/problems/valid-parentheses/description/" target="_blank" rel="noopener">力扣</a> 简单问题,使用一个栈解决。</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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">isValid</span><span class="params">(String s)</span> </span>{</span><br><span class="line"> Stack<Character> stack = <span class="keyword">new</span> Stack<>();</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">char</span> c : s.toCharArray()) {</span><br><span class="line"> <span class="keyword">if</span> (c == <span class="string">'('</span> || c == <span class="string">'{'</span> || c == <span class="string">'['</span>) {</span><br><span class="line"> stack.push(c);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">if</span> (stack.isEmpty()) {</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">char</span> cStack = stack.pop();</span><br><span class="line"> <span class="keyword">boolean</span> b1 = c == <span class="string">')'</span> && cStack != <span class="string">'('</span>;</span><br><span class="line"> <span class="keyword">boolean</span> b2 = c == <span class="string">']'</span> && cStack != <span class="string">'['</span>;</span><br><span class="line"> <span class="keyword">boolean</span> b3 = c == <span class="string">'}'</span> && cStack != <span class="string">'{'</span>;</span><br><span class="line"> <span class="keyword">if</span> (b1 || b2 || b3) {</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">false</span>;</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> stack.isEmpty();</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="3-一个找零问题"><a href="#3-一个找零问题" class="headerlink" title="3. 一个找零问题"></a>3. 一个找零问题</h2><p>某国的货币系统包含面值1元、4元、16元、64元共计4种硬币,以及面值1024元的纸币。现在小Y使用1024元的纸币购买了一件价值为N的商品,请问最少他会收到多少硬币?</p><figure class="highlight plain"><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">Input:</span><br><span class="line">200</span><br><span class="line">Output:</span><br><span class="line">17</span><br></pre></td></tr></table></figure><p><strong>动态规划求解</strong></p><ol><li>利用背包问题进行参考,购买的物品价值为N,给定的面值选择的硬币种类选择,其额度是V = {1,4,16,64},剩余金额为M = 1024 - N;问应该如何选择硬币,使得到的硬币数量为最少??</li><li>将其转化为:令 <strong>dp[j]</strong> 表示在前 <strong>j</strong> 个硬币中能够等于在 <strong>i</strong> 的额度中的M的价值,则可以得到如下的动态规划函数:<br>得到状态转移方程:<br>(1) dp[0] = 0<br>(2) dp[j] = min( dp[j], dp[ j - coins[i] ] + 1 ) j <= M</li></ol><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="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span> <span class="title">GetCoinCount</span> <span class="params">(<span class="keyword">int</span> N)</span> </span>{</span><br><span class="line"> <span class="comment">// 需要找零的面值</span></span><br><span class="line"> <span class="keyword">int</span> M = <span class="number">1024</span> - N;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">int</span>[] dp = <span class="keyword">new</span> <span class="keyword">int</span>[<span class="number">1024</span>];</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">1</span>; i <= M; i++){</span><br><span class="line"> dp[i] = <span class="number">99999</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">int</span>[] coins = <span class="keyword">new</span> <span class="keyword">int</span>[]{<span class="number">1</span>,<span class="number">4</span>,<span class="number">16</span>,<span class="number">64</span>};</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> v : coins){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j = v; j <= M; j++){</span><br><span class="line"> dp[j] = Math.min(dp[j], dp[j-v] + <span class="number">1</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">int</span> ret = dp[M];</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> ret;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><p><strong>直接求解</strong></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></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> cnum1,cnum2,cnum3,cnum4;</span><br><span class="line">cnum1=(<span class="number">1024</span>-n)/<span class="number">64</span>; <span class="comment">//64元硬币的数量 </span></span><br><span class="line">cnum2=((<span class="number">1024</span>-n)%<span class="number">64</span>)/<span class="number">16</span>; <span class="comment">//16元硬币的数量 </span></span><br><span class="line">cnum3=(((<span class="number">1024</span>-n)%<span class="number">64</span>)%<span class="number">16</span>)/<span class="number">4</span>; <span class="comment">//4元硬币的数量 </span></span><br><span class="line">cnum4=(<span class="number">1024</span>-n)-(cnum1*<span class="number">64</span>+cnum2*<span class="number">16</span>+cnum3*<span class="number">4</span>); <span class="comment">//1元硬币的数量</span></span><br><span class="line"><span class="keyword">int</span> result = cnum1+cnum2+cnum3+cnum4;</span><br><span class="line"></span><br><span class="line">or</span><br><span class="line"> </span><br><span class="line">N = <span class="number">1024</span>-N;</span><br><span class="line"><span class="keyword">int</span> count = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">int</span> coins[<span class="number">4</span>] = {<span class="number">64</span>,<span class="number">16</span>,<span class="number">4</span>,<span class="number">1</span>};</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<<span class="number">4</span>;i++){</span><br><span class="line"> count += N/coins[i];</span><br><span class="line"> N = N % coins[i];</span><br><span class="line">}</span><br><span class="line"><span class="keyword">int</span> result = count;</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p>30道选择题,三道编程题。</p>
<h2 id="若干选择题"><a href="#若干选择题" class="headerlink" title="若干选择题"></a>若干选择题</h2><p>一、以下说法正确的是( )。 </p>
<p> <strong>A. 由先序序列、中序序列可以还原出树的原貌</strong> </p>
<p> B. 200,190,150,170,180,140,155,160,165,120是一个最大堆 </p>
<p> C. 排序之前必须把所有待排数据加载到内存 </p>
<p> D. 给定一组输入,可以输出一颗唯一的哈夫曼树</p>
<p>二、请选择正确的描述。( ) </p>
<p> <strong>A. 静态变量和全局变量是在程序一开始时分配内存的,这部分内存无法回收,直至程序结束</strong> </p>
<p> B. 通常常来说,在堆上分配内存比在栈上分配内存效率更高 </p>
<p> C. 当我预先知道待分配内存大小时,我就可以直接在栈上分配内存,只要不超过当前操作系统的可用内存大小,就永远会成功 </p>
<p> D. 内存泄漏就是指当A程序申请一块内存时,有可能操作系统把B程序的一块内存先交给A程序使用,等A程序结束后再返回给B程序,在内存借用的这段时间内,B程序就产生了内存泄漏</p>
<p>【解析】栈上分配内存效率更高;栈上申请内存并不总是成功;内存泄露是使用完成之后未回收。</p>
</summary>
<category term="学习笔记" scheme="http://bwael.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="学习笔记" scheme="http://bwael.com/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="算法" scheme="http://bwael.com/tags/%E7%AE%97%E6%B3%95/"/>
<category term="笔试" scheme="http://bwael.com/tags/%E7%AC%94%E8%AF%95/"/>
</entry>
<entry>
<title>网易笔试(内推)- 20200808 - Java后端开发</title>
<link href="http://bwael.com/2020/08/10/Test-Netease-20200808/"/>
<id>http://bwael.com/2020/08/10/Test-Netease-20200808/</id>
<published>2020-08-10T08:46:10.000Z</published>
<updated>2020-08-10T09:07:23.660Z</updated>
<content type="html"><![CDATA[<p>笔试一共四道编程题,共100min:imp:。</p><p>鄙人全军覆没~:innocent:</p><p>下面是大佬的题解~</p><h2 id="1-素数的个数"><a href="#1-素数的个数" class="headerlink" title="1. 素数的个数"></a>1. 素数的个数</h2><p>给出一个包含n个正整数的数组a,把a[i]拆分为若干个和为a[i]的素数,求拆分后<strong>最多</strong>能有多少个素数。</p><figure class="highlight html"><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></pre></td><td class="code"><pre><span class="line">第一行数据为n,表示数组长度,第二行为n个元素。</span><br><span class="line">输入:</span><br><span class="line">3</span><br><span class="line">1 1 1</span><br><span class="line">输出:</span><br><span class="line">0</span><br><span class="line">不可拆分</span><br><span class="line"> </span><br><span class="line">输入:</span><br><span class="line">4</span><br><span class="line">1 3 5 7</span><br><span class="line">输出:</span><br><span class="line">6</span><br><span class="line">1为0个,3为1个,5为(2,3),7为(2,2,3)</span><br></pre></td></tr></table></figure><a id="more"></a><p><strong>根据规律可得:nums[i]/2就是该元素可以分出的素数个数。</strong>发现自己真的想多了,原来是在找规律。</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.Scanner;</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"> Scanner sc = <span class="keyword">new</span> Scanner(System.in);</span><br><span class="line"> <span class="keyword">int</span> len = sc.nextInt();</span><br><span class="line"> <span class="keyword">int</span>[] nums = <span class="keyword">new</span> <span class="keyword">int</span>[len];</span><br><span class="line"> <span class="keyword">long</span> result = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < nums.length; i++) {</span><br><span class="line"> nums[i] = sc.nextInt();</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//规律:nums[i]/2就是nums[i]可以分出的素数个数</span></span><br><span class="line"> result += nums[i] / <span class="number">2</span>;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> System.out.println(result);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="2-字典序最小的排列"><a href="#2-字典序最小的排列" class="headerlink" title="2. 字典序最小的排列"></a>2. 字典序最小的排列</h2><p>没做,题目让我看蒙了:disappointed:。</p><p>给出一个长度为m的序列T,求一个长度为n且字典序最小的排列S,要求不改变原序列中元素的相对位置。</p><figure class="highlight html"><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">第一行输入两个正整数n和m</span><br><span class="line">第二行输入m个数,表示序列</span><br><span class="line">5 3</span><br><span class="line">2 1 5</span><br><span class="line">输出</span><br><span class="line">2 1 3 4 5</span><br></pre></td></tr></table></figure><p>合并数组 + 双指针。先通过HashSet取出缺失的元素,组成nums2数组。需要result数组的注意第一个元素,nums1和nums2的第一个元素,谁小,先存谁。</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><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.HashSet;</span><br><span class="line"><span class="keyword">import</span> java.util.Scanner;</span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Solution</span></span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"> Scanner sc = <span class="keyword">new</span> Scanner(System.in);</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">int</span> len = sc.nextInt();</span><br><span class="line"> <span class="keyword">int</span> len1 = sc.nextInt();</span><br><span class="line"> <span class="keyword">int</span>[] nums1 = <span class="keyword">new</span> <span class="keyword">int</span>[len1];</span><br><span class="line"> </span><br><span class="line"> HashSet<Integer> set = <span class="keyword">new</span> HashSet<>();</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<nums1.length;i++){</span><br><span class="line"> nums1[i] = sc.nextInt();</span><br><span class="line"> set.add(nums1[i]);</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//nums2,长度为len-len1,存放互补的元素</span></span><br><span class="line"> <span class="keyword">int</span>[] nums2 = <span class="keyword">new</span> <span class="keyword">int</span>[len-len1];</span><br><span class="line"> <span class="keyword">int</span> index = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i<=len;i++){</span><br><span class="line"> <span class="keyword">if</span>(!set.contains(i)){</span><br><span class="line"> nums2[index++] = i;</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="comment"> i指针用于控制nums1移动</span></span><br><span class="line"><span class="comment"> j指针用于控制nums2移动</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> </span><br><span class="line"> <span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">int</span> j = <span class="number">0</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">int</span>[] result = <span class="keyword">new</span> <span class="keyword">int</span>[len];</span><br><span class="line"> <span class="keyword">int</span> Resultindex = <span class="number">0</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//谁的第一个小谁就先存</span></span><br><span class="line"> <span class="keyword">if</span>(nums1[<span class="number">0</span>] < nums2[<span class="number">0</span>]){</span><br><span class="line"> result[Resultindex++] = nums1[<span class="number">0</span>];</span><br><span class="line"> i=<span class="number">1</span>;</span><br><span class="line"> }<span class="keyword">else</span>{</span><br><span class="line"> result[Resultindex++] = nums2[<span class="number">0</span>];</span><br><span class="line"> j=<span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">while</span>(i < nums1.length && j < nums2.length){</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//谁小存谁</span></span><br><span class="line"> <span class="keyword">if</span>(nums1[i] < nums2[j]){</span><br><span class="line"> result[Resultindex++] = nums1[i++];</span><br><span class="line"> }<span class="keyword">else</span>{</span><br><span class="line"> result[Resultindex++] = nums2[j++];</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="keyword">while</span>(i == nums1.length && j < nums2.length){</span><br><span class="line"> <span class="comment">//如果nums1完但nums2未完,存入nums2</span></span><br><span class="line"> result[Resultindex++] = nums2[j++];</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">while</span>(i < nums1.length && j == nums2.length){</span><br><span class="line"> <span class="comment">//如果nums2完但nums1未完,存入nums1</span></span><br><span class="line"> result[Resultindex++] = nums1[i++];</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> k=<span class="number">0</span>;k<result.length-<span class="number">1</span>;k++){</span><br><span class="line"> System.out.print(result[k] + <span class="string">" "</span>);</span><br><span class="line"> }</span><br><span class="line"> System.out.print(result[result.length-<span class="number">1</span>]);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="3-丢弃最少物品"><a href="#3-丢弃最少物品" class="headerlink" title="3. 丢弃最少物品"></a>3. 丢弃最少物品</h2><p><strong>好题好题!</strong></p><p>给出n个物品,每个物品都有自己的价值,每个物品只有一件,这些物品需要分给两个人,要求分配完之后,两个人的物品价值相同。分配完成之后,会丢弃剩下的物品,求<strong>最少</strong>要丢弃多少物品。</p><figure class="highlight html"><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><br><span class="line">输入第一行为总的测试数据个数,第二行为物品个数n,第三行为n个物品的价值。</span><br><span class="line">1</span><br><span class="line">5</span><br><span class="line">30 60 5 15 30</span><br><span class="line">输出</span><br><span class="line">20 丢弃5和15,把60分配给第一个人,2个30分配给第二个人。</span><br></pre></td></tr></table></figure><p>根据大佬的思路:dfs回溯 + 分与不分,实在是没想到dfs还有这种用法,之前只会用dfs计算组合,这次算是学到了。</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.Scanner;</span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Solution</span></span>{</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span> result = Integer.MAX_VALUE;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span> sum = <span class="number">0</span>;</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"> Scanner sc = <span class="keyword">new</span> Scanner(System.in);</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">int</span> group = sc.nextInt();</span><br><span class="line"> <span class="comment">//以后多组读入可以采用这种方式,学到了</span></span><br><span class="line"> <span class="keyword">while</span>(group-- > <span class="number">0</span>){</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">int</span> len = sc.nextInt();</span><br><span class="line"> <span class="keyword">int</span>[] nums = <span class="keyword">new</span> <span class="keyword">int</span>[len];</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<nums.length;i++){</span><br><span class="line"> nums[i] = sc.nextInt();</span><br><span class="line"> sum += nums[i];</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//index从0开始,第一个人拥有的为result1,第二个人用于的为result2。都初始为0</span></span><br><span class="line"> dfs(nums,<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>);</span><br><span class="line"> </span><br><span class="line"> System.out.println(result);</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">private</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">dfs</span><span class="params">(<span class="keyword">int</span>[] nums, <span class="keyword">int</span> index, <span class="keyword">int</span> result1, <span class="keyword">int</span> result2)</span> </span>{</span><br><span class="line"> <span class="comment">//递归出口</span></span><br><span class="line"> <span class="keyword">if</span>(index == nums.length){</span><br><span class="line"> <span class="comment">//当result1 == result2时</span></span><br><span class="line"> <span class="keyword">if</span>(result1 == result2){</span><br><span class="line"> result = Math.min(result,sum - <span class="number">2</span>*result1);</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="comment">//分为3中情况,</span></span><br><span class="line"> <span class="comment">/*</span></span><br><span class="line"><span class="comment"> 1. 谁都不给</span></span><br><span class="line"><span class="comment"> 2. 给第一个:result1 + nums[index]</span></span><br><span class="line"><span class="comment"> 3. 给第二个:result2 + nums[index]</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> dfs(nums,index+<span class="number">1</span>,result1,result2);</span><br><span class="line"> dfs(nums,index+<span class="number">1</span>,result1+nums[index],result2);</span><br><span class="line"> dfs(nums,index+<span class="number">1</span>,result1,result2+nums[index]);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="4-运送货物"><a href="#4-运送货物" class="headerlink" title="4. 运送货物"></a>4. 运送货物</h2><p>第四题看了一眼,emmm,是我惹不起的…</p>]]></content>
<summary type="html">
<p>笔试一共四道编程题,共100min:imp:。</p>
<p>鄙人全军覆没~:innocent:</p>
<p>下面是大佬的题解~</p>
<h2 id="1-素数的个数"><a href="#1-素数的个数" class="headerlink" title="1. 素数的个数"></a>1. 素数的个数</h2><p>给出一个包含n个正整数的数组a,把a[i]拆分为若干个和为a[i]的素数,求拆分后<strong>最多</strong>能有多少个素数。</p>
<figure class="highlight html"><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></pre></td><td class="code"><pre><span class="line">第一行数据为n,表示数组长度,第二行为n个元素。</span><br><span class="line">输入:</span><br><span class="line">3</span><br><span class="line">1 1 1</span><br><span class="line">输出:</span><br><span class="line">0</span><br><span class="line">不可拆分</span><br><span class="line"> </span><br><span class="line">输入:</span><br><span class="line">4</span><br><span class="line">1 3 5 7</span><br><span class="line">输出:</span><br><span class="line">6</span><br><span class="line">1为0个,3为1个,5为(2,3),7为(2,2,3)</span><br></pre></td></tr></table></figure>
</summary>
<category term="学习笔记" scheme="http://bwael.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="学习笔记" scheme="http://bwael.com/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="算法" scheme="http://bwael.com/tags/%E7%AE%97%E6%B3%95/"/>
<category term="笔试" scheme="http://bwael.com/tags/%E7%AC%94%E8%AF%95/"/>
</entry>
<entry>
<title>剑指Offer 17.打印从 1 到最大的 n 位数</title>
<link href="http://bwael.com/2020/08/10/offer-17/"/>
<id>http://bwael.com/2020/08/10/offer-17/</id>
<published>2020-08-10T08:42:01.000Z</published>
<updated>2020-08-10T09:05:38.399Z</updated>
<content type="html"><![CDATA[<p><strong>剑指Offer 17.打印从 1 到最大的 n 位数</strong></p><p><a href="https://leetcode-cn.com/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/submissions/" target="_blank" rel="noopener">剑指 Offer 17. 打印从1到最大的n位数 - LeetCode</a></p><p>2020-8-10 16:20:50</p><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数即 999。</p><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><p>在测试环境中可能使用简单方法就可以通过测试用例。这里实际上考察大数的处理。</p><p>由于 n 可能会非常大,因此不能直接用 int 表示数字,而是用 char 数组进行存储。</p><p><strong>只要求输出int类型:</strong></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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> </span>{</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">int</span>[] printNumbers(<span class="keyword">int</span> n) {</span><br><span class="line"> <span class="keyword">int</span> end = (<span class="keyword">int</span>)Math.pow(<span class="number">10</span>, n) - <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">int</span>[] res = <span class="keyword">new</span> <span class="keyword">int</span>[end];</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>; i < end; i++)</span><br><span class="line"> res[i] = i + <span class="number">1</span>;</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><a id="more"></a><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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> </span>{</span><br><span class="line"> <span class="keyword">int</span>[] res;</span><br><span class="line"> <span class="keyword">int</span> nine = <span class="number">0</span>, count = <span class="number">0</span>, start, n;</span><br><span class="line"> <span class="keyword">char</span>[] num, loop = {<span class="string">'0'</span>, <span class="string">'1'</span>, <span class="string">'2'</span>, <span class="string">'3'</span>, <span class="string">'4'</span>, <span class="string">'5'</span>, <span class="string">'6'</span>, <span class="string">'7'</span>, <span class="string">'8'</span>, <span class="string">'9'</span>};</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">int</span>[] printNumbers(<span class="keyword">int</span> n) {</span><br><span class="line"> <span class="keyword">this</span>.n = n;</span><br><span class="line"> res = <span class="keyword">new</span> <span class="keyword">int</span>[(<span class="keyword">int</span>)Math.pow(<span class="number">10</span>, n) - <span class="number">1</span>];</span><br><span class="line"> num = <span class="keyword">new</span> <span class="keyword">char</span>[n];</span><br><span class="line"> start = n - <span class="number">1</span>;</span><br><span class="line"> dfs(<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 class="function"><span class="keyword">void</span> <span class="title">dfs</span><span class="params">(<span class="keyword">int</span> x)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span>(x == n) {</span><br><span class="line"> String s = String.valueOf(num).substring(start);</span><br><span class="line"> <span class="keyword">if</span>(!s.equals(<span class="string">"0"</span>)) res[count++] = Integer.parseInt(s);</span><br><span class="line"> <span class="keyword">if</span>(n - start == nine) start--;</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>(<span class="keyword">char</span> i : loop) {</span><br><span class="line"> <span class="keyword">if</span>(i == <span class="string">'9'</span>) nine++;</span><br><span class="line"> num[x] = i;</span><br><span class="line"> dfs(x + <span class="number">1</span>);</span><br><span class="line"> }</span><br><span class="line"> nine--;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><strong>大数打印:</strong></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="class"><span class="keyword">class</span> <span class="title">Solution</span> </span>{</span><br><span class="line"> StringBuilder res;</span><br><span class="line"> <span class="keyword">int</span> nine = <span class="number">0</span>, count = <span class="number">0</span>, start, n;</span><br><span class="line"> <span class="keyword">char</span>[] num, loop = {<span class="string">'0'</span>, <span class="string">'1'</span>, <span class="string">'2'</span>, <span class="string">'3'</span>, <span class="string">'4'</span>, <span class="string">'5'</span>, <span class="string">'6'</span>, <span class="string">'7'</span>, <span class="string">'8'</span>, <span class="string">'9'</span>};</span><br><span class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">printNumbers</span><span class="params">(<span class="keyword">int</span> n)</span> </span>{</span><br><span class="line"> <span class="keyword">this</span>.n = n;</span><br><span class="line"> res = <span class="keyword">new</span> StringBuilder(); <span class="comment">// 数字字符串集</span></span><br><span class="line"> num = <span class="keyword">new</span> <span class="keyword">char</span>[n]; <span class="comment">// 定义长度为 n 的字符列表</span></span><br><span class="line"> start = n - <span class="number">1</span>;</span><br><span class="line"> dfs(<span class="number">0</span>); <span class="comment">// 开启全排列递归</span></span><br><span class="line"> res.deleteCharAt(res.length() - <span class="number">1</span>); <span class="comment">// 删除最后多余的逗号</span></span><br><span class="line"> <span class="keyword">return</span> res.toString(); <span class="comment">// 转化为字符串并返回</span></span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">dfs</span><span class="params">(<span class="keyword">int</span> x)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span>(x == n) { <span class="comment">// 终止条件:已固定完所有位</span></span><br><span class="line"> String s = String.valueOf(num).substring(start);</span><br><span class="line"> <span class="keyword">if</span>(!s.equals(<span class="string">"0"</span>)) </span><br><span class="line"> res.append(s + <span class="string">","</span>); <span class="comment">// 拼接 num 并添加至 res 尾部,使用逗号隔开</span></span><br><span class="line"> <span class="keyword">if</span>(n - start == nine) start--;</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>(<span class="keyword">char</span> i : loop) { <span class="comment">// 遍历 ‘0‘ - ’9‘</span></span><br><span class="line"> <span class="keyword">if</span>(i == <span class="string">'9'</span>) nine++;</span><br><span class="line"> num[x] = i; <span class="comment">// 固定第 x 位为 i</span></span><br><span class="line"> dfs(x + <span class="number">1</span>); <span class="comment">// 开启固定第 x + 1 位</span></span><br><span class="line"> }</span><br><span class="line"> nine--;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p><strong>剑指Offer 17.打印从 1 到最大的 n 位数</strong></p>
<p><a href="https://leetcode-cn.com/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/submissions/" target="_blank" rel="noopener">剑指 Offer 17. 打印从1到最大的n位数 - LeetCode</a></p>
<p>2020-8-10 16:20:50</p>
<h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数即 999。</p>
<h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><p>在测试环境中可能使用简单方法就可以通过测试用例。这里实际上考察大数的处理。</p>
<p>由于 n 可能会非常大,因此不能直接用 int 表示数字,而是用 char 数组进行存储。</p>
<p><strong>只要求输出int类型:</strong></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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> </span>&#123;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">int</span>[] printNumbers(<span class="keyword">int</span> n) &#123;</span><br><span class="line"> <span class="keyword">int</span> end = (<span class="keyword">int</span>)Math.pow(<span class="number">10</span>, n) - <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">int</span>[] res = <span class="keyword">new</span> <span class="keyword">int</span>[end];</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; end; i++)</span><br><span class="line"> res[i] = i + <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">return</span> res;</span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
</summary>
<category term="学习笔记" scheme="http://bwael.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="学习笔记" scheme="http://bwael.com/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="LeetCode" scheme="http://bwael.com/tags/LeetCode/"/>
<category term="剑指Offer" scheme="http://bwael.com/tags/%E5%89%91%E6%8C%87Offer/"/>
</entry>
<entry>
<title>LeetCode 字符串(一) - LeetCode-242、409</title>
<link href="http://bwael.com/2020/08/07/leetcode-String-01-242-409/"/>
<id>http://bwael.com/2020/08/07/leetcode-String-01-242-409/</id>
<published>2020-08-07T03:02:43.000Z</published>
<updated>2020-08-08T03:06:01.563Z</updated>
<content type="html"><![CDATA[<h2 id="1-字符串循环移位包含"><a href="#1-字符串循环移位包含" class="headerlink" title="1. 字符串循环移位包含"></a>1. 字符串循环移位包含</h2><p><a href="https://cyc2018.github.io/CS-Notes/#/notes/Leetcode 题解 - 字符串?id" target="_blank" rel="noopener">编程之美 3.1</a></p><figure class="highlight html"><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">s1 = AABCD, s2 = CDAA</span><br><span class="line">Return : true</span><br></pre></td></tr></table></figure><p>给定两个字符串 s1 和 s2,要求判定 s2 是否能够被 s1 做循环移位得到的字符串包含。</p><p>s1 进行循环移位的结果是 s1s1 的子字符串,因此只要判断 s2 是否是 s1s1 的子字符串即可。</p><a id="more"></a><h2 id="2-字符串循环移位"><a href="#2-字符串循环移位" class="headerlink" title="2. 字符串循环移位"></a>2. 字符串循环移位</h2><p><a href="https://cyc2018.github.io/CS-Notes/#/notes/Leetcode 题解 - 字符串?id" target="_blank" rel="noopener">编程之美 2.17</a></p><figure class="highlight html"><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">s = "abcd123" k = 3</span><br><span class="line">Return "123abcd"</span><br></pre></td></tr></table></figure><p>将字符串向右循环移动 k 位。</p><p>将 abcd123 中的 abcd 和 123 单独翻转,得到 dcba321,然后对整个字符串进行翻转,得到 123abcd。</p><h2 id="3-字符串中单词的翻转"><a href="#3-字符串中单词的翻转" class="headerlink" title="3. 字符串中单词的翻转"></a>3. 字符串中单词的翻转</h2><p><a href="https://cyc2018.github.io/CS-Notes/#/notes/Leetcode 题解 - 字符串?id" target="_blank" rel="noopener">程序员代码面试指南</a></p><figure class="highlight html"><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">s = "I am a student"</span><br><span class="line">Return "student a am I"</span><br></pre></td></tr></table></figure><p>将每个单词翻转,然后将整个字符串翻转。</p><h2 id="242-两个字符串包含的字符是否完全相同"><a href="#242-两个字符串包含的字符是否完全相同" class="headerlink" title="242. 两个字符串包含的字符是否完全相同"></a>242. 两个字符串包含的字符是否完全相同</h2><p>242.Valid Anagram (Easy)</p><p><a href="https://leetcode.com/problems/valid-anagram/description/" target="_blank" rel="noopener">Leetcode</a> / <a href="https://leetcode-cn.com/problems/valid-anagram/description/" target="_blank" rel="noopener">力扣</a></p><p>2020-7-18 16:17:33</p><h3 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h3><figure class="highlight html"><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">s = "anagram", t = "nagaram", return true.</span><br><span class="line">s = "rat", t = "car", return false.</span><br></pre></td></tr></table></figure><p>可以用 HashMap 来映射字符与出现次数,然后比较两个字符串出现的字符数量是否相同。</p><p>由于本题的字符串只包含 26 个小写字符,因此可以使用长度为 26 的整型数组对字符串出现的字符进行统计,不再使用 HashMap。</p><h3 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h3><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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">isAnagram</span><span class="params">(String s, String t)</span> </span>{</span><br><span class="line"> <span class="keyword">int</span>[] cnts = <span class="keyword">new</span> <span class="keyword">int</span>[<span class="number">26</span>];</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">char</span> c : s.toCharArray()){</span><br><span class="line"> cnts[c - <span class="string">'a'</span>] ++;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">char</span> c : t.toCharArray()){</span><br><span class="line"> cnts[c - <span class="string">'a'</span>] --;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> cnt : cnts){</span><br><span class="line"> <span class="keyword">if</span>(cnt != <span class="number">0</span>){</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line"><span class="comment">//直接排序法</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">isAnagram</span><span class="params">(String s, String t)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span> (s.length() != t.length()) {</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">char</span>[] str1 = s.toCharArray();</span><br><span class="line"> <span class="keyword">char</span>[] str2 = t.toCharArray();</span><br><span class="line"> Arrays.sort(str1);</span><br><span class="line"> Arrays.sort(str2);</span><br><span class="line"> <span class="keyword">return</span> Arrays.equals(str1, str2);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="409-最长回文串-计算一组字符集合可以组成的回文字符串的最大长度"><a href="#409-最长回文串-计算一组字符集合可以组成的回文字符串的最大长度" class="headerlink" title="409. 最长回文串 - 计算一组字符集合可以组成的回文字符串的最大长度"></a>409. 最长回文串 - 计算一组字符集合可以组成的回文字符串的最大长度</h2><p>409.Longest Palindrome (Easy)</p><p><a href="https://leetcode.com/problems/longest-palindrome/description/" target="_blank" rel="noopener">Leetcode</a> / <a href="https://leetcode-cn.com/problems/longest-palindrome/description/" target="_blank" rel="noopener">力扣</a></p><p>2020-8-7 21:35:31</p><h3 id="题目描述-1"><a href="#题目描述-1" class="headerlink" title="题目描述"></a>题目描述</h3><p>给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。</p><p>注意:<br>假设字符串的长度不会超过 1010。</p><figure class="highlight html"><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">示例 1:</span><br><span class="line"></span><br><span class="line">输入: "abccccdd"</span><br><span class="line">输出: 7</span><br><span class="line">解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。</span><br></pre></td></tr></table></figure><h3 id="解题思路-1"><a href="#解题思路-1" class="headerlink" title="解题思路"></a>解题思路</h3><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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">longestPalindrome</span><span class="params">(String s)</span> </span>{</span><br><span class="line"> <span class="keyword">int</span>[] cnts = <span class="keyword">new</span> <span class="keyword">int</span>[<span class="number">256</span>];</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">char</span> c : s.toCharArray()){</span><br><span class="line"> cnts[c]++;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">int</span> palindrome = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> cnt : cnts) {</span><br><span class="line"> palindrome += (cnt / <span class="number">2</span>) * <span class="number">2</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (palindrome < s.length()) {</span><br><span class="line"> palindrome++; <span class="comment">// 这个条件下 s 中一定有单个未使用的字符存在,可以把这个字符放到回文的最中间</span></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> palindrome;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h2 id="1-字符串循环移位包含"><a href="#1-字符串循环移位包含" class="headerlink" title="1. 字符串循环移位包含"></a>1. 字符串循环移位包含</h2><p><a href="https://cyc2018.github.io/CS-Notes/#/notes/Leetcode 题解 - 字符串?id" target="_blank" rel="noopener">编程之美 3.1</a></p>
<figure class="highlight html"><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">s1 = AABCD, s2 = CDAA</span><br><span class="line">Return : true</span><br></pre></td></tr></table></figure>
<p>给定两个字符串 s1 和 s2,要求判定 s2 是否能够被 s1 做循环移位得到的字符串包含。</p>
<p>s1 进行循环移位的结果是 s1s1 的子字符串,因此只要判断 s2 是否是 s1s1 的子字符串即可。</p>
</summary>
<category term="学习笔记" scheme="http://bwael.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="学习笔记" scheme="http://bwael.com/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="LeetCode" scheme="http://bwael.com/tags/LeetCode/"/>
<category term="字符串" scheme="http://bwael.com/tags/%E5%AD%97%E7%AC%A6%E4%B8%B2/"/>
</entry>
<entry>
<title>LeetCode 739.数组中元素与下一个比它大的元素之间的距离(每日温度)</title>
<link href="http://bwael.com/2020/08/06/leetcode-739/"/>
<id>http://bwael.com/2020/08/06/leetcode-739/</id>
<published>2020-08-06T14:24:17.000Z</published>
<updated>2020-08-06T14:26:21.447Z</updated>
<content type="html"><![CDATA[<p><strong>739.数组中元素与下一个比它大的元素之间的距离(每日温度)</strong></p><p>739.Daily Temperatures (Medium)</p><p><a href="https://leetcode.com/problems/daily-temperatures/description/" target="_blank" rel="noopener">Leetcode</a> / <a href="https://leetcode-cn.com/problems/daily-temperatures/description/" target="_blank" rel="noopener">力扣</a></p><p>2020-8-6 21:27:37</p><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><figure class="highlight html"><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">Input: [73, 74, 75, 71, 69, 72, 76, 73] </span><br><span class="line">Output: [1, 1, 4, 2, 1, 1, 0, 0]</span><br></pre></td></tr></table></figure><p>Or</p><figure class="highlight html"><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">请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。</span><br><span class="line"></span><br><span class="line">例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。</span><br><span class="line"></span><br><span class="line">提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。</span><br></pre></td></tr></table></figure><a id="more"></a><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><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="class"><span class="keyword">class</span> <span class="title">Solution</span> </span>{</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">int</span>[] dailyTemperatures(<span class="keyword">int</span>[] T) {</span><br><span class="line"> <span class="keyword">int</span> n = T.length;</span><br><span class="line"> <span class="keyword">int</span>[] dist = <span class="keyword">new</span> <span class="keyword">int</span>[n];</span><br><span class="line"> Stack<Integer> indexs = <span class="keyword">new</span> Stack<Integer>();</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>; i < n; i++){</span><br><span class="line"> <span class="keyword">while</span>(!indexs.isEmpty() && T[i] > T[indexs.peek()]){</span><br><span class="line"> <span class="keyword">int</span> preIndex = indexs.pop();</span><br><span class="line"> dist[preIndex] = i - preIndex;</span><br><span class="line"> }</span><br><span class="line"> indexs.add(i);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> dist;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p><strong>739.数组中元素与下一个比它大的元素之间的距离(每日温度)</strong></p>
<p>739.Daily Temperatures (Medium)</p>
<p><a href="https://leetcode.com/problems/daily-temperatures/description/" target="_blank" rel="noopener">Leetcode</a> / <a href="https://leetcode-cn.com/problems/daily-temperatures/description/" target="_blank" rel="noopener">力扣</a></p>
<p>2020-8-6 21:27:37</p>
<h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><figure class="highlight html"><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">Input: [73, 74, 75, 71, 69, 72, 76, 73] </span><br><span class="line">Output: [1, 1, 4, 2, 1, 1, 0, 0]</span><br></pre></td></tr></table></figure>
<p>Or</p>
<figure class="highlight html"><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">请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。</span><br><span class="line"></span><br><span class="line">例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。</span><br><span class="line"></span><br><span class="line">提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。</span><br></pre></td></tr></table></figure>
</summary>
<category term="学习笔记" scheme="http://bwael.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="学习笔记" scheme="http://bwael.com/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="LeetCode" scheme="http://bwael.com/tags/LeetCode/"/>
<category term="栈和队列" scheme="http://bwael.com/tags/%E6%A0%88%E5%92%8C%E9%98%9F%E5%88%97/"/>
</entry>
<entry>
<title>LeetCode 链表(一) - LeetCode-160、206、21、83</title>
<link href="http://bwael.com/2020/08/04/leetcode-LinkedList-01-160-206-21-83/"/>
<id>http://bwael.com/2020/08/04/leetcode-LinkedList-01-160-206-21-83/</id>
<published>2020-08-04T08:13:10.000Z</published>
<updated>2020-08-04T08:19:32.213Z</updated>
<content type="html"><![CDATA[<h2 id="160-找到两个链表的交点"><a href="#160-找到两个链表的交点" class="headerlink" title="160. 找到两个链表的交点"></a>160. 找到两个链表的交点</h2><p>160.Intersection of Two Linked Lists (Easy)</p><p><a href="https://leetcode.com/problems/intersection-of-two-linked-lists/description/" target="_blank" rel="noopener">Leetcode</a> / <a href="https://leetcode-cn.com/problems/intersection-of-two-linked-lists/description/" target="_blank" rel="noopener">力扣</a></p><p>2020-7-12 22:03:18</p><h3 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h3><p>找到两个单链表相交的起始节点。。</p><p>例如以下示例中 A 和 B 两个链表相交于 c1:</p><figure class="highlight html"><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">A: a1 → a2</span><br><span class="line"> ↘</span><br><span class="line"> c1 → c2 → c3</span><br><span class="line"> ↗</span><br><span class="line">B: b1 → b2 → b3</span><br></pre></td></tr></table></figure><p>但是不会出现以下相交的情况,因为每个节点只有一个 next 指针,也就只能有一个后继节点,而以下示例中节点 c 有两个后继节点。</p><figure class="highlight html"><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">A: a1 → a2 d1 → d2</span><br><span class="line"> ↘ ↗</span><br><span class="line"> c</span><br><span class="line"> ↗ ↘</span><br><span class="line">B: b1 → b2 → b3 e1 → e2</span><br></pre></td></tr></table></figure><p>要求时间复杂度为 O(N),空间复杂度为 O(1)。如果不存在交点则返回 null。</p><a id="more"></a><h3 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h3><p>设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a + c + b = b + c + a。</p><p>当访问 A 链表的指针访问到链表尾部时,令它从链表 B 的头部开始访问链表 B;同样地,当访问 B 链表的指针访问到链表尾部时,令它从链表 A 的头部开始访问链表 A。这样就能控制访问 A 和 B 两个链表的指针能同时访问到交点。</p><p>如果不存在交点,那么 a + b = b + a,以下实现代码中 l1 和 l2 会同时为 null,从而退出循环。</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></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"> * public class ListNode {</span></span><br><span class="line"><span class="comment"> * int val;</span></span><br><span class="line"><span class="comment"> * ListNode next;</span></span><br><span class="line"><span class="comment"> * ListNode(int x) {</span></span><br><span class="line"><span class="comment"> * val = x;</span></span><br><span class="line"><span class="comment"> * next = null;</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">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Solution</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> ListNode <span class="title">getIntersectionNode</span><span class="params">(ListNode headA, ListNode headB)</span> </span>{</span><br><span class="line"> ListNode l1 = headA;</span><br><span class="line"> ListNode l2 = headB;</span><br><span class="line"> <span class="comment">// 循环a+b次就可找出重复节点,即相交节点。X型相交不存在,每个节点只有一个 next 指针。</span></span><br><span class="line"> <span class="keyword">while</span>(l1 != l2){</span><br><span class="line"> l1 = (l1 == <span class="keyword">null</span>) ? headB : l1.next;</span><br><span class="line"> l2 = (l2 == <span class="keyword">null</span>) ? headA : l2.next;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> l2;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="206-反转链表"><a href="#206-反转链表" class="headerlink" title="206.反转链表"></a>206.反转链表</h2><p>206.Reverse Linked List (Easy)</p><p><a href="https://leetcode.com/problems/reverse-linked-list/description/" target="_blank" rel="noopener">Leetcode</a> / <a href="https://leetcode-cn.com/problems/reverse-linked-list/description/" target="_blank" rel="noopener">力扣</a></p><p>2020-8-3 22:13:31</p><h3 id="题目描述-1"><a href="#题目描述-1" class="headerlink" title="题目描述"></a>题目描述</h3><p>反转一个单链表。</p><figure class="highlight html"><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><br><span class="line"></span><br><span class="line">输入: 1->2->3->4->5->NULL</span><br><span class="line">输出: 5->4->3->2->1->NULL</span><br><span class="line">进阶:</span><br><span class="line">你可以迭代或递归地反转链表。你能否用两种方法解决这道题?</span><br></pre></td></tr></table></figure><h3 id="解题思路-1"><a href="#解题思路-1" class="headerlink" title="解题思路"></a>解题思路</h3><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> ListNode <span class="title">reverseList</span><span class="params">(ListNode head)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span> (head == <span class="keyword">null</span> || head.next == <span class="keyword">null</span>) {</span><br><span class="line"> <span class="keyword">return</span> head;</span><br><span class="line"> }</span><br><span class="line"> ListNode next = head.next;</span><br><span class="line"> ListNode newHead = reverseList(next);</span><br><span class="line"> next.next = head;</span><br><span class="line"> head.next = <span class="keyword">null</span>;</span><br><span class="line"> <span class="keyword">return</span> newHead;</span><br><span class="line">}</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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> ListNode <span class="title">reverseList</span><span class="params">(ListNode head)</span> </span>{</span><br><span class="line"> ListNode newHead = <span class="keyword">new</span> ListNode(-<span class="number">1</span>);</span><br><span class="line"> <span class="keyword">while</span> (head != <span class="keyword">null</span>) {</span><br><span class="line"> ListNode next = head.next;</span><br><span class="line"> head.next = newHead.next;</span><br><span class="line"> newHead.next = head;</span><br><span class="line"> head = next;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> newHead.next;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="21-合并两个有序的链表"><a href="#21-合并两个有序的链表" class="headerlink" title="21. 合并两个有序的链表"></a>21. 合并两个有序的链表</h2><p>21.Merge Two Sorted Lists (Easy)</p><p><a href="https://leetcode.com/problems/merge-two-sorted-lists/description/" target="_blank" rel="noopener">Leetcode</a> / <a href="https://leetcode-cn.com/problems/merge-two-sorted-lists/description/" target="_blank" rel="noopener">力扣</a></p><p>2020-8-4 14:38:30</p><h3 id="题目描述-2"><a href="#题目描述-2" class="headerlink" title="题目描述"></a>题目描述</h3><p>将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 </p><figure class="highlight html"><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">示例:</span><br><span class="line"></span><br><span class="line">输入:1->2->4, 1->3->4</span><br><span class="line">输出:1->1->2->3->4->4</span><br></pre></td></tr></table></figure><h3 id="解题思路-2"><a href="#解题思路-2" class="headerlink" title="解题思路"></a>解题思路</h3><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></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"> * public class ListNode {</span></span><br><span class="line"><span class="comment"> * int val;</span></span><br><span class="line"><span class="comment"> * ListNode next;</span></span><br><span class="line"><span class="comment"> * ListNode(int x) { val = x; }</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="class"><span class="keyword">class</span> <span class="title">Solution</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> ListNode <span class="title">mergeTwoLists</span><span class="params">(ListNode l1, ListNode l2)</span> </span>{</span><br><span class="line"> <span class="comment">//迭代法</span></span><br><span class="line"> <span class="comment">//在返回节点之前保持对节点的不变引用。</span></span><br><span class="line"> ListNode prehead = <span class="keyword">new</span> ListNode(-<span class="number">1</span>);</span><br><span class="line"></span><br><span class="line"> ListNode prev = prehead;</span><br><span class="line"> <span class="keyword">while</span> (l1 != <span class="keyword">null</span> && l2 != <span class="keyword">null</span>) {</span><br><span class="line"> <span class="keyword">if</span> (l1.val <= l2.val) {</span><br><span class="line"> prev.next = l1;</span><br><span class="line"> l1 = l1.next;</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> prev.next = l2;</span><br><span class="line"> l2 = l2.next;</span><br><span class="line"> }</span><br><span class="line"> prev = prev.next;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//在这一点上,l1和l2中的一个可以是非空的,所以连接</span></span><br><span class="line"> <span class="comment">//合并列表末尾的非空列表。</span></span><br><span class="line"> prev.next = l1 == <span class="keyword">null</span> ? l2 : l1;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> prehead.next;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><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="comment">//递归</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> ListNode <span class="title">mergeTwoLists</span><span class="params">(ListNode l1, ListNode l2)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span> (l1 == <span class="keyword">null</span>) <span class="keyword">return</span> l2;</span><br><span class="line"> <span class="keyword">if</span> (l2 == <span class="keyword">null</span>) <span class="keyword">return</span> l1;</span><br><span class="line"> <span class="keyword">if</span> (l1.val < l2.val) {</span><br><span class="line"> l1.next = mergeTwoLists(l1.next, l2);</span><br><span class="line"> <span class="keyword">return</span> l1;</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> l2.next = mergeTwoLists(l1, l2.next);</span><br><span class="line"> <span class="keyword">return</span> l2;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="83-从有序链表中删除重复节点"><a href="#83-从有序链表中删除重复节点" class="headerlink" title="83. 从有序链表中删除重复节点"></a>83. 从有序链表中删除重复节点</h2><p>83.Remove Duplicates from Sorted List (Easy)</p><p><a href="https://leetcode.com/problems/remove-duplicates-from-sorted-list/description/" target="_blank" rel="noopener">Leetcode</a> / <a href="https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/description/" target="_blank" rel="noopener">力扣</a></p><p>2020-8-4 15:02:21</p><h3 id="题目描述-3"><a href="#题目描述-3" class="headerlink" title="题目描述"></a>题目描述</h3><figure class="highlight html"><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">Given 1->1->2, return 1->2. </span><br><span class="line"></span><br><span class="line">Given 1->1->2->3->3, return 1->2->3.</span><br></pre></td></tr></table></figure><h3 id="解题思路-3"><a href="#解题思路-3" class="headerlink" title="解题思路"></a>解题思路</h3><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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> ListNode <span class="title">deleteDuplicates</span><span class="params">(ListNode head)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span>(head == <span class="keyword">null</span> || head.next == <span class="keyword">null</span>){</span><br><span class="line"> <span class="keyword">return</span> head;</span><br><span class="line"> }</span><br><span class="line"> head.next = deleteDuplicates(head.next);</span><br><span class="line"> <span class="keyword">return</span> head.val == head.next.val ? head.next:head;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h2 id="160-找到两个链表的交点"><a href="#160-找到两个链表的交点" class="headerlink" title="160. 找到两个链表的交点"></a>160. 找到两个链表的交点</h2><p>160.Intersection of Two Linked Lists (Easy)</p>
<p><a href="https://leetcode.com/problems/intersection-of-two-linked-lists/description/" target="_blank" rel="noopener">Leetcode</a> / <a href="https://leetcode-cn.com/problems/intersection-of-two-linked-lists/description/" target="_blank" rel="noopener">力扣</a></p>
<p>2020-7-12 22:03:18</p>
<h3 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h3><p>找到两个单链表相交的起始节点。。</p>
<p>例如以下示例中 A 和 B 两个链表相交于 c1:</p>
<figure class="highlight html"><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">A: a1 → a2</span><br><span class="line"> ↘</span><br><span class="line"> c1 → c2 → c3</span><br><span class="line"> ↗</span><br><span class="line">B: b1 → b2 → b3</span><br></pre></td></tr></table></figure>
<p>但是不会出现以下相交的情况,因为每个节点只有一个 next 指针,也就只能有一个后继节点,而以下示例中节点 c 有两个后继节点。</p>
<figure class="highlight html"><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">A: a1 → a2 d1 → d2</span><br><span class="line"> ↘ ↗</span><br><span class="line"> c</span><br><span class="line"> ↗ ↘</span><br><span class="line">B: b1 → b2 → b3 e1 → e2</span><br></pre></td></tr></table></figure>
<p>要求时间复杂度为 O(N),空间复杂度为 O(1)。如果不存在交点则返回 null。</p>
</summary>
<category term="学习笔记" scheme="http://bwael.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="学习笔记" scheme="http://bwael.com/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="LeetCode" scheme="http://bwael.com/tags/LeetCode/"/>
<category term="链表" scheme="http://bwael.com/tags/%E9%93%BE%E8%A1%A8/"/>
</entry>
<entry>
<title>0-1背包问题和LeetCode 416.分割等和子集</title>
<link href="http://bwael.com/2020/07/28/leetcode-416/"/>
<id>http://bwael.com/2020/07/28/leetcode-416/</id>
<published>2020-07-28T08:37:11.000Z</published>
<updated>2020-07-28T09:27:14.497Z</updated>
<content type="html"><![CDATA[<h2 id="※-0-1背包"><a href="#※-0-1背包" class="headerlink" title="※ 0-1背包"></a>※ 0-1背包</h2><p>有一个容量为 N 的背包,要用这个背包装下物品的价值最大,这些物品有两个属性:体积 w 和价值 v。</p><p>定义一个二维数组 dp 存储最大价值,其中 $dp[i][j] $表示前 i 件物品体积不超过 j 的情况下能达到的最大价值。设第 i 件物品体积为 w,价值为 v,根据第 i 件物品是否添加到背包中,可以分两种情况讨论:</p><ul><li>第 i 件物品没添加到背包,总体积不超过 j 的前 i 件物品的最大价值,就是总体积不超过 j 的前 i-1 件物品的最大价值,$dp[i][j] = dp[i-1][j]$。</li><li>第 i 件物品添加到背包中,$dp[i][j] = dp[i-1][j-w] + v$。</li></ul><a id="more"></a><p>第 i 件物品可添加也可以不添加,取决于哪种情况下最大价值更大。因此,0-1 背包的状态转移方程为:</p><p><img src="8cb2be66-3d47-41ba-b55b-319fc68940d4.png" alt=""></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></pre></td><td class="code"><pre><span class="line"><span class="comment">// W 为背包总体积</span></span><br><span class="line"><span class="comment">// N 为物品数量</span></span><br><span class="line"><span class="comment">// weights 数组存储 N 个物品的重量</span></span><br><span class="line"><span class="comment">// values 数组存储 N 个物品的价值</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">knapsack</span><span class="params">(<span class="keyword">int</span> W, <span class="keyword">int</span> N, <span class="keyword">int</span>[] weights, <span class="keyword">int</span>[] values)</span> </span>{</span><br><span class="line"> <span class="keyword">int</span>[][] dp = <span class="keyword">new</span> <span class="keyword">int</span>[N + <span class="number">1</span>][W + <span class="number">1</span>];</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i <= N; i++) {</span><br><span class="line"> <span class="keyword">int</span> w = weights[i - <span class="number">1</span>], v = values[i - <span class="number">1</span>];</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j <= W; j++) {</span><br><span class="line"> <span class="keyword">if</span> (j >= w) {</span><br><span class="line"> dp[i][j] = Math.max(dp[i - <span class="number">1</span>][j], dp[i - <span class="number">1</span>][j - w] + v);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> dp[i][j] = dp[i - <span class="number">1</span>][j];</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> dp[N][W];</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><strong>空间优化</strong></p><p>在程序实现时可以对 0-1 背包做优化。观察状态转移方程可以知道,前 i 件物品的状态仅与前 i-1 件物品的状态有关,因此可以将 dp 定义为一维数组,其中 $dp[j]$ 既可以表示 $dp[i-1][j]$ 也可以表示$ dp[i][j]$。此时,</p><p><img src="9ae89f16-7905-4a6f-88a2-874b4cac91f4.jpg" alt=""></p><p>因为 $dp[j-w] $表示 $dp[i-1][j-w]$,因此不能先求 $dp[i][j-w]$,防止将 $dp[i-1][j-w] $覆盖。也就是说要先计算 $dp[i][j] $再计算 $dp[i][j-w]$,在程序实现时需要按倒序来循环求解。</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="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">knapsack</span><span class="params">(<span class="keyword">int</span> W, <span class="keyword">int</span> N, <span class="keyword">int</span>[] weights, <span class="keyword">int</span>[] values)</span> </span>{</span><br><span class="line"> <span class="keyword">int</span>[] dp = <span class="keyword">new</span> <span class="keyword">int</span>[W + <span class="number">1</span>];</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i <= N; i++) {</span><br><span class="line"> <span class="keyword">int</span> w = weights[i - <span class="number">1</span>], v = values[i - <span class="number">1</span>];</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> j = W; j >= <span class="number">1</span>; j--) {</span><br><span class="line"> <span class="keyword">if</span> (j >= w) {</span><br><span class="line"> dp[j] = Math.max(dp[j], dp[j - w] + v);</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> dp[W];</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><strong>无法使用贪心算法的解释</strong></p><p><strong>0-1 背包问题无法使用贪心算法来求解</strong>,也就是说不能按照先添加性价比最高的物品来达到最优,这是因为这种方式可能造成背包空间的浪费,从而无法达到最优。考虑下面的物品和一个容量为 5 的背包,如果先添加物品 0 再添加物品 1,那么只能存放的价值为 16,浪费了大小为 2 的空间。最优的方式是存放物品 1 和物品 2,价值为 22.</p><table><thead><tr><th>id</th><th>w</th><th>v</th><th>v/w</th></tr></thead><tbody><tr><td>0</td><td>1</td><td>6</td><td>6</td></tr><tr><td>1</td><td>2</td><td>10</td><td>5</td></tr><tr><td>2</td><td>3</td><td>12</td><td>4</td></tr></tbody></table><p><strong>变种</strong></p><ul><li>完全背包:物品数量为无限个</li><li>多重背包:物品数量有限制</li><li>多维费用背包:物品不仅有重量,还有体积,同时考虑这两种限制</li><li>其它:物品之间相互约束或者依赖</li></ul><h2 id="416-分割等和子集"><a href="#416-分割等和子集" class="headerlink" title="416. 分割等和子集"></a>416. 分割等和子集</h2><p>416.Partition Equal Subset Sum (Medium)</p><p><a href="https://leetcode.com/problems/partition-equal-subset-sum/description/" target="_blank" rel="noopener">Leetcode</a> / <a href="https://leetcode-cn.com/problems/partition-equal-subset-sum/description/" target="_blank" rel="noopener">力扣</a></p><p>2020-7-28 15:46:15</p><h3 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h3><p>给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。<br>注意:</p><ul><li>每个数组中的元素不会超过 100</li><li>数组的大小不会超过 200</li></ul><figure class="highlight html"><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">输入: [1, 5, 11, 5]</span><br><span class="line">输出: true</span><br><span class="line">解释: 数组可以分割成 [1, 5, 5] 和 [11].</span><br></pre></td></tr></table></figure><h3 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h3><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="class"><span class="keyword">class</span> <span class="title">Solution</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">canPartition</span><span class="params">(<span class="keyword">int</span>[] nums)</span> </span>{</span><br><span class="line"> <span class="keyword">int</span> sum = calcArraySum(nums);</span><br><span class="line"> <span class="keyword">if</span>(sum%<span class="number">2</span> != <span class="number">0</span>){</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">int</span> N = sum / <span class="number">2</span>;</span><br><span class="line"> <span class="keyword">boolean</span>[] dp = <span class="keyword">new</span> <span class="keyword">boolean</span>[N + <span class="number">1</span>];</span><br><span class="line"> dp[<span class="number">0</span>] = <span class="keyword">true</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> num : nums){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j = N; j >= num; j--){</span><br><span class="line"> dp[j] = dp[j] || dp[j - num];</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> dp[N];</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">int</span> <span class="title">calcArraySum</span><span class="params">(<span class="keyword">int</span>[] nums)</span></span>{</span><br><span class="line"> <span class="keyword">int</span> sum = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> num : nums){</span><br><span class="line"> sum += num;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> sum;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>为了防止True正序遍历被覆盖,所以倒着来。</p><p>上面这种写法节省了一定空间。完整的状态转移过程具体可以看下图,$dp[i][j] = dp[i-1][j]$ or $dp[i-1][j - nums[i]]$。</p><p><img src="77838706e514294db6eb703b11a44a43b3524498dadcf0870b014268af6f8783-image.png" alt=""></p>]]></content>
<summary type="html">
<h2 id="※-0-1背包"><a href="#※-0-1背包" class="headerlink" title="※ 0-1背包"></a>※ 0-1背包</h2><p>有一个容量为 N 的背包,要用这个背包装下物品的价值最大,这些物品有两个属性:体积 w 和价值 v。</p>
<p>定义一个二维数组 dp 存储最大价值,其中 $dp[i][j] $表示前 i 件物品体积不超过 j 的情况下能达到的最大价值。设第 i 件物品体积为 w,价值为 v,根据第 i 件物品是否添加到背包中,可以分两种情况讨论:</p>
<ul>
<li>第 i 件物品没添加到背包,总体积不超过 j 的前 i 件物品的最大价值,就是总体积不超过 j 的前 i-1 件物品的最大价值,$dp[i][j] = dp[i-1][j]$。</li>
<li>第 i 件物品添加到背包中,$dp[i][j] = dp[i-1][j-w] + v$。</li>
</ul>
</summary>
<category term="学习笔记" scheme="http://bwael.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="学习笔记" scheme="http://bwael.com/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="LeetCode" scheme="http://bwael.com/tags/LeetCode/"/>
<category term="动态规划" scheme="http://bwael.com/tags/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/"/>
</entry>
<entry>
<title>剑指Offer 14.剪绳子(LeetCode 343.整数拆分)</title>
<link href="http://bwael.com/2020/07/27/offer-14/"/>
<id>http://bwael.com/2020/07/27/offer-14/</id>
<published>2020-07-27T07:41:17.000Z</published>
<updated>2020-07-28T09:28:08.904Z</updated>
<content type="html"><![CDATA[<p><strong>剑指Offer 14.剪绳子(LeetCode 343.整数拆分)</strong></p><p><a href="https://leetcode-cn.com/problems/integer-break/submissions/" target="_blank" rel="noopener">343.整数拆分 - LeetCode (Medium)</a></p><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>把一根绳子剪成多段,并且使得每段的长度乘积最大。</p><figure class="highlight html"><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">n = 2</span><br><span class="line">return 1 (2 = 1 + 1)</span><br><span class="line"></span><br><span class="line">n = 10</span><br><span class="line">return 36 (10 = 3 + 3 + 4)</span><br></pre></td></tr></table></figure><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><p><strong>贪心</strong></p><p>尽可能多剪长度为 3 的绳子,并且不允许有长度为 1 的绳子出现。如果出现了,就从已经切好长度为 3 的绳子中拿出一段与长度为 1 的绳子重新组合,把它们切成两段长度为 2 的绳子。</p><a id="more"></a><p>证明:当 n >= 5 时,3(n - 3) - n = 2n - 9 > 0,且 2(n - 2) - n = n - 4 > 0。因此在 n >= 5 的情况下,将绳子剪成一段为 2 或者 3,得到的乘积会更大。又因为 3(n - 3) - 2(n - 2) = n - 5 >= 0,所以剪成一段长度为 3 比长度为 2 得到的乘积更大。</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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">integerBreak</span><span class="params">(<span class="keyword">int</span> n)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span> (n < <span class="number">2</span>)</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">if</span> (n == <span class="number">2</span>)</span><br><span class="line"> <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">if</span> (n == <span class="number">3</span>)</span><br><span class="line"> <span class="keyword">return</span> <span class="number">2</span>;</span><br><span class="line"> <span class="keyword">int</span> timesOf3 = n / <span class="number">3</span>;</span><br><span class="line"> <span class="keyword">if</span> (n - timesOf3 * <span class="number">3</span> == <span class="number">1</span>)</span><br><span class="line"> timesOf3--;</span><br><span class="line"> <span class="keyword">int</span> timesOf2 = (n - timesOf3 * <span class="number">3</span>) / <span class="number">2</span>;</span><br><span class="line"> <span class="keyword">return</span> (<span class="keyword">int</span>) (Math.pow(<span class="number">3</span>, timesOf3)) * (<span class="keyword">int</span>) (Math.pow(<span class="number">2</span>, timesOf2));</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><strong>动态规划</strong></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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">integerBreak</span><span class="params">(<span class="keyword">int</span> n)</span> </span>{</span><br><span class="line"> <span class="keyword">int</span>[] dp = <span class="keyword">new</span> <span class="keyword">int</span>[n + <span class="number">1</span>];</span><br><span class="line"> dp[<span class="number">1</span>] = <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">2</span>; i <= n; i++)</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j < i; j++)</span><br><span class="line"> <span class="comment">//记录求解的历史</span></span><br><span class="line"> dp[i] = Math.max(dp[i], Math.max(j * (i - j), dp[j] * (i - j)));</span><br><span class="line"> <span class="keyword">return</span> dp[n];</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p><strong>剑指Offer 14.剪绳子(LeetCode 343.整数拆分)</strong></p>
<p><a href="https://leetcode-cn.com/problems/integer-break/submissions/" target="_blank" rel="noopener">343.整数拆分 - LeetCode (Medium)</a></p>
<h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>把一根绳子剪成多段,并且使得每段的长度乘积最大。</p>
<figure class="highlight html"><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">n = 2</span><br><span class="line">return 1 (2 = 1 + 1)</span><br><span class="line"></span><br><span class="line">n = 10</span><br><span class="line">return 36 (10 = 3 + 3 + 4)</span><br></pre></td></tr></table></figure>
<h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><p><strong>贪心</strong></p>
<p>尽可能多剪长度为 3 的绳子,并且不允许有长度为 1 的绳子出现。如果出现了,就从已经切好长度为 3 的绳子中拿出一段与长度为 1 的绳子重新组合,把它们切成两段长度为 2 的绳子。</p>
</summary>
<category term="学习笔记" scheme="http://bwael.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="学习笔记" scheme="http://bwael.com/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="LeetCode" scheme="http://bwael.com/tags/LeetCode/"/>
<category term="剑指Offer" scheme="http://bwael.com/tags/%E5%89%91%E6%8C%87Offer/"/>
</entry>
<entry>
<title>LeetCode 95.不同的二叉搜索树 II</title>
<link href="http://bwael.com/2020/07/26/leetcode-95/"/>
<id>http://bwael.com/2020/07/26/leetcode-95/</id>
<published>2020-07-26T02:41:16.000Z</published>
<updated>2020-07-28T09:26:48.853Z</updated>
<content type="html"><![CDATA[<p><strong>95. 不同的二叉搜索树 II</strong></p><p>95.Unique Binary Search Trees II (Medium)</p><p><a href="https://leetcode.com/problems/unique-binary-search-trees-ii/description/" target="_blank" rel="noopener">Leetcode</a> / <a href="https://leetcode-cn.com/problems/unique-binary-search-trees-ii/description/" target="_blank" rel="noopener">力扣</a></p><p>2020-7-26 10:17:45</p><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>给定一个数字 n,要求生成所有值为 1…n 的二叉搜索树。</p><a id="more"></a><figure class="highlight html"><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></pre></td><td class="code"><pre><span class="line">Input: 3</span><br><span class="line">Output:</span><br><span class="line">[</span><br><span class="line"> [1,null,3,2],</span><br><span class="line"> [3,2,null,1],</span><br><span class="line"> [3,1,null,null,2],</span><br><span class="line"> [2,1,3],</span><br><span class="line"> [1,null,2,null,3]</span><br><span class="line">]</span><br><span class="line">Explanation:</span><br><span class="line">The above output corresponds to the 5 unique BST's shown below:</span><br><span class="line"></span><br><span class="line"> 1 3 3 2 1</span><br><span class="line"> \ / / / \ \</span><br><span class="line"> 3 2 1 1 3 2</span><br><span class="line"> / / \ \</span><br><span class="line"> 2 1 2 3</span><br></pre></td></tr></table></figure><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><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></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="class"><span class="keyword">class</span> <span class="title">Solution</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> List<TreeNode> <span class="title">generateTrees</span><span class="params">(<span class="keyword">int</span> n)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span>(n < <span class="number">1</span>) <span class="keyword">return</span> <span class="keyword">new</span> LinkedList<TreeNode>();</span><br><span class="line"> <span class="keyword">return</span> generateSubTrees(<span class="number">1</span>, n);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">private</span> List<TreeNode> <span class="title">generateSubTrees</span><span class="params">(<span class="keyword">int</span> s, <span class="keyword">int</span> e)</span></span>{</span><br><span class="line"> List<TreeNode> ret = <span class="keyword">new</span> LinkedList<TreeNode>();</span><br><span class="line"> <span class="keyword">if</span>(s > e){</span><br><span class="line"> ret.add(<span class="keyword">null</span>);</span><br><span class="line"> <span class="keyword">return</span> ret;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">// 枚举可行根节点</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = s; i <= e; ++i) {</span><br><span class="line"> <span class="comment">// 获得所有可行的左子树集合</span></span><br><span class="line"> List<TreeNode> leftSubtrees = generateSubTrees(s, i - <span class="number">1</span>);</span><br><span class="line"> <span class="comment">// 获得所有可行的右子树集合</span></span><br><span class="line"> List<TreeNode> rightSubtrees = generateSubTrees(i + <span class="number">1</span>, e);</span><br><span class="line"> <span class="comment">// 从左子树集合中选出一棵左子树,从右子树集合中选出一棵右子树,拼接到根节点上</span></span><br><span class="line"> <span class="keyword">for</span> (TreeNode left : leftSubtrees) {</span><br><span class="line"> <span class="keyword">for</span> (TreeNode right : rightSubtrees) {</span><br><span class="line"> TreeNode root = <span class="keyword">new</span> TreeNode(i);</span><br><span class="line"> root.left = left;</span><br><span class="line"> root.right = right;</span><br><span class="line"> ret.add(root);</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> ret;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p><strong>95. 不同的二叉搜索树 II</strong></p>
<p>95.Unique Binary Search Trees II (Medium)</p>
<p><a href="https://leetcode.com/problems/unique-binary-search-trees-ii/description/" target="_blank" rel="noopener">Leetcode</a> / <a href="https://leetcode-cn.com/problems/unique-binary-search-trees-ii/description/" target="_blank" rel="noopener">力扣</a></p>
<p>2020-7-26 10:17:45</p>
<h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>给定一个数字 n,要求生成所有值为 1…n 的二叉搜索树。</p>
</summary>
<category term="学习笔记" scheme="http://bwael.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="学习笔记" scheme="http://bwael.com/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="LeetCode" scheme="http://bwael.com/tags/LeetCode/"/>
<category term="分治" scheme="http://bwael.com/tags/%E5%88%86%E6%B2%BB/"/>
</entry>
<entry>
<title>LeetCode 435.无重叠的区间个数</title>
<link href="http://bwael.com/2020/07/24/leetcode-435-Non-overlapping-Intervals/"/>
<id>http://bwael.com/2020/07/24/leetcode-435-Non-overlapping-Intervals/</id>
<published>2020-07-24T03:24:54.000Z</published>
<updated>2020-07-28T09:27:32.068Z</updated>
<content type="html"><![CDATA[<p><strong>435.无重叠的区间个数</strong></p><p>435.Non-overlapping Intervals (Medium)</p><p><a href="https://leetcode.com/problems/non-overlapping-intervals/description/" target="_blank" rel="noopener">Leetcode</a> / <a href="https://leetcode-cn.com/problems/non-overlapping-intervals/description/" target="_blank" rel="noopener">力扣</a></p><p>2020-7-24 11:00:19</p><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。可以认为区间的终点总是大于它的起点。区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。</p><figure class="highlight html"><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">输入: [ [1,2], [2,3], [3,4], [1,3] ]</span><br><span class="line">输出: 1</span><br><span class="line">解释: 移除 [1,3] 后,剩下的区间没有重叠。</span><br></pre></td></tr></table></figure><a id="more"></a><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><p>先计算最多能组成的不重叠区间个数,然后用区间总个数减去不重叠区间的个数。</p><p>在每次选择中,区间的结尾最为重要,选择的区间结尾越小,留给后面的区间的空间越大,那么后面能够选择的区间个数也就越大。</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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">eraseOverlapIntervals</span><span class="params">(<span class="keyword">int</span>[][] intervals)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span>(intervals.length == <span class="number">0</span>) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> Arrays.sort(intervals, <span class="keyword">new</span> Comparator<<span class="keyword">int</span>[]>() {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">compare</span><span class="params">(<span class="keyword">int</span>[] o1, <span class="keyword">int</span>[] o2)</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> o1[<span class="number">1</span>] - o2[<span class="number">1</span>];</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> <span class="keyword">int</span> cnt = <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">int</span> end = intervals[<span class="number">0</span>][<span class="number">1</span>];</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>; i < intervals.length; i++){</span><br><span class="line"> <span class="keyword">if</span>(intervals[i][<span class="number">0</span>] < end){</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"> end = intervals[i][<span class="number">1</span>];</span><br><span class="line"> cnt++;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> intervals.length - cnt;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>Arrays.sort( )用lambda表达式可写为,执行效率低:</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Arrays.sort(intervals, Comparator.comparingInt(o -> o[<span class="number">1</span>]));</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p><strong>435.无重叠的区间个数</strong></p>
<p>435.Non-overlapping Intervals (Medium)</p>
<p><a href="https://leetcode.com/problems/non-overlapping-intervals/description/" target="_blank" rel="noopener">Leetcode</a> / <a href="https://leetcode-cn.com/problems/non-overlapping-intervals/description/" target="_blank" rel="noopener">力扣</a></p>
<p>2020-7-24 11:00:19</p>
<h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。可以认为区间的终点总是大于它的起点。区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。</p>
<figure class="highlight html"><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">输入: [ [1,2], [2,3], [3,4], [1,3] ]</span><br><span class="line">输出: 1</span><br><span class="line">解释: 移除 [1,3] 后,剩下的区间没有重叠。</span><br></pre></td></tr></table></figure>
</summary>
<category term="学习笔记" scheme="http://bwael.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="学习笔记" scheme="http://bwael.com/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="LeetCode" scheme="http://bwael.com/tags/LeetCode/"/>
</entry>
<entry>
<title>LeetCode 535.TinyURL 的加密与解密</title>
<link href="http://bwael.com/2020/03/25/leetcode-535/"/>
<id>http://bwael.com/2020/03/25/leetcode-535/</id>
<published>2020-03-25T14:49:13.000Z</published>
<updated>2020-08-06T14:51:54.451Z</updated>
<content type="html"><![CDATA[<p>哈希表使用 O(N) 空间复杂度存储数据,并且以 O(1) 时间复杂度求解问题。</p><ul><li>Java 中的 <strong>HashSet</strong> 用于存储一个集合,可以查找元素是否在集合中。如果元素有穷,并且范围不大,那么可以用一个布尔数组来存储一个元素是否存在。例如对于只有小写字符的元素,就可以用一个长度为 26 的布尔数组来存储一个字符集合,使得空间复杂度降低为 O(1)。</li><li>Java 中的 <strong>HashMap</strong> 主要用于映射关系,从而把两个元素联系起来。HashMap 也可以用来对元素进行计数统计,此时键为元素,值为计数。和 HashSet 类似,如果元素有穷并且范围不大,可以用整型数组来进行统计。在对一个内容进行压缩或者其它转换时,利用 HashMap 可以把原始内容和转换后的内容联系起来。例如在一个简化 url 的系统中 Leetcdoe : 535. Encode and Decode TinyURL (Medium)</li></ul><p><strong>535.TinyURL 的加密与解密</strong></p><p>535.Encode and Decode TinyURL (Medium)</p><p><a href="https://leetcode-cn.com/problems/encode-and-decode-tinyurl/" target="_blank" rel="noopener">LeetCode - TinyURL 的加密与解密</a></p><a id="more"></a><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>TinyURL是一种URL简化服务, 比如:当你输入一个URL <a href="https://leetcode.com/problems/design-tinyurl" target="_blank" rel="noopener">https://leetcode.com/problems/design-tinyurl</a> 时,它将返回一个简化的URL <a href="http://tinyurl.com/4e9iAk" target="_blank" rel="noopener">http://tinyurl.com/4e9iAk</a>.</p><p>要求:设计一个 TinyURL 的加密 encode 和解密 decode 的方法。你的加密和解密算法如何设计和运作是没有限制的,你只需要保证一个URL可以被加密成一个TinyURL,并且这个TinyURL可以用解密方法恢复成原本的URL。</p><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><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></pre></td><td class="code"><pre><span class="line"><span class="comment">//代码简洁之道</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Codec</span> </span>{</span><br><span class="line"> <span class="comment">// Encodes a URL to a shortened URL.</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">encode</span><span class="params">(String longUrl)</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> longUrl;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">// Decodes a shortened URL to its original URL.</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">decode</span><span class="params">(String shortUrl)</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> shortUrl;</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"><span class="comment">// Your Codec object will be instantiated and called as such:</span></span><br><span class="line"><span class="comment">// Codec codec = new Codec();</span></span><br><span class="line"><span class="comment">// codec.decode(codec.encode(url));</span></span><br></pre></td></tr></table></figure><p><strong>简单计数法</strong></p><p>为了加密 URL,我们使用计数器 (i) ,每遇到一个新的 URL 都加一。我们将 URL 与它的次数 i 放在哈希表 HashMap 中,这样我们在稍后的解密中可以轻易地获得原本的 URL。</p><ul><li><p>可以加密解密的 URL 数目受限于 int 所能表示的范围。</p></li><li><p>如果超过 int 个 URL 需要被加密,那么超过范围的整数会覆盖之前存储的 URL,导致算法失效。</p></li><li><p>URL 的长度不一定比输入的 longURL 短。它只与加密的 URL 被加密的顺序有关。</p></li><li><p>这个方法的问题是预测下一个会产生的加密 URL 非常容易,因为产生几个 URL 后很容易推测出生成的模式。</p></li></ul><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Codec</span> </span>{</span><br><span class="line"> Map<Integer, String> map = <span class="keyword">new</span> HashMap<>();</span><br><span class="line"> <span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">encode</span><span class="params">(String longUrl)</span> </span>{</span><br><span class="line"> map.put(i, longUrl);</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"http://tinyurl.com/"</span> + i++;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">decode</span><span class="params">(String shortUrl)</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> map.get(Integer.parseInt(shortUrl.replace(<span class="string">"http://tinyurl.com/"</span>, <span class="string">""</span>)));</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><strong>随机固定长度加密(通用解法)</strong></p><p>在这种方法中,使用数字和字母表集合来为 URL 生成加密结果。这种方法中,加密后的长度固定是 6 位。如果产生出来的加密结果与之前产生的结果一样,就换一个新的加密结果。</p><ul><li><p>可加密的 URL 数目非常大,几乎是$(10+26*2)^6$级别。</p></li><li><p>加密 URL 的长度固定是 6,这相比于能加密的字符串数目是极大的缩减优化。</p></li><li><p>这个方法的表现非常好,因为几乎不可能产生相同加密结果。</p></li><li><p>我们也可以通过增加加密字符串的长度来增加加密结果的数目。因此,在加密字符串的长度和可加密的字符串数目之间我们需要做一个权衡。</p></li><li><p>根据加密 URL 预测加密结果几乎是不可能的,因为使用了随机数。</p></li></ul><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Codec</span> </span>{</span><br><span class="line"> String alphabet = <span class="string">"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"</span>;</span><br><span class="line"> HashMap<String, String> map = <span class="keyword">new</span> HashMap<>();</span><br><span class="line"> Random rand = <span class="keyword">new</span> Random();</span><br><span class="line"> String key = getRand();</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">getRand</span><span class="params">()</span> </span>{</span><br><span class="line"> StringBuilder sb = <span class="keyword">new</span> StringBuilder();</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < <span class="number">6</span>; i++) {</span><br><span class="line"> sb.append(alphabet.charAt(rand.nextInt(<span class="number">62</span>)));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> sb.toString();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">encode</span><span class="params">(String longUrl)</span> </span>{</span><br><span class="line"> <span class="keyword">while</span> (map.containsKey(key)) {</span><br><span class="line"> key = getRand();</span><br><span class="line"> }</span><br><span class="line"> map.put(key, longUrl);</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"http://tinyurl.com/"</span> + key;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">decode</span><span class="params">(String shortUrl)</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> map.get(shortUrl.replace(<span class="string">"http://tinyurl.com/"</span>, <span class="string">""</span>));</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p>哈希表使用 O(N) 空间复杂度存储数据,并且以 O(1) 时间复杂度求解问题。</p>
<ul>
<li>Java 中的 <strong>HashSet</strong> 用于存储一个集合,可以查找元素是否在集合中。如果元素有穷,并且范围不大,那么可以用一个布尔数组来存储一个元素是否存在。例如对于只有小写字符的元素,就可以用一个长度为 26 的布尔数组来存储一个字符集合,使得空间复杂度降低为 O(1)。</li>
<li>Java 中的 <strong>HashMap</strong> 主要用于映射关系,从而把两个元素联系起来。HashMap 也可以用来对元素进行计数统计,此时键为元素,值为计数。和 HashSet 类似,如果元素有穷并且范围不大,可以用整型数组来进行统计。在对一个内容进行压缩或者其它转换时,利用 HashMap 可以把原始内容和转换后的内容联系起来。例如在一个简化 url 的系统中 Leetcdoe : 535. Encode and Decode TinyURL (Medium)</li>
</ul>
<p><strong>535.TinyURL 的加密与解密</strong></p>
<p>535.Encode and Decode TinyURL (Medium)</p>
<p><a href="https://leetcode-cn.com/problems/encode-and-decode-tinyurl/" target="_blank" rel="noopener">LeetCode - TinyURL 的加密与解密</a></p>
</summary>
<category term="学习笔记" scheme="http://bwael.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="学习笔记" scheme="http://bwael.com/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="LeetCode" scheme="http://bwael.com/tags/LeetCode/"/>
<category term="哈希表" scheme="http://bwael.com/tags/%E5%93%88%E5%B8%8C%E8%A1%A8/"/>
</entry>
<entry>
<title>LeetCode 51.N皇后</title>
<link href="http://bwael.com/2018/08/20/leetcode-51/"/>
<id>http://bwael.com/2018/08/20/leetcode-51/</id>
<published>2018-08-20T13:11:14.000Z</published>
<updated>2020-07-28T09:26:39.447Z</updated>
<content type="html"><![CDATA[<p><strong>51. N皇后</strong></p><p>51.N-Queens (Hard)</p><p><a href="https://leetcode.com/problems/n-queens/description/" target="_blank" rel="noopener">Leetcode</a> / <a href="https://leetcode-cn.com/problems/n-queens/description/" target="_blank" rel="noopener">力扣</a></p><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p><img src="067b310c-6877-40fe-9dcf-10654e737485.jpg" alt=""></p><p>在 n*n 的矩阵中摆放 n 个皇后,并且每个皇后不能在同一行,同一列,同一对角线上,求所有的 n 皇后的解。</p><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><p>这个问题本质上跟全排列问题差不多,决策树的每一层表示棋盘上的每一行;每个节点可以做出的选择是,在该行的任意一列放置一个皇后。</p><a id="more"></a><p>当 N = 8 时,就是八皇后问题,数学大佬高斯穷尽一生都没有数清楚八皇后问题到底有几种可能的放置方法,但是我们的算法只需要一秒就可以算出来所有可能的结果。</p><p>不过真的不怪高斯。这个问题的复杂度确实非常高,看看我们的决策树,虽然有 isValid 函数剪枝,但是最坏时间复杂度仍然是 O(N^(N+1)),而且无法优化。如果 N = 10 的时候,计算就已经很耗时了。</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><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> </span>{</span><br><span class="line"> <span class="keyword">private</span> List<List<String>> res;</span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> List<String> <span class="title">charToString</span><span class="params">(<span class="keyword">char</span>[][] array)</span> </span>{</span><br><span class="line"> List<String> result = <span class="keyword">new</span> LinkedList<>();</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">char</span>[] chars : array) {</span><br><span class="line"> result.add(String.valueOf(chars));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/* 输入棋盘边长 n,返回所有合法的放置 */</span></span><br><span class="line"> <span class="keyword">public</span> List<List<String>> solveNQueens(<span class="keyword">int</span> n) {</span><br><span class="line"> <span class="keyword">if</span> (n <= <span class="number">0</span>) <span class="keyword">return</span> <span class="keyword">null</span>;</span><br><span class="line"> res = <span class="keyword">new</span> LinkedList<>();</span><br><span class="line"> <span class="comment">// '.' 表示空,'Q' 表示皇后,初始化空棋盘</span></span><br><span class="line"> <span class="keyword">char</span>[][] board = <span class="keyword">new</span> <span class="keyword">char</span>[n][n];</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">char</span>[] chars : board){</span><br><span class="line"> Arrays.fill(chars, <span class="string">'.'</span>);</span><br><span class="line"> } </span><br><span class="line"> backtrack(board, <span class="number">0</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="comment">/**</span></span><br><span class="line"><span class="comment"> * 路径:board中小于row的那些行都已经成功放置了皇后</span></span><br><span class="line"><span class="comment"> * 可选择列表: 第row行的所有列都是放置Q的选择</span></span><br><span class="line"><span class="comment"> * 结束条件: row超过board的最后一行</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">backtrack</span><span class="params">(<span class="keyword">char</span>[][] board, <span class="keyword">int</span> row)</span> </span>{</span><br><span class="line"> <span class="comment">// 结束条件,构造输出</span></span><br><span class="line"> <span class="keyword">if</span> (row == board.length) {</span><br><span class="line"> res.add(charToString(board));</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">int</span> n = board[row].length;</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> col = <span class="number">0</span>; col < n; col++) {</span><br><span class="line"> <span class="comment">// 排除不合法选择</span></span><br><span class="line"> <span class="keyword">if</span> (!isValid(board, row, col)) <span class="keyword">continue</span>;</span><br><span class="line"> <span class="comment">// 做选择</span></span><br><span class="line"> board[row][col] = <span class="string">'Q'</span>;</span><br><span class="line"> <span class="comment">// 进入下一行决策</span></span><br><span class="line"> backtrack(board, row + <span class="number">1</span>);</span><br><span class="line"> <span class="comment">// 撤销选择</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">/* 是否可以在 board[row][col] 放置皇后? */</span></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">boolean</span> <span class="title">isValid</span><span class="params">(<span class="keyword">char</span>[][] board, <span class="keyword">int</span> row, <span class="keyword">int</span> col)</span> </span>{</span><br><span class="line"> <span class="keyword">int</span> rows = board.length;</span><br><span class="line"> <span class="comment">// check is valid in col列</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">char</span>[] chars : board) <span class="keyword">if</span> (chars[col] == <span class="string">'Q'</span>) <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line"> <span class="comment">// check is valide upright右上方</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = row - <span class="number">1</span>, j = col + <span class="number">1</span>; i >= <span class="number">0</span> && j < rows; i--, j++) {</span><br><span class="line"> <span class="keyword">if</span> (board[i][j] == <span class="string">'Q'</span>) <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">// check is valide upleft左上方</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = row - <span class="number">1</span>, j = col - <span class="number">1</span>; i >= <span class="number">0</span> && j >= <span class="number">0</span>; i--, j--) {</span><br><span class="line"> <span class="keyword">if</span> (board[i][j] == <span class="string">'Q'</span>) <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p><strong>51. N皇后</strong></p>
<p>51.N-Queens (Hard)</p>
<p><a href="https://leetcode.com/problems/n-queens/description/" target="_blank" rel="noopener">Leetcode</a> / <a href="https://leetcode-cn.com/problems/n-queens/description/" target="_blank" rel="noopener">力扣</a></p>
<h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p><img src="067b310c-6877-40fe-9dcf-10654e737485.jpg" alt=""></p>
<p>在 n*n 的矩阵中摆放 n 个皇后,并且每个皇后不能在同一行,同一列,同一对角线上,求所有的 n 皇后的解。</p>
<h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><p>这个问题本质上跟全排列问题差不多,决策树的每一层表示棋盘上的每一行;每个节点可以做出的选择是,在该行的任意一列放置一个皇后。</p>
</summary>
<category term="学习笔记" scheme="http://bwael.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="学习笔记" scheme="http://bwael.com/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="LeetCode" scheme="http://bwael.com/tags/LeetCode/"/>
<category term="回溯搜索" scheme="http://bwael.com/tags/%E5%9B%9E%E6%BA%AF%E6%90%9C%E7%B4%A2/"/>
</entry>
<entry>
<title>LeetCode 1143.最长公共子序列</title>
<link href="http://bwael.com/2017/08/28/leetcode-1143/"/>
<id>http://bwael.com/2017/08/28/leetcode-1143/</id>
<published>2017-08-28T08:36:51.000Z</published>
<updated>2020-07-28T09:27:54.347Z</updated>
<content type="html"><![CDATA[<p><strong>※ 最长公共子序列</strong></p><p>对于两个子序列 S1 和 S2,找出它们最长的公共子序列。</p><p>定义一个二维数组 dp 用来存储最长公共子序列的长度,其中$ dp[i][j] $表示 S1 的前 i 个字符与 S2 的前 j 个字符最长公共子序列的长度。考虑 $S1_i $与$ S2_j $值是否相等,分为两种情况:</p><ul><li>当 $S1_i==S2_j $时,那么就能在 S1 的前 i-1 个字符与 S2 的前 j-1 个字符最长公共子序列的基础上再加上$ S1_i $这个值,最长公共子序列长度加 1,即 $dp[i][j] = dp[i-1][j-1] + 1$。</li><li>当 $S1_i != S2_j $时,此时最长公共子序列为 S1 的前 i-1 个字符和 S2 的前 j 个字符最长公共子序列,或者 S1 的前 i 个字符和 S2 的前 j-1 个字符最长公共子序列,取它们的最大者,即 $dp[i][j] = max({ dp[i-1][j], dp[i][j-1] })$。</li></ul><a id="more"></a><p>综上,最长公共子序列的状态转移方程为:<img src="ecd89a22-c075-4716-8423-e0ba89230e9a.jpg" alt=""></p><p>对于长度为 N 的序列 S1 和长度为 M 的序列 S2,$dp[N][M] $就是序列 S1 和序列 S2 的最长公共子序列长度。</p><p>与最长递增子序列相比,最长公共子序列有以下不同点:</p><ul><li>针对的是两个序列,求它们的最长公共子序列。</li><li>在最长递增子序列中,$dp[i]$ 表示以 $S_i $为结尾的最长递增子序列长度,子序列必须包含 $S_i$ ;在最长公共子序列中,$dp[i][j] $表示 S1 中前 i 个字符与 S2 中前 j 个字符的最长公共子序列长度,不一定包含 $S1_i $和 $S2_j$。</li><li>在求最终解时,最长公共子序列中 $dp[N][M] $就是最终解,而最长递增子序列中 $dp[N] $不是最终解,因为以 $S_N$ 为结尾的最长递增子序列不一定是整个序列最长递增子序列,需要遍历一遍 dp 数组找到最大者。</li></ul><p><strong>1143. 最长公共子序列</strong></p><p>1143.Longest Common Subsequence</p><p><a href="https://leetcode.com/problems/longest-common-subsequence/" target="_blank" rel="noopener">Leetcode</a> / <a href="https://leetcode-cn.com/problems/longest-common-subsequence/" target="_blank" rel="noopener">力扣</a></p><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。</p><p>一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。<br>例如,”ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。</p><p>若这两个字符串没有公共子序列,则返回 0。</p><figure class="highlight html"><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">示例 1:</span><br><span class="line"></span><br><span class="line">输入:text1 = "abcde", text2 = "ace" </span><br><span class="line">输出:3 </span><br><span class="line">解释:最长公共子序列是 "ace",它的长度为 3。</span><br></pre></td></tr></table></figure><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">longestCommonSubsequence</span><span class="params">(String text1, String text2)</span> </span>{</span><br><span class="line"> <span class="keyword">int</span> n1 = text1.length(), n2 = text2.length();</span><br><span class="line"> <span class="keyword">int</span>[][] dp = <span class="keyword">new</span> <span class="keyword">int</span>[n1 + <span class="number">1</span>][n2 + <span class="number">1</span>];</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">1</span>; i <= n1; i++){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j = <span class="number">1</span>; j <= n2; j++){</span><br><span class="line"> <span class="keyword">if</span>(text1.charAt(i - <span class="number">1</span>) == text2.charAt(j - <span class="number">1</span>)){</span><br><span class="line"> dp[i][j] = dp[i - <span class="number">1</span>][j - <span class="number">1</span>] + <span class="number">1</span>;</span><br><span class="line"> }<span class="keyword">else</span>{</span><br><span class="line"> dp[i][j] = Math.max(dp[i - <span class="number">1</span>][j], dp[i][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">return</span> dp[n1][n2];</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p><strong>※ 最长公共子序列</strong></p>
<p>对于两个子序列 S1 和 S2,找出它们最长的公共子序列。</p>
<p>定义一个二维数组 dp 用来存储最长公共子序列的长度,其中$ dp[i][j] $表示 S1 的前 i 个字符与 S2 的前 j 个字符最长公共子序列的长度。考虑 $S1_i $与$ S2_j $值是否相等,分为两种情况:</p>
<ul>
<li>当 $S1_i==S2_j $时,那么就能在 S1 的前 i-1 个字符与 S2 的前 j-1 个字符最长公共子序列的基础上再加上$ S1_i $这个值,最长公共子序列长度加 1,即 $dp[i][j] = dp[i-1][j-1] + 1$。</li>
<li>当 $S1_i != S2_j $时,此时最长公共子序列为 S1 的前 i-1 个字符和 S2 的前 j 个字符最长公共子序列,或者 S1 的前 i 个字符和 S2 的前 j-1 个字符最长公共子序列,取它们的最大者,即 $dp[i][j] = max({ dp[i-1][j], dp[i][j-1] })$。</li>
</ul>
</summary>
<category term="学习笔记" scheme="http://bwael.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="学习笔记" scheme="http://bwael.com/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="LeetCode" scheme="http://bwael.com/tags/LeetCode/"/>
<category term="动态规划" scheme="http://bwael.com/tags/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/"/>
</entry>
<entry>
<title>LeetCode 455.分配饼干</title>
<link href="http://bwael.com/2017/08/24/leetcode-455/"/>
<id>http://bwael.com/2017/08/24/leetcode-455/</id>
<published>2017-08-24T03:35:09.000Z</published>
<updated>2020-07-28T09:27:41.331Z</updated>
<content type="html"><![CDATA[<p><strong>455.分配饼干</strong></p><p>Assign Cookies (Easy)</p><p><a href="https://leetcode-cn.com/problems/assign-cookies/description/" target="_blank" rel="noopener">LeetCode 分发饼干</a></p><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><figure class="highlight html"><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">Input: grid[1,3], size[1,2,4]</span><br><span class="line">Output: 2Copy to clipboardErrorCopied</span><br></pre></td></tr></table></figure><p>题目描述:每个孩子都有一个满足度 grid,每个饼干都有一个大小 size,只有饼干的大小大于等于一个孩子的满足度,该孩子才会获得满足。求解最多可以获得满足的孩子数量。</p><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><ol><li>给一个孩子的饼干应当尽量小并且又能满足该孩子,这样大饼干才能拿来给满足度比较大的孩子。</li><li>因为满足度最小的孩子最容易得到满足,所以先满足满足度最小的孩子。</li></ol><a id="more"></a><p>在以上的解法中,我们只在每次分配时饼干时选择一种看起来是当前最优的分配方法,但无法保证这种局部最优的分配方法最后能得到全局最优解。我们假设能得到全局最优解,并使用反证法进行证明,即假设存在一种比我们使用的贪心策略更优的最优策略。如果不存在这种最优策略,表示贪心策略就是最优策略,得到的解也就是全局最优解。</p><p>证明:假设在某次选择中,贪心策略选择给当前满足度最小的孩子分配第 m 个饼干,第 m 个饼干为可以满足该孩子的最小饼干。假设存在一种最优策略,可以给该孩子分配第 n 个饼干,并且 m < n。我们可以发现,经过这一轮分配,贪心策略分配后剩下的饼干一定有一个比最优策略来得大。因此在后续的分配中,贪心策略一定能满足更多的孩子。也就是说不存在比贪心策略更优的策略,即贪心策略就是最优策略。</p><p><img src="e69537d2-a016-4676-b169-9ea17eeb9037.gif" alt=""></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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">findContentChildren</span><span class="params">(<span class="keyword">int</span>[] g, <span class="keyword">int</span>[] s)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span>(g == <span class="keyword">null</span> || s == <span class="keyword">null</span>)</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> <span class="comment">//贪心方法,先排序</span></span><br><span class="line"> Arrays.sort(g);</span><br><span class="line"> Arrays.sort(s);</span><br><span class="line"> <span class="keyword">int</span> gi = <span class="number">0</span>, si = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">while</span>(gi < g.length && si < s.length){</span><br><span class="line"> <span class="keyword">if</span>(g[gi] <= s[si]){</span><br><span class="line"> gi++;</span><br><span class="line"> }</span><br><span class="line"> si++;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> gi;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p><strong>455.分配饼干</strong></p>
<p>Assign Cookies (Easy)</p>
<p><a href="https://leetcode-cn.com/problems/assign-cookies/description/" target="_blank" rel="noopener">LeetCode 分发饼干</a></p>
<h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><figure class="highlight html"><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">Input: grid[1,3], size[1,2,4]</span><br><span class="line">Output: 2Copy to clipboardErrorCopied</span><br></pre></td></tr></table></figure>
<p>题目描述:每个孩子都有一个满足度 grid,每个饼干都有一个大小 size,只有饼干的大小大于等于一个孩子的满足度,该孩子才会获得满足。求解最多可以获得满足的孩子数量。</p>
<h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><ol>
<li>给一个孩子的饼干应当尽量小并且又能满足该孩子,这样大饼干才能拿来给满足度比较大的孩子。</li>
<li>因为满足度最小的孩子最容易得到满足,所以先满足满足度最小的孩子。</li>
</ol>
</summary>
<category term="学习笔记" scheme="http://bwael.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="学习笔记" scheme="http://bwael.com/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="LeetCode" scheme="http://bwael.com/tags/LeetCode/"/>
</entry>
<entry>
<title>LeetCode 241.给表达式加括号</title>
<link href="http://bwael.com/2017/07/26/leetcode-241/"/>
<id>http://bwael.com/2017/07/26/leetcode-241/</id>
<published>2017-07-26T02:40:59.000Z</published>
<updated>2020-07-28T09:27:01.749Z</updated>
<content type="html"><![CDATA[<p><strong>241.给表达式加括号</strong></p><p>Different Ways to Add Parentheses (Medium)</p><p><a href="https://leetcode.com/problems/different-ways-to-add-parentheses/description/" target="_blank" rel="noopener">Leetcode</a> / <a href="https://leetcode-cn.com/problems/different-ways-to-add-parentheses/description/" target="_blank" rel="noopener">力扣</a></p><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><figure class="highlight html"><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">Input: "2-1-1".</span><br><span class="line"></span><br><span class="line">((2-1)-1) = 0</span><br><span class="line">(2-(1-1)) = 2</span><br><span class="line"></span><br><span class="line">Output : [0, 2]</span><br></pre></td></tr></table></figure><a id="more"></a><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> List<Integer> <span class="title">diffWaysToCompute</span><span class="params">(String input)</span> </span>{</span><br><span class="line"> List<Integer> ways = <span class="keyword">new</span> ArrayList<>();</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"> */</span></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>; i < input.length(); i++){</span><br><span class="line"> <span class="keyword">char</span> c = input.charAt(i);</span><br><span class="line"> <span class="keyword">if</span>(c == <span class="string">'+'</span> || c == <span class="string">'-'</span> || c == <span class="string">'*'</span>){</span><br><span class="line"> List<Integer> left = diffWaysToCompute(input.substring(<span class="number">0</span>, i));</span><br><span class="line"> List<Integer> right = diffWaysToCompute(input.substring(i + <span class="number">1</span>));</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> l : left) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> r : right) {</span><br><span class="line"> <span class="keyword">switch</span> (c) {</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'+'</span>:</span><br><span class="line"> ways.add(l + r);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'-'</span>:</span><br><span class="line"> ways.add(l - r);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'*'</span>:</span><br><span class="line"> ways.add(l * r);</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><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="keyword">if</span> (ways.size() == <span class="number">0</span>) {</span><br><span class="line"> ways.add(Integer.valueOf(input));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> ways;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p><strong>241.给表达式加括号</strong></p>
<p>Different Ways to Add Parentheses (Medium)</p>
<p><a href="https://leetcode.com/problems/different-ways-to-add-parentheses/description/" target="_blank" rel="noopener">Leetcode</a> / <a href="https://leetcode-cn.com/problems/different-ways-to-add-parentheses/description/" target="_blank" rel="noopener">力扣</a></p>
<h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><figure class="highlight html"><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">Input: "2-1-1".</span><br><span class="line"></span><br><span class="line">((2-1)-1) = 0</span><br><span class="line">(2-(1-1)) = 2</span><br><span class="line"></span><br><span class="line">Output : [0, 2]</span><br></pre></td></tr></table></figure>
</summary>
<category term="学习笔记" scheme="http://bwael.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="学习笔记" scheme="http://bwael.com/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="LeetCode" scheme="http://bwael.com/tags/LeetCode/"/>
<category term="分治" scheme="http://bwael.com/tags/%E5%88%86%E6%B2%BB/"/>
</entry>
<entry>
<title>debian系Cron定时任务</title>
<link href="http://bwael.com/2017/03/01/debian-cron/"/>
<id>http://bwael.com/2017/03/01/debian-cron/</id>
<published>2017-03-01T12:55:54.000Z</published>
<updated>2018-12-05T03:57:05.446Z</updated>
<content type="html"><![CDATA[<h3 id="Install"><a href="#Install" class="headerlink" title="Install"></a>Install</h3><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">apt-get install cron</span><br></pre></td></tr></table></figure><h3 id="Create-a-scheduled-task"><a href="#Create-a-scheduled-task" class="headerlink" title="Create a scheduled task"></a>Create a scheduled task</h3><ol><li>键入 crontab -e 编辑 crontab 服务文件</li><li>用 crontab -u username -l 命令,查看该用户下的crontab服务是否创建成功</li><li>用 ps -ax | grep cron 查看服务是否已经运行</li></ol><p>初始化 cron 进程,使用 systemctl 进行管理的发行版同理</p><ul><li><p>启动 /etc/init.d/cron start</p></li><li><p>关闭 /etc/init.d/cron stop</p></li><li><p>重启 /etc/init.d/cron restart</p></li></ul><h3 id="Configuration"><a href="#Configuration" class="headerlink" title="Configuration"></a>Configuration</h3><h4 id="1-编辑配置文件"><a href="#1-编辑配置文件" class="headerlink" title="1. 编辑配置文件"></a>1. 编辑配置文件</h4><p> crontab是通过读取一个crontab文件来工作,这是一个普通的文本文件,里面列出了要执行的任务。每行都含有要指定的任务的命令、参数与选项,以及要执行任务的时间。(cron 软件在后台运行并且经常检查 /etc/crontab 文件。cron 软件也检查 /var/cron/tabs 目录,搜索新的 crontab 文件。这些 crontab 文件存储一些 cron 在特定时间执行任务的信息。)</p><p> crontab的基本格式:</p><a id="more"></a><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">* * * * * <span class="built_in">command</span></span><br></pre></td></tr></table></figure><p>几个星号分别为:分 时 日 月 周,最后是要执行的命令。</p><ul><li>分:0~59</li><li>时:0~23</li><li>日:1~31</li><li>月:1~12</li><li>周:0~6(0表示星期天)</li></ul><p>除了数字还有几个个特殊的符号就是* / - :</p><ul><li>* 代表所有的取值范围内的数字</li><li>/ 代表每的意思</li><li>*/5 表示每5个单位</li><li>- 代表从某个数字到某个数字</li><li>, 分开几个离散的数字</li></ul><p>配置文件的一些例子:</p><ul><li>0 3 <em> </em> * /root/test.sh 每天凌晨3点执行test.sh文件</li><li>* 23-7/1 <em> </em> * /root/lnmp restart 晚上11点到早上7点之间,每隔一小时重启lnmp套件</li><li><em>/30 </em> <em> </em> * /usr/sbin/ntpdate 每半小时同步一下时间</li><li>0 23 <em> </em> 6 /lnmp restart 每星期六的11 : 00 pm重启重启lnmp套件。</li><li><em>/1 </em> <em> </em> * echo “i am running.”>>/tmp/running.txt 每隔1分钟向/tmp/running.txt写一个”i am running.”字符串。</li></ul><h4 id="2-直接用crontab命令编辑"><a href="#2-直接用crontab命令编辑" class="headerlink" title="2. 直接用crontab命令编辑"></a>2. 直接用crontab命令编辑</h4><p>cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:</p><p>crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数</p><p>crontab -l //列出某个用户cron服务的详细内容</p><p>crontab -r //删除每个用户的cron服务</p><p>crontab -e //编辑某个用户的cron服务</p><p>比如说root查看自己的cron设置:</p><p>crontab -u root -l</p><p>再例如,root想删除fred的cron设置:</p><p>crontab -u fred -r</p><p>在编辑cron服务时,编辑的内容有一些格式和约定,输入:</p><p>crontab -u root -e</p>]]></content>
<summary type="html">
<h3 id="Install"><a href="#Install" class="headerlink" title="Install"></a>Install</h3><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">apt-get install cron</span><br></pre></td></tr></table></figure>
<h3 id="Create-a-scheduled-task"><a href="#Create-a-scheduled-task" class="headerlink" title="Create a scheduled task"></a>Create a scheduled task</h3><ol>
<li>键入 crontab -e 编辑 crontab 服务文件</li>
<li>用 crontab -u username -l 命令,查看该用户下的crontab服务是否创建成功</li>
<li>用 ps -ax | grep cron 查看服务是否已经运行</li>
</ol>
<p>初始化 cron 进程,使用 systemctl 进行管理的发行版同理</p>
<ul>
<li><p>启动 /etc/init.d/cron start</p>
</li>
<li><p>关闭 /etc/init.d/cron stop</p>
</li>
<li><p>重启 /etc/init.d/cron restart</p>
</li>
</ul>
<h3 id="Configuration"><a href="#Configuration" class="headerlink" title="Configuration"></a>Configuration</h3><h4 id="1-编辑配置文件"><a href="#1-编辑配置文件" class="headerlink" title="1. 编辑配置文件"></a>1. 编辑配置文件</h4><p> crontab是通过读取一个crontab文件来工作,这是一个普通的文本文件,里面列出了要执行的任务。每行都含有要指定的任务的命令、参数与选项,以及要执行任务的时间。(cron 软件在后台运行并且经常检查 /etc/crontab 文件。cron 软件也检查 /var/cron/tabs 目录,搜索新的 crontab 文件。这些 crontab 文件存储一些 cron 在特定时间执行任务的信息。)</p>
<p> crontab的基本格式:</p>
</summary>
<category term="学习笔记" scheme="http://bwael.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="学习笔记" scheme="http://bwael.com/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="linux" scheme="http://bwael.com/tags/linux/"/>
</entry>
<entry>
<title>基于flask的microBlog开发笔记(五)</title>
<link href="http://bwael.com/2017/02/13/microblog-develop-documentation-05/"/>
<id>http://bwael.com/2017/02/13/microblog-develop-documentation-05/</id>
<published>2017-02-13T03:51:46.000Z</published>
<updated>2018-12-05T03:59:16.972Z</updated>
<content type="html"><![CDATA[<h2 id="5-用户首页和发布博客"><a href="#5-用户首页和发布博客" class="headerlink" title="5.用户首页和发布博客"></a>5.用户首页和发布博客</h2><p>我们已经完成了登录系统,则可以使用昵称和邮件登录,接下来要完成用户个人界面信息,在此之前先将数据库清空:<br><figure class="highlight bash"><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">>>> users = User.query.all()</span><br><span class="line">>>> <span class="keyword">for</span> u <span class="keyword">in</span> users:</span><br><span class="line">... db.session.delete(u)</span><br><span class="line">...</span><br><span class="line">>>> posts = Post.query.all()</span><br><span class="line">>>> <span class="keyword">for</span> p <span class="keyword">in</span> posts:</span><br><span class="line">... db.session.delete(p)</span><br><span class="line">...</span><br><span class="line">>>> db.session.commit()</span><br></pre></td></tr></table></figure></p><p>我们将创建用户信息页,显示用户信息以及最近的 blog。作为其中一部分,我们将会学习到显示用户头像。接着,我们将要用户 web 表单用来编辑用户信。</p><h3 id="1-用户信息首页"><a href="#1-用户信息首页" class="headerlink" title="1.用户信息首页"></a>1.用户信息首页</h3><p>创建一个用户信息不需要引入新的概念,只要创建一个新的视图函数以及与它配套的 HTML 模版。添加用户信息类,并定义用户信息字段修改(forms.py)文件<br><figure class="highlight python"><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"><span class="class"><span class="keyword">class</span> <span class="title">AboutMeForm</span><span class="params">(Form)</span>:</span></span><br><span class="line"> describe = TextAreaField(<span class="string">'about me'</span>, validators=[</span><br><span class="line"> Required(), Length(max=<span class="number">140</span>)])</span><br><span class="line"> submit = SubmitField(<span class="string">'YES!'</span>)</span><br></pre></td></tr></table></figure></p><a id="more"></a><p>添加用户新信息的视图函数(app/views.py)</p><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> forms <span class="keyword">import</span> LoginForm, SignUpForm, AboutMeForm</span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route('/user/<int:user_id>', methods=["POST", "GET"])</span></span><br><span class="line"><span class="meta">@login_required</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">users</span><span class="params">(user_id)</span>:</span></span><br><span class="line"> form = AboutMeForm()</span><br><span class="line"> user = User.query.filter(User.id == user_id).first()</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> user:</span><br><span class="line"> flash(<span class="string">"The user is not exist."</span>)</span><br><span class="line"> redirect(<span class="string">"/index"</span>)</span><br><span class="line"> blogs = user.posts.all()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> render_template(</span><br><span class="line"> <span class="string">"user.html"</span>,</span><br><span class="line"> form=form,</span><br><span class="line"> user=user,</span><br><span class="line"> blogs=blogs)</span><br></pre></td></tr></table></figure><p>用于这个视图函数的装饰器与之前的有些不同,在这个例子中,我们有一个参数在里面,用 <int: user_id> 来表示。这将转化为一个同名的参数添加到视图函数。比如当客户端以URL /user/1 请求的时候,视图函数将收到一个 user_id = 1 参数从而而被调用。<br>视图函数的实现没有让人惊喜的。首先,我们使用接收到参数 user_id 试着从数据库载入用户。如果没有找到用户的话,我们将会抛出错误信息,重定向到主页,我们还添加了@login_required装饰器,如果没有登陆的用户,向通过URL直接访问该页面,那么我们会直接在页面上报错,阻止其访问。若找到用户,将其传入到 render_template 调用,并且传入user.posts.all()找出的该用户的blogs;若如果没有找到用户,模板会显示小小的提示The user is not exist!,并跳转到主页。</p><p>用户信息页,创建文件app/templates/user.html<br><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line">{% extends <span class="string">"base.html"</span> %}</span><br><span class="line"></span><br><span class="line">{% block content %}</span><br><span class="line"><p>Name: {{ user.nickname }}</p></span><br><span class="line"><p>Email: {{ user.email }}</p></span><br><span class="line"></span><br><span class="line"><hr></span><br><span class="line">{% <span class="keyword">if</span> blogs | length %}</span><br><span class="line"> {% <span class="keyword">for</span> blog <span class="keyword">in</span> blogs %}</span><br><span class="line"> <p>{{ blog.body }}</p></span><br><span class="line"> <p>{{ blog.timestamp.strftime("%a, %d %b %Y %H:%M:%S") }}</p></span><br><span class="line"> <hr /></span><br><span class="line"> {% endfor %}</span><br><span class="line">{% <span class="keyword">else</span> %}</span><br><span class="line"> <p style="color:blue;">the guy is so lazy.....</p></span><br><span class="line">{% endif %}</span><br><span class="line">{% endblock %}</span><br></pre></td></tr></table></figure></p><p>用户信息页现在已经完成了,但是缺少对它的链接。为了让用户很容易地检查他的或者她的信息,我们直接把用户信息页的链接放在导航栏中修改文件( app/templates/base.html)<br><figure class="highlight html"><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"><span class="tag"><<span class="name">div</span>></span>Microblog:</span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"{{ url_for('index') }}"</span>></span>Home<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> {% if not current_user.is_authenticated() %}</span><br><span class="line"> | <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"{{ url_for('login') }}"</span>></span>Log in<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> or <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"{{ url_for('sign_up') }}"</span>></span>Sign up<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> {% else %}</span><br><span class="line"> | <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"{{ url_for('users', user_id = current_user.id) }}"</span>></span>Profile<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> | <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"{{ url_for('logout') }}"</span>></span>Logout<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> {% endif %}</span><br><span class="line"><span class="tag"></<span class="name">div</span>></span></span><br></pre></td></tr></table></figure></p><h3 id="2-发布博客"><a href="#2-发布博客" class="headerlink" title="2.发布博客"></a>2.发布博客</h3><p>首先在forms.py文件中添加博客内容的字段:<br><figure class="highlight python"><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"><span class="class"><span class="keyword">class</span> <span class="title">PublishBlogForm</span><span class="params">(Form)</span>:</span></span><br><span class="line"> body = TextAreaField(<span class="string">'blog content'</span>, validators=[Required()])</span><br><span class="line"> submit = SubmitField(<span class="string">'Submit'</span>)</span><br></pre></td></tr></table></figure></p><p>而且要在app/views.py中加入如下函数<br><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> string <span class="keyword">import</span> strip</span><br><span class="line"><span class="keyword">import</span> datetime</span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> forms <span class="keyword">import</span> LoginForm, SignUpForm, AboutMeForm, PublishBlogForm</span><br><span class="line"></span><br><span class="line"><span class="meta">@app.route('/publish/<int:user_id>', methods=["POST", "GET"])</span></span><br><span class="line"><span class="meta">@login_required</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">publish</span><span class="params">(user_id)</span>:</span></span><br><span class="line"> form = PublishBlogForm()</span><br><span class="line"> posts = Post()</span><br><span class="line"> <span class="keyword">if</span> form.validate_on_submit():</span><br><span class="line"> blog_body = request.form.get(<span class="string">"body"</span>)</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> len(strip(blog_body)):</span><br><span class="line"> flash(<span class="string">"The content is necessray!"</span>)</span><br><span class="line"> <span class="keyword">return</span> redirect(url_for(<span class="string">"publish"</span>, user_id=user_id))</span><br><span class="line"> posts.body = blog_body</span><br><span class="line"> posts.timestamp = datetime.datetime.now()</span><br><span class="line"> posts.user_id = user_id</span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> db.session.add(posts)</span><br><span class="line"> db.session.commit()</span><br><span class="line"> <span class="keyword">except</span>:</span><br><span class="line"> flash(<span class="string">"Database error!"</span>)</span><br><span class="line"> <span class="keyword">return</span> redirect(url_for(<span class="string">"publish"</span>, user_id=user_id))</span><br><span class="line"></span><br><span class="line"> flash(<span class="string">"Publish Successful!"</span>)</span><br><span class="line"> <span class="keyword">return</span> redirect(url_for(<span class="string">"publish"</span>, user_id=user_id))</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> render_template(</span><br><span class="line"> <span class="string">"publish.html"</span>,</span><br><span class="line"> form=form)</span><br></pre></td></tr></table></figure></p><p>接收当前用户的user_id用于填充Post表的user_id字段,以便在用户主页显示该用户所属的blogs。为了防止blog内容为空,除了在forms.py里添加validator的限制外,我们还要在后台再一次对输入数据的验证,strip(blog_body)就是为了防止用户只输入空格的情况,它会将字符串两边的空格去掉,如果内容仅仅为空格的话,那么长度肯定是为0的,一旦这种事情发生了,就立即报错,并刷新当前页面。</p><p>将数据库的对应的字段赋值完毕之后,使用db.session.add(posts),db.session.commint()将值写入数据库中,因为操作数据库的时候可能会出现一些意想不到的问题,所以我们应该用try….except….来处理这些问题,提高适用性(app/publish.html)<br><figure class="highlight html"><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">{% extends "base.html" %}</span><br><span class="line"></span><br><span class="line">{% block content %}</span><br><span class="line"><span class="tag"><<span class="name">form</span> <span class="attr">action</span>=<span class="string">"{{ url_for("</span><span class="attr">publish</span>", <span class="attr">user_id</span>=<span class="string">current_user.id)</span> }}" <span class="attr">method</span>=<span class="string">"POST"</span> <span class="attr">name</span>=<span class="string">"publish"</span>></span></span><br><span class="line"> {{ form.hidden_tag() }}</span><br><span class="line"><span class="tag"><<span class="name">p</span>></span>{{ form.body }}<span class="tag"></<span class="name">p</span>></span></span><br><span class="line"><span class="tag"><<span class="name">p</span>></span>{{ form.submit }}<span class="tag"></<span class="name">p</span>></span></span><br><span class="line"><span class="tag"></<span class="name">form</span>></span></span><br><span class="line">{% endblock %}</span><br></pre></td></tr></table></figure></p><h3 id="3-子模版"><a href="#3-子模版" class="headerlink" title="3.子模版"></a>3.子模版</h3><p>已经实现了用户信息页,它能够显示用户的 blog。首页也应该显示任何一个用户这个时候的 blog 。这样就需要有两个页需要显示用户的 blog,即要制作一个渲染 blog 的子模板,我们在使用它的模板中包含这个子模板(/app/templates/post.html)<br><figure class="highlight html"><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"><span class="tag"><<span class="name">table</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">tr</span> <span class="attr">valign</span>=<span class="string">"top"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span><span class="tag"><<span class="name">img</span> <span class="attr">src</span>=<span class="string">"{{post.author.avatar(50)}}"</span>></span><span class="tag"></<span class="name">td</span>></span><span class="tag"><<span class="name">td</span>></span><span class="tag"><<span class="name">i</span>></span>{{post.author.nickname}} says:<span class="tag"></<span class="name">i</span>></span><span class="tag"><<span class="name">br</span>></span>{{post.body}}<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">tr</span>></span></span><br><span class="line"><span class="tag"></<span class="name">table</span>></span></span><br></pre></td></tr></table></figure></p><p>接着我们使用include命令在我们的用户模板中调用这个子模板(app/templates/user.html)<br><figure class="highlight html"><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></pre></td><td class="code"><pre><span class="line">{% extends "base.html" %}</span><br><span class="line"></span><br><span class="line">{% block content %}</span><br><span class="line"> <span class="tag"><<span class="name">table</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">tr</span> <span class="attr">valign</span>=<span class="string">"top"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span><span class="tag"><<span class="name">h1</span>></span>User: {{ user.nickname }}<span class="tag"></<span class="name">h1</span>></span><span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span><span class="tag"><<span class="name">h1</span>></span>User: {{ user.email }}<span class="tag"></<span class="name">h1</span>></span><span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">tr</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">table</span>></span></span><br><span class="line"><span class="tag"><<span class="name">hr</span>></span></span><br><span class="line">{% for post in posts %}</span><br><span class="line"> {% include 'post.html' %}</span><br><span class="line">{% endfor %}</span><br><span class="line">{% endblock %</span><br></pre></td></tr></table></figure></p><h3 id="4-用户自我介绍"><a href="#4-用户自我介绍" class="headerlink" title="4.用户自我介绍"></a>4.用户自我介绍</h3><p>用户自我说明可以显示在用户信息页上,因此用户会写一些自我介绍,并将它们显示在用户资料页上。也可以追踪每个用户访问页面的最后一次的时间,将把它显示在用户信息页上。为了增加这些,就必须开始修改数据库。更具体地说,就是必须在User 类上增加两个字段(app/models.py)<br><figure class="highlight python"><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="class"><span class="keyword">class</span> <span class="title">User</span><span class="params">(db.Model)</span>:</span></span><br><span class="line"> id = db.Column(db.Integer, primary_key=<span class="keyword">True</span>)</span><br><span class="line"> nickname = db.Column(db.String(<span class="number">15</span>), index=<span class="keyword">True</span>, unique=<span class="keyword">True</span>)</span><br><span class="line"> email = db.Column(db.String(<span class="number">128</span>), index=<span class="keyword">True</span>, unique=<span class="keyword">True</span>)</span><br><span class="line"> role = db.Column(db.SmallInteger, default=ROLE_USER)</span><br><span class="line"> posts = db.relationship(<span class="string">'Post'</span>, backref=<span class="string">'author'</span>, lazy=<span class="string">'dynamic'</span>)</span><br><span class="line"> about_me = db.Column(db.String(<span class="number">140</span>))</span><br><span class="line"> last_seen = db.Column(db.DateTime)</span><br></pre></td></tr></table></figure></p><p>前面已经写过数据库的迁移,因此为了增加这两个新字段到数据库,需要运行升级脚本,若没有迁移的支持,也可以手动地编辑数据库,最差的方式就是删除表再重新创建。接着,修改用户信息页模板来展示这些字段(app/templates/user.html)<br><figure class="highlight html"><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">{% extends "base.html" %}</span><br><span class="line"></span><br><span class="line">{% block content %}</span><br><span class="line"><span class="tag"><<span class="name">p</span>></span>Name: {{ user.nickname }}<span class="tag"></<span class="name">p</span>></span></span><br><span class="line"><span class="tag"><<span class="name">p</span>></span>Email: {{ user.email }}<span class="tag"></<span class="name">p</span>></span></span><br><span class="line"></span><br><span class="line">{% if user.about_me %}</span><br><span class="line"><span class="tag"><<span class="name">p</span> <span class="attr">onclick</span>=<span class="string">"about_me()"</span>></span>about me: {{ user.about_me }}<span class="tag"></<span class="name">p</span>></span></span><br><span class="line">{% else %}</span><br><span class="line"><span class="tag"><<span class="name">p</span> <span class="attr">style</span>=<span class="string">"color:#4499EE;"</span> <span class="attr">onclick</span>=<span class="string">"about_me()"</span>></span>about me: I'm a person. ---- this info from the system.<span class="tag"></<span class="name">p</span>></span></span><br><span class="line">{% endif %}</span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"aboutMe"</span> <span class="attr">style</span>=<span class="string">"display:none;"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">form</span> <span class="attr">action</span>=<span class="string">"{{ url_for('about_me', user_id=current_user.id) }}"</span> <span class="attr">method</span>=<span class="string">"POST"</span>></span></span><br><span class="line"> {{ form.hidden_tag() }}</span><br><span class="line"> {{ form.describe }}</span><br><span class="line"> {{ form.submit }}</span><br><span class="line"> <span class="tag"></<span class="name">form</span>></span></span><br><span class="line"><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">p</span> <span class="attr">style</span>=<span class="string">"color:#4c4c4c;"</span>></span>last log: {{ user.last_seen.strftime("%a, %d %b %Y %H:%M:%S") }}<span class="tag"></<span class="name">p</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"{{ url_for('publish', user_id=user.id) }}"</span>></span>Want to publish blogs?<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">hr</span> /></span></span><br><span class="line">{% if blogs | length %}</span><br><span class="line"> {% for blog in blogs %}</span><br><span class="line"> <span class="tag"><<span class="name">p</span>></span>{{ blog.body }}<span class="tag"></<span class="name">p</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">p</span>></span>{{ blog.timestamp.strftime("%a, %d %b %Y %H:%M:%S") }}<span class="tag"></<span class="name">p</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">hr</span> /></span></span><br><span class="line"> {% endfor %}</span><br><span class="line">{% else %}</span><br><span class="line"> <span class="tag"><<span class="name">p</span> <span class="attr">style</span>=<span class="string">"color:blue;"</span>></span>the guy is so lazy.....<span class="tag"></<span class="name">p</span>></span></span><br><span class="line">{% endif %}</span><br><span class="line"></span><br><span class="line">{% endblock %}</span><br><span class="line"></span><br><span class="line">{% block js %}</span><br><span class="line"><span class="tag"><<span class="name">script</span>></span><span class="undefined"></span></span><br><span class="line"><span class="undefined">function about_me() {</span></span><br><span class="line"><span class="undefined"> target = document.getElementById("aboutMe");</span></span><br><span class="line"><span class="undefined"> if (target.style.display == "block") {</span></span><br><span class="line"><span class="undefined"> target.style.display = "none";</span></span><br><span class="line"><span class="undefined"> } else {</span></span><br><span class="line"><span class="undefined"> target.style.display = "block";</span></span><br><span class="line"><span class="undefined"> }</span></span><br><span class="line"><span class="undefined">}</span></span><br><span class="line"><span class="undefined"></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line">{% endblock %}</span><br></pre></td></tr></table></figure></p><p>在user.html中多出了一段js代码,这段js代码作用是点击about me的时候,弹出一个编辑框以便我们修改自己的个人描述,当然要在base.html中添加一个block:<br><figure class="highlight html"><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="tag"><<span class="name">html</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> {% if title %}</span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>{{title}} - microblog<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"> {% else %}</span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>microblog<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"> {% endif %}</span><br><span class="line"> <span class="tag"></<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span>></span>Microblog:</span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"{{ url_for('index') }}"</span>></span>Home<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> {% if not current_user.is_authenticated() %}</span><br><span class="line"> | <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"{{ url_for('login') }}"</span>></span>Log in<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> or <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"{{ url_for('sign_up') }}"</span>></span>Sign up<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> {% else %}</span><br><span class="line"> | <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"{{ url_for('users', user_id = current_user.id) }}"</span>></span>Profile<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> | <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"{{ url_for('logout') }}"</span>></span>Logout<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> {% endif %}</span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">hr</span> /></span></span><br><span class="line"> {% with messages = get_flashed_messages() %}</span><br><span class="line"> {% if messages %}</span><br><span class="line"> <span class="tag"><<span class="name">ul</span>></span></span><br><span class="line"> {% for message in messages %}</span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span>{{ message }}<span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> {% endfor %}</span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span></span><br><span class="line"> {% endif %}</span><br><span class="line"> {% endwith %}</span><br><span class="line"> {% block content %}{% endblock %}</span><br><span class="line"> <span class="tag"></<span class="name">body</span>></span></span><br><span class="line"></span><br><span class="line"> {% block js %}{% endblock %}</span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure></p><p>最后,当要输入新的个人信息时,击yes后,能将够刷新当前页面并且显示新的个人描述,则修改views.py:<br><figure class="highlight python"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">@app.route('/user/about-me/<int:user_id>', methods=["POST", "GET"])</span></span><br><span class="line"><span class="meta">@login_required</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">about_me</span><span class="params">(user_id)</span>:</span></span><br><span class="line"> user = User.query.filter(User.id == user_id).first()</span><br><span class="line"> <span class="keyword">if</span> request.method == <span class="string">"POST"</span>:</span><br><span class="line"> content = request.form.get(<span class="string">"describe"</span>)</span><br><span class="line"> <span class="keyword">if</span> len(content) <span class="keyword">and</span> len(content) <= <span class="number">140</span>:</span><br><span class="line"> user.about_me = content</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> db.session.add(user)</span><br><span class="line"> db.session.commit()</span><br><span class="line"> <span class="keyword">except</span>:</span><br><span class="line"> flash(<span class="string">"Database error!"</span>)</span><br><span class="line"> <span class="keyword">return</span> redirect(url_for(<span class="string">"users"</span>, user_id=user_id))</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> flash(<span class="string">"Sorry, May be your data have some error."</span>)</span><br><span class="line"> <span class="keyword">return</span> redirect(url_for(<span class="string">"users"</span>, user_id=user_id))</span><br></pre></td></tr></table></figure></p><p>这里和原来写的不太一样,原来的表单提交都是在当前页面进行处理的,当点击yes后,会通过post的方式将数据发送到/user/about-me/2页面上去处理,所以使用request.method == “POST”进行判定之后,获取表单数据,当然也要判断content的长度,并进行相应的处理,最后跳转回用户主页面。</p>]]></content>
<summary type="html">
<h2 id="5-用户首页和发布博客"><a href="#5-用户首页和发布博客" class="headerlink" title="5.用户首页和发布博客"></a>5.用户首页和发布博客</h2><p>我们已经完成了登录系统,则可以使用昵称和邮件登录,接下来要完成用户个人界面信息,在此之前先将数据库清空:<br><figure class="highlight bash"><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">&gt;&gt;&gt; users = User.query.all()</span><br><span class="line">&gt;&gt;&gt; <span class="keyword">for</span> u <span class="keyword">in</span> users:</span><br><span class="line">... db.session.delete(u)</span><br><span class="line">...</span><br><span class="line">&gt;&gt;&gt; posts = Post.query.all()</span><br><span class="line">&gt;&gt;&gt; <span class="keyword">for</span> p <span class="keyword">in</span> posts:</span><br><span class="line">... db.session.delete(p)</span><br><span class="line">...</span><br><span class="line">&gt;&gt;&gt; db.session.commit()</span><br></pre></td></tr></table></figure></p>
<p>我们将创建用户信息页,显示用户信息以及最近的 blog。作为其中一部分,我们将会学习到显示用户头像。接着,我们将要用户 web 表单用来编辑用户信。</p>
<h3 id="1-用户信息首页"><a href="#1-用户信息首页" class="headerlink" title="1.用户信息首页"></a>1.用户信息首页</h3><p>创建一个用户信息不需要引入新的概念,只要创建一个新的视图函数以及与它配套的 HTML 模版。添加用户信息类,并定义用户信息字段修改(forms.py)文件<br><figure class="highlight python"><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"><span class="class"><span class="keyword">class</span> <span class="title">AboutMeForm</span><span class="params">(Form)</span>:</span></span><br><span class="line"> describe = TextAreaField(<span class="string">'about me'</span>, validators=[</span><br><span class="line"> Required(), Length(max=<span class="number">140</span>)])</span><br><span class="line"> submit = SubmitField(<span class="string">'YES!'</span>)</span><br></pre></td></tr></table></figure></p>
</summary>
<category term="学习笔记" scheme="http://bwael.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="学习笔记" scheme="http://bwael.com/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<category term="python" scheme="http://bwael.com/tags/python/"/>
<category term="flask" scheme="http://bwael.com/tags/flask/"/>
<category term="web" scheme="http://bwael.com/tags/web/"/>
</entry>
</feed>