-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
500 lines (296 loc) · 221 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>丰木木de学习计划</title>
<subtitle>We are here to put a dent in the universe</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="https://fengmumu1.github.io/"/>
<updated>2019-08-18T09:28:39.576Z</updated>
<id>https://fengmumu1.github.io/</id>
<author>
<name>丰林</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>可以拖拽的树形表格</title>
<link href="https://fengmumu1.github.io/2019/08/18/drag-list/"/>
<id>https://fengmumu1.github.io/2019/08/18/drag-list/</id>
<published>2019-08-18T08:43:35.000Z</published>
<updated>2019-08-18T09:28:39.576Z</updated>
<content type="html"><![CDATA[<p> 前几天在吹逼群里见到一个问题很有意思,<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">渲染一个树状结构,节点可以拖拽,实现以下特性</span><br><span class="line">0.节点可以展开/收缩</span><br><span class="line">1.将S从上/下方拖过上一个节点T的中位线时,S节点占位移动到T节点的位置。</span><br><span class="line">2.将S节点拖入T节点20%-50%或50%-80%位置区间,但未穿过50%时,如果停留时间超过0.5秒,则将S节点加入T的子节点,并展开T节点。</span><br><span class="line">3.当用户释放正在拖拽的S节点时,调整节点从属关系。</span><br><span class="line">要求所有视觉由流畅的动画表现。</span><br><span class="line">请梳理其中数据流关系。</span><br></pre></td></tr></table></figure></p><p> 自己试着实现了一下<br><a id="more"></a><br> 题目给了一个效果,如下<br> <img src="/2019/08/18/drag-list/dome.GIF" title="拖拽dome"><br> 自己实现了一下,效果如下<br> <img src="/2019/08/18/drag-list/my.GIF" title="实现的结果"></p><ul><li>没有过多的修改 dome 只用 css 简单做了一下移动样式的变化</li><li>比较麻烦的就是不同的移动场景要分开处理<br>具体的代码实现: <a href="https://codepen.io/fengmumu1/pen/aboNwWd" target="_blank" rel="noopener">https://codepen.io/fengmumu1/pen/aboNwWd</a></li></ul>]]></content>
<summary type="html">
<p> 前几天在吹逼群里见到一个问题很有意思,<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">渲染一个树状结构,节点可以拖拽,实现以下特性</span><br><span class="line">0.节点可以展开/收缩</span><br><span class="line">1.将S从上/下方拖过上一个节点T的中位线时,S节点占位移动到T节点的位置。</span><br><span class="line">2.将S节点拖入T节点20%-50%或50%-80%位置区间,但未穿过50%时,如果停留时间超过0.5秒,则将S节点加入T的子节点,并展开T节点。</span><br><span class="line">3.当用户释放正在拖拽的S节点时,调整节点从属关系。</span><br><span class="line">要求所有视觉由流畅的动画表现。</span><br><span class="line">请梳理其中数据流关系。</span><br></pre></td></tr></table></figure></p>
<p> 自己试着实现了一下<br>
</summary>
<category term="JavaScript" scheme="https://fengmumu1.github.io/categories/JavaScript/"/>
<category term="JavaScript" scheme="https://fengmumu1.github.io/tags/JavaScript/"/>
<category term="拖拽" scheme="https://fengmumu1.github.io/tags/%E6%8B%96%E6%8B%BD/"/>
<category term="杂题" scheme="https://fengmumu1.github.io/tags/%E6%9D%82%E9%A2%98/"/>
</entry>
<entry>
<title>react 入参类型判断</title>
<link href="https://fengmumu1.github.io/2019/06/02/judgmentType/"/>
<id>https://fengmumu1.github.io/2019/06/02/judgmentType/</id>
<published>2019-06-02T06:15:20.000Z</published>
<updated>2019-08-18T09:29:25.592Z</updated>
<content type="html"><![CDATA[<p> 在用框架的时候,我们是经常需要对传入的参数做一个类型判断的。框架一般都给我提供了对应的工具函数。比如 react 就提供了 PropTypes 这个玩意,那么如果我们要自己做判断呢,我们要如何来做一个类似的类型检测。<br><a id="more"></a></p><h3 id="小试牛刀之-typeof"><a href="#小试牛刀之-typeof" class="headerlink" title="小试牛刀之 typeof"></a>小试牛刀之 typeof</h3>]]></content>
<summary type="html">
<p> 在用框架的时候,我们是经常需要对传入的参数做一个类型判断的。框架一般都给我提供了对应的工具函数。比如 react 就提供了 PropTypes 这个玩意,那么如果我们要自己做判断呢,我们要如何来做一个类似的类型检测。<br>
</summary>
<category term="JavaScript" scheme="https://fengmumu1.github.io/categories/JavaScript/"/>
<category term="JavaScript" scheme="https://fengmumu1.github.io/tags/JavaScript/"/>
<category term="随笔" scheme="https://fengmumu1.github.io/tags/%E9%9A%8F%E7%AC%94/"/>
<category term="基础知识" scheme="https://fengmumu1.github.io/tags/%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/"/>
</entry>
<entry>
<title>git基本操作</title>
<link href="https://fengmumu1.github.io/2019/04/08/git-note/"/>
<id>https://fengmumu1.github.io/2019/04/08/git-note/</id>
<published>2019-04-08T15:22:28.000Z</published>
<updated>2019-06-02T06:13:42.749Z</updated>
<content type="html"><![CDATA[<p> Git一直都是使用的简单的命令,比如<code>git add</code>、<code>git status</code>、<code>git pull</code>、<code>git push</code> 、<code>git commit</code>、<code>git checkout</code> 、 <code>git merge</code> ,这些在工作的时候基本能满足大部分的需求了,但是一些复杂点的操作,或者其中的原理还是一知半解的,所以买了一些课程,也搜集了一些资料,希望可以把git彻底搞懂,<br><a id="more"></a></p><h3 id="Git的基础设置"><a href="#Git的基础设置" class="headerlink" title="Git的基础设置"></a>Git的基础设置</h3><ul><li>账户相关的设置<ul><li>用户名称设置: <code>git config --global user.name 'your_name</code></li><li>用户email设置: <code>git config --global user.eamil '[email protected]'</code><blockquote><p>我们设置的目的是,首先修改会有名字的显示,包括提以及最初的作者、其次在有变动之后可以配置利用邮箱来通知作者接收变动通知</p><div class="note success"><p>global 处可以有一下三个参数</p><table><thead><tr><th style="text-align:center">参数名</th><th style="text-align:center">寓意</th></tr></thead><tbody><tr><td style="text-align:center">global</td><td style="text-align:center">对当前用户所有仓库有效</td></tr><tr><td style="text-align:center">local</td><td style="text-align:center">只针对某一个仓库设置</td></tr><tr><td style="text-align:center">system</td><td style="text-align:center">针对所有登录的用户有效</td></tr></tbody></table></div></blockquote></li></ul></li><li>查看账户相关的设置<ul><li>用户名全局设置: <code>git config --global --list</code><blockquote><p>global 处和上面的三个参数是一一对应的</p></blockquote><h3 id="创建-Git-仓库"><a href="#创建-Git-仓库" class="headerlink" title="创建 Git 仓库"></a>创建 Git 仓库</h3></li></ul></li><li><p>在已有的代码的项目项目中使用 git 来管理</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd 项目所在目录 // 如果打开位置就在目录里,就不需要进去啦</span><br><span class="line">git init // 然后就会给你弹相关的设置</span><br></pre></td></tr></table></figure></li><li><p>直接用 git 新建一个项目</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd 项目预计目录 // 如果打开位置就在目录里,就不需要进去啦</span><br><span class="line">git init you_project_name // 会在所在目录创建和项目名一样的文件夹,并且在里面放入 git 配置文件</span><br></pre></td></tr></table></figure></li></ul><h3 id="git-暂存区和版本提交"><a href="#git-暂存区和版本提交" class="headerlink" title="git 暂存区和版本提交"></a>git 暂存区和版本提交</h3><ul><li>我们使用 <code>git add xx</code> 是把文件添加到暂存区<br>add 后面可以写多个文件名,也可以直接写 <code>.</code> , 来把所有的文件都添加进去。</li><li>使用 <code>git commite</code> 把暂存区的文件提交到版本中去。</li><li>使用 <code>git status</code> 我们可以查看当前项目内更改了的文件,以及文件的状态是监控了,还是未监控。<h3 id="使用-git-直接给文件夹重命名"><a href="#使用-git-直接给文件夹重命名" class="headerlink" title="使用 git 直接给文件夹重命名"></a>使用 git 直接给文件夹重命名</h3></li><li><p>使用 <code>git mv 原始文件名 目标文件名</code> 这个比较方便一点。</p><h3 id="查看-git-的版本记录"><a href="#查看-git-的版本记录" class="headerlink" title="查看 git 的版本记录"></a>查看 git 的版本记录</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">git log // 输出 git 的所有的日志</span><br><span class="line">// 参数</span><br><span class="line">-n* // 可以指定查看就近提交的数量,* 是数量,注意 * 和 n 之间没有空格。</span><br><span class="line">--oneline // 一个比较简洁的方式查看 log 日志</span><br><span class="line">--graph // 可以查看分支合并关系的一个操作</span><br></pre></td></tr></table></figure><blockquote><p>需要注意的一点是,当 log 过多且查看的时候没有指定数量,必须要使用 q (q 键)来退出。</p></blockquote></li></ul>]]></content>
<summary type="html">
<p> Git一直都是使用的简单的命令,比如<code>git add</code>、<code>git status</code>、<code>git pull</code>、<code>git push</code> 、<code>git commit</code>、<code>git checkout</code> 、 <code>git merge</code> ,这些在工作的时候基本能满足大部分的需求了,但是一些复杂点的操作,或者其中的原理还是一知半解的,所以买了一些课程,也搜集了一些资料,希望可以把git彻底搞懂,<br>
</summary>
<category term="git" scheme="https://fengmumu1.github.io/categories/git/"/>
<category term="git" scheme="https://fengmumu1.github.io/tags/git/"/>
<category term="技巧" scheme="https://fengmumu1.github.io/tags/%E6%8A%80%E5%B7%A7/"/>
<category term="笔记" scheme="https://fengmumu1.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
</entry>
<entry>
<title>动态规划之“背包问题”</title>
<link href="https://fengmumu1.github.io/2018/08/11/dp/"/>
<id>https://fengmumu1.github.io/2018/08/11/dp/</id>
<published>2018-08-11T13:41:48.000Z</published>
<updated>2018-08-12T13:59:25.056Z</updated>
<content type="html"><![CDATA[<p>做个找硬币的问题,然后自己啃了一下相关的动态规划的资料,随笔如下<br><a id="more"></a><br>题目要求如下<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><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">Coin Change</span><br><span class="line"></span><br><span class="line">You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.</span><br><span class="line"></span><br><span class="line">Example 1:</span><br><span class="line"></span><br><span class="line">Input: coins = [1, 2, 5], amount = 11</span><br><span class="line">Output: 3 </span><br><span class="line">Explanation: 11 = 5 + 5 + 1</span><br><span class="line"></span><br><span class="line">Example 2:</span><br><span class="line"></span><br><span class="line">Input: coins = [2], amount = 3</span><br><span class="line">Output: -1</span><br></pre></td></tr></table></figure></p><p>我写的代码:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><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></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * @param {number[]} coins</span></span><br><span class="line"><span class="comment"> * @param {number} amount</span></span><br><span class="line"><span class="comment"> * @return {number}</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">var</span> coinChange1 = <span class="function"><span class="keyword">function</span>(<span class="params">coins, amount</span>) </span>{</span><br><span class="line"> <span class="keyword">let</span> result = <span class="number">0</span></span><br><span class="line"> <span class="keyword">let</span> temp = []</span><br><span class="line"> <span class="comment">//优化的结果,由于原始的递归式中,会有大量重复计算,所以把重复计算的东西存储下来。用空间换时间</span></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> i = <span class="number">0</span>; i < coins.length; i++) temp.push([])</span><br><span class="line"> <span class="function"><span class="keyword">function</span> <span class="title">dp</span>(<span class="params">index, coin, amou</span>)</span>{</span><br><span class="line"> <span class="keyword">if</span>(amou == <span class="number">0</span>) <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span>(index >= coin.length) <span class="keyword">return</span> <span class="literal">Infinity</span></span><br><span class="line"> <span class="keyword">if</span>(amou < <span class="number">0</span>) <span class="keyword">return</span> <span class="literal">Infinity</span> </span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span>(temp[index][amou] !== <span class="literal">undefined</span> ) <span class="keyword">return</span> temp[index][amou]</span><br><span class="line"> <span class="comment">//每次都有两种选择方法</span></span><br><span class="line"> <span class="comment">//选择取当前的,取了之后(由于不是01问题所以还可以取,所以下标不变,目标减少)</span></span><br><span class="line"> <span class="keyword">let</span> a = dp(index, coin, amou - coin[index]) + <span class="number">1</span></span><br><span class="line"> <span class="comment">//不取当前的,直接取后面的,则目标不变,下标改变</span></span><br><span class="line"> <span class="keyword">let</span> b = dp(index + <span class="number">1</span>, coin, amou)</span><br><span class="line"> <span class="comment">//我们看这两种哪一种取得的硬币书目少就取那种</span></span><br><span class="line"> <span class="keyword">let</span> res = <span class="built_in">Math</span>.min(a, b)</span><br><span class="line"> <span class="comment">//index 为使用哪种硬币,amoun 是目标</span></span><br><span class="line"> temp[index][amou] = res</span><br><span class="line"> <span class="keyword">return</span> res</span><br><span class="line"> }</span><br><span class="line"> result = dp(<span class="number">0</span>, coins, amount) </span><br><span class="line"> <span class="comment">//找不到等结果为 Indinity</span></span><br><span class="line"> <span class="keyword">if</span>(result == <span class="literal">Infinity</span>) <span class="keyword">return</span> <span class="number">-1</span></span><br><span class="line"> <span class="keyword">return</span> result</span><br><span class="line">};</span><br><span class="line"><span class="comment">/* </span></span><br><span class="line"><span class="comment">使用上面的递归式,一开始比较纠结的是那个二维数组的结构,为什么是 temp[index][amou] ,而不是 temp[amou][index] 或者其他,我们想一下人来试验拿的时候如何去拿(枚举所有结果),先从小的开始拿,比如我只拿 coins[0] 即我只用 1,那么我要11个1,然后继续我用coins[0] 和 coin[1] 两种硬币,那么我会先看 2 需要几个,然后不够的用 1 来补充,我们考虑到硬币是整数的,然后不同的硬币的组合也是整数的,所以我们是不是可以这样子想,我目标是11,我用 5 个 2 得到了 10 ,然后需要 1 个 1 ,人可以很直观的看到,机器不可以,那么我们是不是可以给一个检索信息,就是 使用 1 这种硬币拼出 1 这个目标需要多少枚硬币,我们是不是只需要看temp[index][amou]的结果就好了。</span></span><br><span class="line"><span class="comment">然后得到了优化后的递归式,我们来试着写他的地推式</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="keyword">var</span> coinChange2 = <span class="function"><span class="keyword">function</span>(<span class="params">coins, amount</span>) </span>{</span><br><span class="line"> <span class="keyword">let</span> temp = []</span><br><span class="line"> <span class="keyword">if</span>(amount === <span class="number">0</span>) <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span>(amount < <span class="number">0</span>) <span class="keyword">return</span> <span class="number">-1</span></span><br><span class="line"> <span class="keyword">if</span>(coins.length == <span class="number">0</span> && amount > <span class="number">0</span>) <span class="keyword">return</span> <span class="number">-1</span></span><br><span class="line"> <span class="comment">//我们需要知道是的递推式是递归式的自下向上的写法,所以我们此时需要明确的是底到底是谁?</span></span><br><span class="line"> <span class="comment">//我们通过看上面的其实可以看到递归式的最后是index = 2,但是我们需要知道index = 2的状态是</span></span><br><span class="line"> <span class="comment">//由边界条件生成的,所有我们需要提前手动生成一个可以推出 index = 2 的东西 </span></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> i = <span class="number">0</span> ; i <= coins.length; ++i) temp.push([])</span><br><span class="line"> temp.forEach(<span class="function"><span class="params">item</span> =></span> {</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> i = <span class="number">0</span> ; i <= amount; ++i) item.push(<span class="literal">Infinity</span>)</span><br><span class="line"> })</span><br><span class="line"> <span class="comment">//由于 index = 3 即没有这种硬币,所以只有为 0 不找钱的时候有结果 0</span></span><br><span class="line"> temp[coins.length][<span class="number">0</span>] = <span class="number">0</span></span><br><span class="line"> </span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> k = coins.length - <span class="number">1</span>; k >= <span class="number">0</span> ; k--){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> j = <span class="number">0</span>; j <= amount; j++){</span><br><span class="line"> <span class="comment">//这个是我不用这种硬币,使用下一种硬币</span></span><br><span class="line"> temp[k][j] = temp[k + <span class="number">1</span>][j]</span><br><span class="line"> <span class="comment">//这个是我们此时用的硬币大于目标,只用使用下一种,所以不进入循环</span></span><br><span class="line"> <span class="comment">//如果小于那么结果就是 取了一枚硬币 + amoun 减去此时硬币的数值后的对应值需要的硬币数</span></span><br><span class="line"> <span class="comment">//我们之所以用循环是因为,我们使用此时的硬币后,我还可以选择这个硬币,所以我还需要重复这个步骤</span></span><br><span class="line"> <span class="comment">//即我还可以再取这个硬币</span></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> i = <span class="number">1</span>; i <= amount/coins[k] ; i++) {</span><br><span class="line"> <span class="keyword">let</span> pre = temp[k][j - coins[k] * i]</span><br><span class="line"> <span class="keyword">if</span>(pre < <span class="literal">Infinity</span>) temp[k][j] = <span class="built_in">Math</span>.min(temp[k][j], pre + i)</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(temp[<span class="number">0</span>][amount] < <span class="literal">Infinity</span>) <span class="keyword">return</span> temp[<span class="number">0</span>][amount]</span><br><span class="line"> <span class="keyword">return</span> <span class="number">-1</span></span><br><span class="line">}</span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">上面的时间复杂度很高,所以需要简化一下</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="keyword">var</span> coinChange3 = <span class="function"><span class="keyword">function</span>(<span class="params">coins, amount</span>) </span>{</span><br><span class="line"> <span class="keyword">let</span> temp = []</span><br><span class="line"> <span class="keyword">if</span>(amount === <span class="number">0</span>) <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span>(amount < <span class="number">0</span>) <span class="keyword">return</span> <span class="number">-1</span></span><br><span class="line"> <span class="keyword">if</span>(coins.length == <span class="number">0</span> && amount > <span class="number">0</span>) <span class="keyword">return</span> <span class="number">-1</span></span><br><span class="line"> </span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> i = <span class="number">0</span> ; i <= coins.length; ++i) temp.push([])</span><br><span class="line"> temp.forEach(<span class="function"><span class="params">item</span> =></span> {</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> i = <span class="number">0</span> ; i <= amount; ++i) item.push(<span class="literal">Infinity</span>)</span><br><span class="line"> })</span><br><span class="line"> temp[coins.length][<span class="number">0</span>] = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> k = coins.length - <span class="number">1</span>; k >= <span class="number">0</span> ; k--){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> j = <span class="number">0</span>; j <= amount; j++){</span><br><span class="line"> <span class="keyword">if</span>( j - coins[k] > <span class="number">0</span>){</span><br><span class="line"> <span class="comment">//我们去掉了这个循环,是因为我们想一下,取了当前的硬币,然后最小的硬币数目,就是使用当前硬币数的 </span></span><br><span class="line"> <span class="comment">//amoun - 硬币面额 后的目标 需要最小硬币数 + 1 (我们此时取的硬币)</span></span><br><span class="line"> <span class="keyword">let</span> a = temp[k + <span class="number">1</span>][j]</span><br><span class="line"> <span class="keyword">let</span> b = temp[k][j - coins[k]] </span><br><span class="line"> temp[k][j] = <span class="built_in">Math</span>.min(a, b + <span class="number">1</span>)</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> temp[k][j] = temp[k + <span class="number">1</span>][j]</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(temp[<span class="number">0</span>][amount] < <span class="literal">Infinity</span>) <span class="keyword">return</span> temp[<span class="number">0</span>][amount]</span><br><span class="line"> <span class="keyword">return</span> <span class="number">-1</span></span><br><span class="line">}</span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">时间复杂度降低了,我们试着降低一下空间复杂度</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> coinChange4 = <span class="function"><span class="keyword">function</span>(<span class="params">coins, amount</span>) </span>{</span><br><span class="line"> <span class="keyword">let</span> temp = []</span><br><span class="line"> <span class="keyword">if</span>(amount === <span class="number">0</span>) <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span>(amount < <span class="number">0</span>) <span class="keyword">return</span> <span class="number">-1</span></span><br><span class="line"> <span class="keyword">if</span>(coins.length == <span class="number">0</span> && amount > <span class="number">0</span>) <span class="keyword">return</span> <span class="number">-1</span></span><br><span class="line"> </span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> i = <span class="number">0</span> ; i <= amount; ++i) temp.push(<span class="literal">Infinity</span>)</span><br><span class="line"> temp[<span class="number">0</span>] = <span class="number">0</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> k = coins.length - <span class="number">1</span>; k >= <span class="number">0</span> ; k--){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> j = <span class="number">0</span>; j <= amount; j++){</span><br><span class="line"> <span class="keyword">if</span>(j - coins[k] > <span class="number">0</span>){</span><br><span class="line"> <span class="keyword">let</span> a = temp[j]</span><br><span class="line"> <span class="keyword">let</span> b = temp[j - coins[k]]</span><br><span class="line"> temp[j] = <span class="built_in">Math</span>.min(a, b + <span class="number">1</span>)</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> temp[j] = temp[j]</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(temp[amount] < <span class="literal">Infinity</span>) <span class="keyword">return</span> temp[amount]</span><br><span class="line"> <span class="keyword">return</span> <span class="number">-1</span></span><br><span class="line">}</span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">这个文字不好描述,一般动态规划都可以使用滚动数组来存放,然后我们发现这个东西用到的都是数组的一半空间</span></span><br><span class="line"><span class="comment">所以使用一个一维数组,需要自己画一下图就可以理解了</span></span><br><span class="line"><span class="comment">*/</span></span><br></pre></td></tr></table></figure><p>console.log(coinChange([1,2,5],11))</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><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></pre></td><td class="code"><pre><span class="line"><span class="comment">/*我们如果硬币不能重复呢?,我们如何做*/</span></span><br><span class="line"><span class="keyword">var</span> coinChangeTwo1 = <span class="function"><span class="keyword">function</span>(<span class="params">coins, amount</span>) </span>{</span><br><span class="line"> <span class="keyword">let</span> result = <span class="number">0</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">function</span> <span class="title">dp</span>(<span class="params">index, coin, amou</span>)</span>{</span><br><span class="line"> <span class="keyword">if</span>(amou === <span class="number">0</span>) <span class="keyword">return</span> <span class="number">0</span> </span><br><span class="line"> <span class="keyword">if</span>(amou < <span class="number">0</span>) <span class="keyword">return</span> <span class="literal">Infinity</span></span><br><span class="line"> <span class="keyword">if</span>(index > coin.length) <span class="keyword">return</span> <span class="literal">Infinity</span></span><br><span class="line"> <span class="comment">//不管用不用,我们都要给下标加 1 </span></span><br><span class="line"> <span class="keyword">let</span> a = dp(index + <span class="number">1</span>, coin, amou - coin[index]) + <span class="number">1</span></span><br><span class="line"> <span class="keyword">let</span> b = dp(index + <span class="number">1</span>, coin, amou)</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">Math</span>.min(a, b)</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> result = dp(<span class="number">0</span>, coins, amount)</span><br><span class="line"> <span class="keyword">if</span>(result !== <span class="literal">Infinity</span>) <span class="keyword">return</span> result</span><br><span class="line"> <span class="keyword">return</span> <span class="number">-1</span></span><br><span class="line"> }</span><br><span class="line"><span class="comment">/*我们试着自底向上写出递推式*/</span></span><br><span class="line"><span class="keyword">var</span> coinChangeTwo2 = <span class="function"><span class="keyword">function</span>(<span class="params">coins, amount</span>) </span>{</span><br><span class="line"> <span class="keyword">let</span> result = <span class="number">0</span></span><br><span class="line"> <span class="keyword">let</span> temp = []</span><br><span class="line"> <span class="keyword">if</span>(amount === <span class="number">0</span>) <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span>(amount < <span class="number">0</span>) <span class="keyword">return</span> <span class="number">-1</span></span><br><span class="line"> <span class="keyword">if</span>(coins.length == <span class="number">0</span> && amount > <span class="number">0</span>) <span class="keyword">return</span> <span class="number">-1</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> i = <span class="number">0</span> ; i <= coins.length; ++i) temp.push([])</span><br><span class="line"> temp.forEach(<span class="function"><span class="params">item</span> =></span> {</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> i = <span class="number">0</span> ; i <= amount; ++i) item.push(<span class="literal">Infinity</span>)</span><br><span class="line"> })</span><br><span class="line"></span><br><span class="line"> temp[coins.length][<span class="number">0</span>] = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> i = coins.length - <span class="number">1</span>; i >= <span class="number">0</span>; i--){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> j = <span class="number">0</span>; j <= amount; ++j){</span><br><span class="line"> <span class="comment">//我们需要考虑如果我取了这个硬币,这个硬币不应该大于目标数额</span></span><br><span class="line"> <span class="keyword">if</span>(j - coins[i] >= <span class="number">0</span>) {</span><br><span class="line"> <span class="keyword">let</span> a = temp[i + <span class="number">1</span>][j]</span><br><span class="line"> <span class="keyword">let</span> b = temp[i + <span class="number">1</span>][j - coins[i]] + <span class="number">1</span></span><br><span class="line"> temp[i][j] = <span class="built_in">Math</span>.min(a, b)</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">//如果硬币大于目标数额,无法取当前的硬币 </span></span><br><span class="line"> temp[i][j] = temp[i + <span class="number">1</span>][j]</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> result = temp[<span class="number">0</span>][amount]</span><br><span class="line"> <span class="keyword">if</span>(result !== <span class="literal">Infinity</span>) <span class="keyword">return</span> result</span><br><span class="line"> <span class="keyword">return</span> <span class="number">-1</span></span><br><span class="line"> }</span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">我们是可以利用滚动数组再优化的,然后如果我们需要知道我使用了那些硬币呢?我该如何操作</span></span><br><span class="line"><span class="comment">我想到的是保留这些数据然后反向查询</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="keyword">var</span> coinChangeTwo3 = <span class="function"><span class="keyword">function</span>(<span class="params">coins, amount</span>) </span>{</span><br><span class="line"> <span class="keyword">let</span> result = <span class="number">0</span></span><br><span class="line"> <span class="keyword">let</span> temp = []</span><br><span class="line"> <span class="keyword">if</span>(amount === <span class="number">0</span>) <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span>(amount < <span class="number">0</span>) <span class="keyword">return</span> <span class="number">-1</span></span><br><span class="line"> <span class="keyword">if</span>(coins.length == <span class="number">0</span> && amount > <span class="number">0</span>) <span class="keyword">return</span> <span class="number">-1</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> i = <span class="number">0</span> ; i <= coins.length; ++i) temp.push([])</span><br><span class="line"> temp.forEach(<span class="function"><span class="params">item</span> =></span> {</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> i = <span class="number">0</span> ; i <= amount; ++i) item.push(<span class="literal">Infinity</span>)</span><br><span class="line"> })</span><br><span class="line"></span><br><span class="line"> <span class="keyword">let</span> fonit = []</span><br><span class="line"> temp[coins.length][<span class="number">0</span>] = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> i = coins.length - <span class="number">1</span>; i >= <span class="number">0</span>; i--){</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> j = <span class="number">0</span>; j <= amount; ++j){</span><br><span class="line"> temp[i][j] = temp[i + <span class="number">1</span>][j]</span><br><span class="line"> <span class="keyword">if</span>(j - coins[i] >= <span class="number">0</span>) {</span><br><span class="line"> <span class="keyword">let</span> a = temp[i + <span class="number">1</span>][j]</span><br><span class="line"> <span class="keyword">let</span> b = temp[i + <span class="number">1</span>][j - coins[i]] + <span class="number">1</span></span><br><span class="line"> temp[i][j] = <span class="built_in">Math</span>.min(a, b)</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">let</span> w = temp[<span class="number">0</span>][amount]</span><br><span class="line"> <span class="keyword">let</span> s = <span class="number">0</span></span><br><span class="line"> <span class="keyword">let</span> am = amount</span><br><span class="line"> <span class="comment">//我们看我们用了几个硬币,且我们可以拼出目标结果</span></span><br><span class="line"> <span class="keyword">while</span>(w > <span class="number">0</span> && w !== <span class="literal">Infinity</span>) {</span><br><span class="line"> <span class="comment">//如果一个数据的下一行不是无穷大,那么说明我没有取这一行的硬币</span></span><br><span class="line"> <span class="keyword">if</span>(temp[s + <span class="number">1</span>][am] !== <span class="literal">Infinity</span>) s = s + <span class="number">1</span></span><br><span class="line"> <span class="comment">//如果是无穷大,我必须要取这一行的硬币,</span></span><br><span class="line"> <span class="keyword">if</span>(temp[s + <span class="number">1</span>][am] == <span class="literal">Infinity</span>) {</span><br><span class="line"> fonit.push(s)</span><br><span class="line"> am = am - coins[s] </span><br><span class="line"> s = s + <span class="number">1</span></span><br><span class="line"> w--</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="built_in">console</span>.log(fonit)</span><br><span class="line"> </span><br><span class="line"> result = temp[<span class="number">0</span>][amount]</span><br><span class="line"> <span class="keyword">if</span>(result !== <span class="literal">Infinity</span>) <span class="keyword">return</span> result</span><br><span class="line"> <span class="keyword">return</span> <span class="number">-1</span></span><br><span class="line"> }</span><br></pre></td></tr></table></figure><p>我没有写没有可以重复取硬币的记录,不过大同小异</p>]]></content>
<summary type="html">
<p>做个找硬币的问题,然后自己啃了一下相关的动态规划的资料,随笔如下<br>
</summary>
<category term="leetcode" scheme="https://fengmumu1.github.io/categories/leetcode/"/>
<category term="算法" scheme="https://fengmumu1.github.io/tags/%E7%AE%97%E6%B3%95/"/>
<category term="动态规划" scheme="https://fengmumu1.github.io/tags/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/"/>
</entry>
<entry>
<title>Multiply-Strings</title>
<link href="https://fengmumu1.github.io/2018/08/05/Multiply-Strings/"/>
<id>https://fengmumu1.github.io/2018/08/05/Multiply-Strings/</id>
<published>2018-08-05T14:46:43.000Z</published>
<updated>2018-08-05T14:50:05.163Z</updated>
<content type="html"><![CDATA[<p>题目:Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and num2, also represented as a string.</p><a id="more"></a><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * @param {string} num1</span></span><br><span class="line"><span class="comment"> * @param {string} num2</span></span><br><span class="line"><span class="comment"> * @return {string}</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">var</span> multiply = <span class="function"><span class="keyword">function</span>(<span class="params">num1, num2</span>) </span>{</span><br><span class="line"> <span class="keyword">debugger</span></span><br><span class="line"> <span class="keyword">let</span> numa = num1.split(<span class="string">""</span>)</span><br><span class="line"> <span class="keyword">let</span> numb = num2.split(<span class="string">""</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">let</span> result = []</span><br><span class="line"> <span class="keyword">let</span> re = []</span><br><span class="line"> <span class="keyword">if</span>(numa.length === <span class="number">0</span> || numb.length === <span class="number">0</span>) <span class="keyword">return</span> <span class="string">'0'</span></span><br><span class="line"> <span class="keyword">if</span>((numa.length === <span class="number">1</span> && numa[<span class="number">0</span>] === <span class="string">'0'</span> )|| (numb.length === <span class="number">1</span> && numb[<span class="number">0</span>] === <span class="string">'0'</span>)) <span class="keyword">return</span> <span class="string">'0'</span></span><br><span class="line"> result.length = (numa.length + numb.length)</span><br><span class="line"> result.fill(<span class="number">0</span>)</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> i = numa.length - <span class="number">1</span>; i >= <span class="number">0</span>; i--) {</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> j = numb.length <span class="number">-1</span>; j >= <span class="number">0</span>; j--) {</span><br><span class="line"> <span class="keyword">let</span> sum = numa[i] * numb[j]</span><br><span class="line"> <span class="keyword">let</span> p1 = i + j</span><br><span class="line"> <span class="keyword">let</span> p2 = i + j + <span class="number">1</span></span><br><span class="line"> sum += result[p2]</span><br><span class="line"> result[p1] += sum / <span class="number">10</span> >> <span class="number">0</span></span><br><span class="line"> result[p2] = sum % <span class="number">10</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">let</span> k = <span class="number">0</span></span><br><span class="line"> <span class="keyword">while</span>(result[k] === <span class="number">0</span>) k++</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> i = k; i < result.length; i++) {</span><br><span class="line"> re.push(result[i])</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> re.join(<span class="string">""</span>)</span><br><span class="line">};</span><br></pre></td></tr></table></figure><hr><p><a href="https://leetcode.com/problems/multiply-strings/description/" target="_blank" rel="noopener">题目连接</a><br><a href="https://www.youtube.com/watch?v=q3vpdwWR0ag" target="_blank" rel="noopener">参考资料</a></p>]]></content>
<summary type="html">
<p>题目:Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and num2, also represented as a string.</p>
</summary>
<category term="leetcode" scheme="https://fengmumu1.github.io/categories/leetcode/"/>
<category term="大数相加" scheme="https://fengmumu1.github.io/tags/%E5%A4%A7%E6%95%B0%E7%9B%B8%E5%8A%A0/"/>
</entry>
<entry>
<title>双指针</title>
<link href="https://fengmumu1.github.io/2018/07/13/two-pointers/"/>
<id>https://fengmumu1.github.io/2018/07/13/two-pointers/</id>
<published>2018-07-13T14:49:12.000Z</published>
<updated>2018-07-15T06:28:11.442Z</updated>
<content type="html"><![CDATA[<p>今天做了一个题目:Remove Element<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><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">Given an array nums and a value val, remove all instances of that value in-place and return the new length.</span><br><span class="line">Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.</span><br><span class="line">The order of elements can be changed. It doesn't matter what you leave beyond the new length.</span><br><span class="line">Example 1:</span><br><span class="line"></span><br><span class="line">Given nums = [3,2,2,3], val = 3,</span><br><span class="line">Your function should return length = 2, with the first two elements of nums being 2.</span><br><span class="line">It doesn't matter what you leave beyond the returned length.</span><br></pre></td></tr></table></figure></p><p>大概就是把数组中与val一致的数值去掉,然后,返回与val一致的元素的个数,题目不允许额外再使用一个数组。<br><a id="more"></a><br>我上传一下我写的代码<br><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> removeElement = <span class="function"><span class="keyword">function</span>(<span class="params">nums, val</span>) </span>{</span><br><span class="line"> <span class="keyword">let</span> leave = <span class="number">0</span></span><br><span class="line"> <span class="keyword">let</span> wipe = <span class="number">0</span></span><br><span class="line"> <span class="keyword">let</span> flag = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span>( ; wipe < nums.length; wipe++){</span><br><span class="line"> <span class="keyword">if</span>(nums[wipe] === val){</span><br><span class="line"> <span class="keyword">for</span>(leave = wipe; leave < nums.length; leave++){</span><br><span class="line"> nums[leave] = nums[leave + <span class="number">1</span>]</span><br><span class="line"> }</span><br><span class="line"> wipe--</span><br><span class="line"> flag++</span><br><span class="line"> } </span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> nums.length - flag</span><br><span class="line">};</span><br></pre></td></tr></table></figure></p><p>上传之后我看了一下排在我前面人的代码<br><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> removeElement = <span class="function"><span class="keyword">function</span>(<span class="params">nums, val</span>) </span>{</span><br><span class="line"> <span class="keyword">var</span> first = <span class="number">0</span></span><br><span class="line"> <span class="keyword">var</span> last = nums.length - <span class="number">1</span></span><br><span class="line"> <span class="keyword">while</span> (first < last) {</span><br><span class="line"> <span class="keyword">if</span> (nums[first] == val) {</span><br><span class="line"> nums[first] = nums[last]</span><br><span class="line"> last--</span><br><span class="line"> } <span class="keyword">else</span>{</span><br><span class="line"> first++</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (nums[first] != val) {</span><br><span class="line"> first++</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> first</span><br><span class="line">};</span><br></pre></td></tr></table></figure></p><h3 id="双指针"><a href="#双指针" class="headerlink" title="双指针"></a>双指针</h3><p>他的写法时间复杂度是O(n),而我的是O(n^2),因为他用了双指针法(two-pointers),<br>双指针(这里的指针不同于c语言的指针,这里说的是数组的下标),指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向或者相反方向的指针进行扫描,从而达到相应的目的。由于数组有一定的顺序,使用这种方法往往可以简化运算。</p><h3 id="双指针的使用场景"><a href="#双指针的使用场景" class="headerlink" title="双指针的使用场景"></a>双指针的使用场景</h3><h4 id="求元素和"><a href="#求元素和" class="headerlink" title="求元素和"></a>求元素和</h4><p>eag:给一个有序数组和一个数值,查找数组中是否有任意两个元素的合为指定的数值,有的话返回元素的下标(有多对数值只返回一对)。<br>解决的思路是,给两个游标一个指向数组首(star),一个指向数组尾(end)。判断两个元素合(x)与数值(y)之间的关系,我们假定数组是从小到大排序的,如果 x > y 我们就给 end + 1 ,如果x < y 我们就给 star + 1。</p><h4 id="hoare的双向扫描快速划分法"><a href="#hoare的双向扫描快速划分法" class="headerlink" title="hoare的双向扫描快速划分法()"></a>hoare的双向扫描快速划分法()</h4><p>算法原理:使用left和right将数组划分成三部分,left之前的部分为小于等于划分元素P的值,right之后的部分为大于划分元素P的值,left和right之间的部分是没有进行划分的区域。外循环使得left自左向右遍历,同时right自右向左遍历,在这个过程中当left遇见大于P的值则停止,等待right遇见小于等于P的值又停止之后,交换他们的值,这个循环在left和right相遇或者交叉之后停止。最后交换a[r]和left的值,并返回left;<br><a href="https://blog.csdn.net/morewindows/article/details/6684558" target="_blank" rel="noopener">参考链接</a></p><h4 id="求链表中间元素"><a href="#求链表中间元素" class="headerlink" title="求链表中间元素"></a>求链表中间元素</h4><p>对于单链表求中间元素的问题,经典的作法是采用两个指针,初始化都指向链表表头,移动开始时,快指针移动两步,慢指针移动一步。当快指针的next为null或者快指针为null的时候,慢指针所指的就是单链表的中间元素(注意奇数个元素和偶数个元素的处理)</p><p>当然这个不是全部啦,以后发现的话再慢慢补上。</p>]]></content>
<summary type="html">
<p>今天做了一个题目:Remove Element<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><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">Given an array nums and a value val, remove all instances of that value in-place and return the new length.</span><br><span class="line">Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.</span><br><span class="line">The order of elements can be changed. It doesn&apos;t matter what you leave beyond the new length.</span><br><span class="line">Example 1:</span><br><span class="line"></span><br><span class="line">Given nums = [3,2,2,3], val = 3,</span><br><span class="line">Your function should return length = 2, with the first two elements of nums being 2.</span><br><span class="line">It doesn&apos;t matter what you leave beyond the returned length.</span><br></pre></td></tr></table></figure></p>
<p>大概就是把数组中与val一致的数值去掉,然后,返回与val一致的元素的个数,题目不允许额外再使用一个数组。<br>
</summary>
<category term="leetcode" scheme="https://fengmumu1.github.io/categories/leetcode/"/>
<category term="leetcode" scheme="https://fengmumu1.github.io/tags/leetcode/"/>
<category term="two-pointers" scheme="https://fengmumu1.github.io/tags/two-pointers/"/>
</entry>
<entry>
<title>hexo上传报错:No such device or address</title>
<link href="https://fengmumu1.github.io/2018/07/12/no-address/"/>
<id>https://fengmumu1.github.io/2018/07/12/no-address/</id>
<published>2018-07-12T13:03:34.000Z</published>
<updated>2018-07-12T13:15:31.820Z</updated>
<content type="html"><![CDATA[<p>今天使用hexo上传,报错(bash: /dev/tty: No such device or address)<br>个人推测和网络有关(网太慢了),但是不想等,所以就搜了一下解决方法<br><a id="more"></a><br>就是在站点配置的上传设置,把地址改一下:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><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">deploy:</span><br><span class="line"> type: git </span><br><span class="line"> repo: https://github.com/你GitHub注册用户名/你GitHub注册用户名.github.io.git </span><br><span class="line"> branch: master</span><br><span class="line"></span><br><span class="line"> 改为:</span><br><span class="line"></span><br><span class="line">deploy:</span><br><span class="line"> type: git </span><br><span class="line"> repo: [email protected]:你GitHub注册用户名/你GitHub注册用户名.github.io.git </span><br><span class="line"> branch: master</span><br></pre></td></tr></table></figure></p><p>个人推测,由于网络不好,所以触发github的安全机制,所以提交失败,改设置之后,由原来的https提交变成了使用ssh来提交,就比较好通过了。</p><hr><p><a href="https://www.cnblogs.com/huahua12/p/8491805.html" target="_blank" rel="noopener">解决方法原文</a></p>]]></content>
<summary type="html">
<p>今天使用hexo上传,报错(bash: /dev/tty: No such device or address)<br>个人推测和网络有关(网太慢了),但是不想等,所以就搜了一下解决方法<br>
</summary>
<category term="hexo" scheme="https://fengmumu1.github.io/categories/hexo/"/>
<category term="hexo" scheme="https://fengmumu1.github.io/tags/hexo/"/>
</entry>
<entry>
<title>数字转成字母</title>
<link href="https://fengmumu1.github.io/2018/07/12/Integer-to-English-Words/"/>
<id>https://fengmumu1.github.io/2018/07/12/Integer-to-English-Words/</id>
<published>2018-07-12T12:34:26.000Z</published>
<updated>2018-07-12T12:49:50.805Z</updated>
<content type="html"><![CDATA[<p>发现一个有小坑的题目 Integer to English Words<br>题目要求:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><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">Convert a non-negative integer to its english words representation. Given input is guaranteed to be less than 231 - 1.</span><br><span class="line"></span><br><span class="line">Example 1:</span><br><span class="line">Input: 123</span><br><span class="line">Output: "One Hundred Twenty Three"</span><br><span class="line"></span><br><span class="line">Example 2:</span><br><span class="line">Input: 12345</span><br><span class="line">Output: "Twelve Thousand Three Hundred Forty Five"</span><br><span class="line"></span><br><span class="line">Example 3:</span><br><span class="line">Input: 1234567</span><br><span class="line">Output: "One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven"</span><br><span class="line"></span><br><span class="line">Example 4:</span><br><span class="line">Input: 1234567891</span><br><span class="line">Output: "One Billion Two Hundred Thirty Four Million Five Hundred Sixty Seven Thousand Eight Hundred Ninety One"</span><br></pre></td></tr></table></figure></p><a id="more"></a><p>就是把一串数字按照英语语法格式输出成字符串的形式。英语不同于汉语,是3个一断。<br><blockquote><p>汉语和英语数字表达的方式不同。汉语是个,十,百,千,万,十万,百万,千万,亿,十亿……,也就是以“十”的倍数来表示;而英语则是在数字超过千以后,以“千”(thousand)的倍数来表达的。如“一万”是“十千”,即 ten thousand;“十万”是“百千”,即 hundred thousand,直至“百万”,million。百万以上的数字则用“百万”的倍数表达;如“千万”是“十百万”,即 ten million;“亿”是“百百万”,即 hundred million,直至“十亿”,billion。 所以英文表达数字时可以从右往左,三位一逗号,逗号从右往左分别对应的是:thousand, million, billion, etc。</p><footer><strong>@沪江英语</strong><cite><a href="https://www.hjenglish.com/new/p110563/" target="_blank" rel="noopener">www.hjenglish.com/new/p110563</a></cite></footer></blockquote><br>所以程序并不难想,思路也没有那么难,写完之后,一提交发现坑了,丫的最后面不能有空格,改了半天,最后实现了功能,发现代码很长,最后用了自带的函数trim,来去掉了多余的空格,代码也就将就算是自己能看过眼吧。<br>下面是丑代码<br><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><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"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * @param {number} num</span></span><br><span class="line"><span class="comment"> * @return {string}</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">var</span> numberToWords = <span class="function"><span class="keyword">function</span>(<span class="params">num</span>) </span>{</span><br><span class="line"> <span class="comment">//debugger</span></span><br><span class="line"> <span class="keyword">if</span>(num === <span class="number">0</span>) <span class="keyword">return</span> <span class="string">'Zero'</span></span><br><span class="line"> <span class="keyword">let</span> cous = <span class="string">""</span></span><br><span class="line"> <span class="keyword">let</span> index = <span class="number">0</span></span><br><span class="line"> <span class="keyword">let</span> a = [<span class="string">""</span>,<span class="string">" One"</span>, <span class="string">" Two"</span>, <span class="string">" Three"</span>, <span class="string">" Four"</span>, <span class="string">" Five"</span>, <span class="string">" Six"</span>, <span class="string">" Seven"</span>, <span class="string">" Eight"</span>,<span class="string">" Nine"</span>, <span class="string">" Ten"</span>, <span class="string">" Eleven"</span>, <span class="string">" Twelve"</span>, <span class="string">" Thirteen"</span>, <span class="string">" Fourteen"</span>, <span class="string">" Fifteen"</span>, <span class="string">" Sixteen"</span>, <span class="string">" Seventeen"</span>, <span class="string">" Eighteen"</span>, <span class="string">" Nineteen"</span>]</span><br><span class="line"> <span class="keyword">let</span> b = [<span class="string">""</span>,<span class="string">""</span>,<span class="string">" Twenty"</span>, <span class="string">" Thirty"</span>, <span class="string">" Forty"</span>, <span class="string">" Fifty"</span>, <span class="string">" Sixty"</span>, <span class="string">" Seventy"</span>, <span class="string">" Eighty"</span>, <span class="string">" Ninety"</span>]</span><br><span class="line"> <span class="keyword">let</span> c = [<span class="string">""</span>,<span class="string">" Thousand"</span>, <span class="string">" Million"</span>, <span class="string">" Billion"</span>]</span><br><span class="line"> <span class="keyword">let</span> thereword = <span class="function"><span class="keyword">function</span> (<span class="params">numb</span>) </span>{</span><br><span class="line"> <span class="keyword">if</span> (numb === <span class="number">0</span>) <span class="keyword">return</span> <span class="string">""</span> </span><br><span class="line"> <span class="keyword">let</span> num_temp = <span class="string">""</span></span><br><span class="line"> <span class="comment">// debugger</span></span><br><span class="line"> <span class="keyword">if</span>(numb > <span class="number">99</span>){</span><br><span class="line"> <span class="keyword">if</span>(numb % <span class="number">100</span> > <span class="number">19</span>) { </span><br><span class="line"> num_temp = a[<span class="built_in">parseInt</span>(numb / <span class="number">100</span>)] + <span class="string">" Hundred"</span> + b[<span class="built_in">parseInt</span>((numb % <span class="number">100</span>) / <span class="number">10</span>)] + a[<span class="built_in">parseInt</span>((numb % <span class="number">100</span>) % <span class="number">10</span>)]</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> num_temp = a[<span class="built_in">parseInt</span>(numb / <span class="number">100</span>)] + <span class="string">" Hundred"</span> + a[numb % <span class="number">100</span>] </span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">if</span>(numb > <span class="number">19</span>) {</span><br><span class="line"> num_temp = b[<span class="built_in">parseInt</span>(numb / <span class="number">10</span>)] + a[numb % <span class="number">10</span>]</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> num_temp = a[numb]</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> num_temp</span><br><span class="line"> } </span><br><span class="line"> <span class="keyword">while</span>(num > <span class="number">0</span>) {</span><br><span class="line"> <span class="keyword">let</span> nums = thereword(num % <span class="number">1000</span>)</span><br><span class="line"> <span class="keyword">if</span>(nums !== <span class="string">""</span>) {</span><br><span class="line"> cous = nums + c[index] + cous</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> cous = nums + cous</span><br><span class="line"> } </span><br><span class="line"> num = (num - num % <span class="number">1000</span>) / <span class="number">1000</span> </span><br><span class="line"> index++</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> cous.trim()</span><br><span class="line">};</span><br></pre></td></tr></table></figure></p><hr><p><strong>以后需要注意更多的细节要求</strong></p>]]></content>
<summary type="html">
<p>发现一个有小坑的题目 Integer to English Words<br>题目要求:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><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">Convert a non-negative integer to its english words representation. Given input is guaranteed to be less than 231 - 1.</span><br><span class="line"></span><br><span class="line">Example 1:</span><br><span class="line">Input: 123</span><br><span class="line">Output: &quot;One Hundred Twenty Three&quot;</span><br><span class="line"></span><br><span class="line">Example 2:</span><br><span class="line">Input: 12345</span><br><span class="line">Output: &quot;Twelve Thousand Three Hundred Forty Five&quot;</span><br><span class="line"></span><br><span class="line">Example 3:</span><br><span class="line">Input: 1234567</span><br><span class="line">Output: &quot;One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven&quot;</span><br><span class="line"></span><br><span class="line">Example 4:</span><br><span class="line">Input: 1234567891</span><br><span class="line">Output: &quot;One Billion Two Hundred Thirty Four Million Five Hundred Sixty Seven Thousand Eight Hundred Ninety One&quot;</span><br></pre></td></tr></table></figure></p>
</summary>
<category term="leetcode" scheme="https://fengmumu1.github.io/categories/leetcode/"/>
<category term="leetcode" scheme="https://fengmumu1.github.io/tags/leetcode/"/>
</entry>
<entry>
<title>Eloquent_JavaScrip中的weresquirrel</title>
<link href="https://fengmumu1.github.io/2018/07/12/Eloquent-JavaScript-of-weresquirrel/"/>
<id>https://fengmumu1.github.io/2018/07/12/Eloquent-JavaScript-of-weresquirrel/</id>
<published>2018-07-12T02:46:30.000Z</published>
<updated>2018-07-12T02:53:08.043Z</updated>
<content type="html"><![CDATA[<p>看到了Eloquent_JavaScrip第四章(对象和数组)),这一章讲了一个松鼠人(weresquirrel)的故事,并用函数来找出其变身的原因,感觉很有趣,便动手实现了一下。<a href="https://github.com/marijnh/Eloquent-JavaScript/blob/master/code/journal.js" target="_blank" rel="noopener">数据连接</a><br><a id="more"></a><br><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> JOURNAL = [</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"carrot"</span>,<span class="string">"exercise"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"bread"</span>,<span class="string">"pudding"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"weekend"</span>,<span class="string">"touched tree"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"carrot"</span>,<span class="string">"nachos"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"cycling"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"brussel sprouts"</span>,<span class="string">"ice cream"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"computer"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"potatoes"</span>,<span class="string">"candy"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"exercise"</span>,<span class="string">"weekend"</span>,<span class="string">"dentist"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"brussel sprouts"</span>,<span class="string">"pudding"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"running"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"pizza"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"computer"</span>,<span class="string">"work"</span>,<span class="string">"touched tree"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"bread"</span>,<span class="string">"beer"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"cycling"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"cauliflower"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"pizza"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"cycling"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"lasagna"</span>,<span class="string">"nachos"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"brushed teeth"</span>,<span class="string">"weekend"</span>,<span class="string">"touched tree"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"lettuce"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"television"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"spaghetti"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"brushed teeth"</span>,<span class="string">"computer"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"lettuce"</span>,<span class="string">"nachos"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"carrot"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"running"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"brushed teeth"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"cauliflower"</span>,<span class="string">"reading"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"bread"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"lasagna"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"exercise"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"spaghetti"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"reading"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"carrot"</span>,<span class="string">"ice cream"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"television"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"spaghetti"</span>,<span class="string">"nachos"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"cauliflower"</span>,<span class="string">"ice cream"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"cycling"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"spaghetti"</span>,<span class="string">"peanuts"</span>,<span class="string">"computer"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">true</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"potatoes"</span>,<span class="string">"ice cream"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"computer"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"potatoes"</span>,<span class="string">"ice cream"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"peanuts"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"running"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"potatoes"</span>,<span class="string">"exercise"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"pizza"</span>,<span class="string">"ice cream"</span>,<span class="string">"computer"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"lasagna"</span>,<span class="string">"ice cream"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"cauliflower"</span>,<span class="string">"candy"</span>,<span class="string">"reading"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"lasagna"</span>,<span class="string">"nachos"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"running"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"potatoes"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"carrot"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"pizza"</span>,<span class="string">"beer"</span>,<span class="string">"work"</span>,<span class="string">"dentist"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"lasagna"</span>,<span class="string">"pudding"</span>,<span class="string">"cycling"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"spaghetti"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"reading"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"spaghetti"</span>,<span class="string">"pudding"</span>,<span class="string">"television"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"bread"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"exercise"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"lasagna"</span>,<span class="string">"peanuts"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">true</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"pizza"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"potatoes"</span>,<span class="string">"exercise"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"brushed teeth"</span>,<span class="string">"exercise"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"spaghetti"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"television"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"pizza"</span>,<span class="string">"cycling"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"carrot"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"carrot"</span>,<span class="string">"beer"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"pizza"</span>,<span class="string">"peanuts"</span>,<span class="string">"candy"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">true</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"carrot"</span>,<span class="string">"peanuts"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"reading"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"potatoes"</span>,<span class="string">"peanuts"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"carrot"</span>,<span class="string">"nachos"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"exercise"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"pizza"</span>,<span class="string">"peanuts"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"television"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"lasagna"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"cycling"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"cauliflower"</span>,<span class="string">"peanuts"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"computer"</span>,<span class="string">"work"</span>,<span class="string">"touched tree"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"lettuce"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"television"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"potatoes"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"computer"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"bread"</span>,<span class="string">"candy"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"potatoes"</span>,<span class="string">"nachos"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"carrot"</span>,<span class="string">"pudding"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"carrot"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"exercise"</span>,<span class="string">"weekend"</span>,<span class="string">"touched tree"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"brussel sprouts"</span>,<span class="string">"running"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"brushed teeth"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"lettuce"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"running"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"candy"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"brussel sprouts"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"computer"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"bread"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"cauliflower"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"spaghetti"</span>,<span class="string">"candy"</span>,<span class="string">"television"</span>,<span class="string">"work"</span>,<span class="string">"touched tree"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"carrot"</span>,<span class="string">"pudding"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"lettuce"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"carrot"</span>,<span class="string">"ice cream"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"cycling"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"pizza"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"spaghetti"</span>,<span class="string">"peanuts"</span>,<span class="string">"exercise"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">true</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"bread"</span>,<span class="string">"beer"</span>,<span class="string">"computer"</span>,<span class="string">"weekend"</span>,<span class="string">"touched tree"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"brushed teeth"</span>,<span class="string">"running"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"lettuce"</span>,<span class="string">"peanuts"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"work"</span>,<span class="string">"touched tree"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"lasagna"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"television"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"cauliflower"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"running"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"carrot"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"running"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"carrot"</span>,<span class="string">"reading"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"carrot"</span>,<span class="string">"peanuts"</span>,<span class="string">"reading"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">true</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"potatoes"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"running"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"lasagna"</span>,<span class="string">"ice cream"</span>,<span class="string">"work"</span>,<span class="string">"touched tree"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"cauliflower"</span>,<span class="string">"peanuts"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"cycling"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"pizza"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"running"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"lettuce"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"work"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"bread"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"television"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>},</span><br><span class="line"> {<span class="string">"events"</span>:[<span class="string">"cauliflower"</span>,<span class="string">"peanuts"</span>,<span class="string">"brushed teeth"</span>,<span class="string">"weekend"</span>],<span class="string">"squirrel"</span>:<span class="literal">false</span>}</span><br><span class="line">];</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 判断是否有事件</span></span><br><span class="line"><span class="comment"> * @param {String}event 事件名称</span></span><br><span class="line"><span class="comment"> * @param {Object}entry 事件记录</span></span><br><span class="line"><span class="comment"> * @return {Boolean} true是有 false是没有 </span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">var</span> isEvent = <span class="function"><span class="keyword">function</span>(<span class="params">event, entry</span>) </span>{</span><br><span class="line"> <span class="comment">//indexOf查找不到就返回-1,注意,在Bolean中false为0,所有非0 的都是true</span></span><br><span class="line"> <span class="keyword">return</span> entry.indexOf(event) !== <span class="number">-1</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 计算两件事件的相关性</span></span><br><span class="line"><span class="comment"> * @param {Number[]} record_tab ab 发生与否记作0和1,然后统计所有的情况记成数组</span></span><br><span class="line"><span class="comment"> * @return {string}} 二者的相关性[-1,1],使用了内置函数保留10为有效数字所以转化成了字符串</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">var</span> phi = <span class="function"><span class="keyword">function</span>(<span class="params">record_tab</span>) </span>{</span><br><span class="line"> <span class="keyword">let</span> temp = <span class="built_in">Math</span>.sqrt(</span><br><span class="line"> (record_tab[<span class="number">2</span>] + record_tab[<span class="number">3</span>]) * </span><br><span class="line"> (record_tab[<span class="number">1</span>] + record_tab[<span class="number">3</span>]) * </span><br><span class="line"> (record_tab[<span class="number">0</span>] + record_tab[<span class="number">1</span>]) * </span><br><span class="line"> (record_tab[<span class="number">0</span>] + record_tab[<span class="number">2</span>]) )</span><br><span class="line"> <span class="keyword">return</span> ((record_tab[<span class="number">3</span>] * record_tab[<span class="number">0</span>] - record_tab[<span class="number">2</span>] * record_tab[<span class="number">1</span>]) / temp).toFixed(<span class="number">10</span>) </span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 统计事件与是否变身的相关性</span></span><br><span class="line"><span class="comment"> * @param {String} event 事件名称 </span></span><br><span class="line"><span class="comment"> * @param {Object} tab 事件记录</span></span><br><span class="line"><span class="comment"> * @return {Number} 事件与变身的相关性[-1,1]</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">var</span> sth_pertinence = <span class="function"><span class="keyword">function</span>(<span class="params">event, tab</span>) </span>{</span><br><span class="line"> <span class="keyword">let</span> phi_tab = [<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>]</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">var</span> i = <span class="number">0</span>; i < tab.length; i++) {</span><br><span class="line"> <span class="keyword">let</span> index = <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span>(isEvent(event,tab[i].events)) {index++}</span><br><span class="line"> <span class="keyword">if</span>(tab[i].squirrel) {index += <span class="number">2</span>}</span><br><span class="line"> phi_tab[index]++</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> phi(phi_tab)</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 相关性映射表</span></span><br><span class="line"><span class="comment"> * @param {Object} tabs 记录表</span></span><br><span class="line"><span class="comment"> * @return {object} 相关性映射表</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">var</span> map_pertinence = <span class="function"><span class="keyword">function</span>(<span class="params">tabs</span>) </span>{</span><br><span class="line"> <span class="keyword">let</span> map = {}</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> i = <span class="number">0</span>; i < tabs.length; i++) {</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> j = <span class="number">0</span>; j < tabs[i].events.length; j++){</span><br><span class="line"> <span class="keyword">if</span>( ! (tabs[i].events[j] <span class="keyword">in</span> map)) {</span><br><span class="line"> map[tabs[i].events[j]] = <span class="built_in">Number</span>(sth_pertinence(tabs[i].events[j] ,JOURNAL)) </span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> map</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 找出相关项</span></span><br><span class="line"><span class="comment"> * @param {object} map 相关性映射表</span></span><br><span class="line"><span class="comment"> * @return {string} 分析结果</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">var</span> reous_pertinence = <span class="function"><span class="keyword">function</span>(<span class="params">map</span>) </span>{</span><br><span class="line"> <span class="keyword">let</span> tab_phi = {}</span><br><span class="line"> <span class="keyword">let</span> reous = {</span><br><span class="line"> max_tab : <span class="string">""</span>,</span><br><span class="line"> max_phi : -<span class="literal">Infinity</span> ,</span><br><span class="line"> min_tab : <span class="string">""</span>,</span><br><span class="line"> min_phi : <span class="literal">Infinity</span>,</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">let</span> end_resou = <span class="string">""</span></span><br><span class="line"> tab_phi = map_pertinence(JOURNAL)</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> event <span class="keyword">in</span> tab_phi) { </span><br><span class="line"> <span class="keyword">if</span>(tab_phi[event] < reous.min_phi ) {</span><br><span class="line"> reous.min_tab = event </span><br><span class="line"> reous.min_phi = tab_phi[event]</span><br><span class="line"> } </span><br><span class="line"> <span class="keyword">if</span>(tab_phi[event] > reous.max_phi) {</span><br><span class="line"> reous.max_tab = event </span><br><span class="line"> reous.max_phi = tab_phi[event] </span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> end_resou = reous.max_tab + <span class="string">" no"</span> + reous.min_tab</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">let</span> i = <span class="number">0</span>; i < JOURNAL.length ; i++){</span><br><span class="line"> <span class="keyword">if</span>(isEvent(reous.max_tab,JOURNAL[i].events) && !isEvent(reous.min_tab,JOURNAL[i].events) ){</span><br><span class="line"> JOURNAL[i].events.push(end_resou)</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> end_resou +<span class="string">" pshi: "</span>+ sth_pertinence(end_resou,JOURNAL)</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="built_in">console</span>.log(reous_pertinence())</span><br></pre></td></tr></table></figure></p>]]></content>
<summary type="html">
<p>看到了Eloquent_JavaScrip第四章(对象和数组)),这一章讲了一个松鼠人(weresquirrel)的故事,并用函数来找出其变身的原因,感觉很有趣,便动手实现了一下。<a href="https://github.com/marijnh/Eloquent-JavaScript/blob/master/code/journal.js" target="_blank" rel="noopener">数据连接</a><br>
</summary>
<category term="JavaScript" scheme="https://fengmumu1.github.io/categories/JavaScript/"/>
<category term="JavaScript" scheme="https://fengmumu1.github.io/tags/JavaScript/"/>
<category term="杂谈" scheme="https://fengmumu1.github.io/tags/%E6%9D%82%E8%B0%88/"/>
</entry>
<entry>
<title>丑数2之自己挖坑埋自己</title>
<link href="https://fengmumu1.github.io/2018/07/09/Ugly-Number-II/"/>
<id>https://fengmumu1.github.io/2018/07/09/Ugly-Number-II/</id>
<published>2018-07-09T14:39:21.000Z</published>
<updated>2018-07-09T15:06:12.679Z</updated>
<content type="html"><![CDATA[<p>今天做了丑数2,遇到个坑,卡主自己好久,所以make先,以后有空再仔细研究<br><a id="more"></a><br>先上题目:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><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">Write a program to find the n-th ugly number.</span><br><span class="line"></span><br><span class="line">Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. </span><br><span class="line"></span><br><span class="line">Example:</span><br><span class="line"></span><br><span class="line">Input: n = 10</span><br><span class="line">Output: 12</span><br><span class="line">Explanation: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 is the sequence of the first 10 ugly numbers.</span><br><span class="line"></span><br><span class="line">Note: </span><br><span class="line"> 1 is typically treated as an ugly number.</span><br><span class="line"> n does not exceed 1690.</span><br></pre></td></tr></table></figure></p><p>先给出我最终通过的代码:<br><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> nthUglyNumber = <span class="function"><span class="keyword">function</span>(<span class="params">n</span>) </span>{</span><br><span class="line"> <span class="comment">//debugger</span></span><br><span class="line"> <span class="keyword">var</span> arry = []</span><br><span class="line"></span><br><span class="line"> <span class="keyword">var</span> arry_two = [<span class="number">2</span>]</span><br><span class="line"> <span class="keyword">var</span> i = <span class="number">0</span></span><br><span class="line"> <span class="keyword">var</span> arry_three = [<span class="number">3</span>]</span><br><span class="line"> <span class="keyword">var</span> j = <span class="number">0</span></span><br><span class="line"> <span class="keyword">var</span> arry_five = [<span class="number">5</span>]</span><br><span class="line"> <span class="keyword">var</span> k = <span class="number">0</span> </span><br><span class="line"></span><br><span class="line"> <span class="keyword">var</span> a = arry_two[i]</span><br><span class="line"> <span class="keyword">var</span> b = arry_three[i]</span><br><span class="line"> <span class="keyword">var</span> c = arry_five[i]</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (n < <span class="number">5</span>) {</span><br><span class="line"> <span class="keyword">return</span> n</span><br><span class="line"> } </span><br><span class="line"> <span class="keyword">while</span> (<span class="number">1</span>) {</span><br><span class="line"> <span class="keyword">if</span> ( a < b && a < c) {</span><br><span class="line"> arry_two.push(a * <span class="number">2</span>)</span><br><span class="line"> arry_three.push(a * <span class="number">3</span>)</span><br><span class="line"> arry_five.push(a * <span class="number">5</span>)</span><br><span class="line"> arry.push(a)</span><br><span class="line"></span><br><span class="line"> a = arry_two[i += <span class="number">1</span>]</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span>(b < a && b < c ) {</span><br><span class="line"> arry_three.push(b * <span class="number">3</span>)</span><br><span class="line"> arry_five.push(b * <span class="number">5</span>)</span><br><span class="line"> arry.push(b)</span><br><span class="line"></span><br><span class="line"> b = arry_three[j += <span class="number">1</span>]</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (c < a && c < b) {</span><br><span class="line"> arry_five.push(c * <span class="number">5</span>) </span><br><span class="line"> arry.push(c)</span><br><span class="line"></span><br><span class="line"> c = arry_five[k += <span class="number">1</span>]</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(arry.length + <span class="number">1</span> === n) <span class="keyword">break</span> </span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//console.log(arry)</span></span><br><span class="line"> <span class="keyword">return</span> arry[n - <span class="number">2</span>] <span class="comment">//减去 0和 1</span></span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="comment">//console.log(nthUglyNumber(5))</span></span><br></pre></td></tr></table></figure></p><p>现在来分析一下解决这个题目的思路:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><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">丑数就是只由2 3 5 乘出来的数字,我们定义三个数组,我们每次三个数组最小的数字,在第一组就分别乘以 2 3 5 放入 三个数组 </span><br><span class="line">arry_two 2 </span><br><span class="line">arry_three 3 </span><br><span class="line">arry_five 5</span><br><span class="line"></span><br><span class="line">arry_two 2 4</span><br><span class="line">arry_three 3 6</span><br><span class="line">arry_five 5 10</span><br><span class="line">然后我们把最小的取出来</span><br><span class="line">arry_two x 4</span><br><span class="line">arry_three 3 6</span><br><span class="line">arry_five 5 10</span><br><span class="line">此时最小的是3,他位于第二个数组,我们给他 乘以3和5分别放入第二个和第三个数组</span><br><span class="line">arry_two x 4 </span><br><span class="line">arry_three 3 6 9</span><br><span class="line">arry_five 5 10 15</span><br><span class="line">我们去出3,此时最小的是4,4 位于第一个数组,我们乘以2 3 5 后分别放入三个数组</span><br><span class="line">arry_two x 4 8 </span><br><span class="line">arry_three x 6 9 12</span><br><span class="line">arry_five 5 10 15 20</span><br><span class="line">我们拿去4 后最小的是5,然后我们 给5 乘以5放入第三个数组</span><br><span class="line">arry_two x x 8 </span><br><span class="line">arry_three x 6 9 12</span><br><span class="line">arry_five 5 10 15 20 25</span><br><span class="line"></span><br><span class="line">然后我们把每次拿出来的数字,放到一个数组,就是从2开始的丑数啦</span><br></pre></td></tr></table></figure></p><p>在再放出我一开始的问题程序:<br><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> nthUglyNumber = <span class="function"><span class="keyword">function</span>(<span class="params">n</span>) </span>{</span><br><span class="line"> <span class="comment">//debugger</span></span><br><span class="line"> <span class="keyword">var</span> ff = n</span><br><span class="line"> n = n + <span class="number">150</span></span><br><span class="line"> <span class="keyword">var</span> count = <span class="number">4</span> <span class="comment">//1也是丑数</span></span><br><span class="line"> <span class="keyword">var</span> arry = []</span><br><span class="line"> <span class="keyword">var</span> arry_temp = []</span><br><span class="line"> <span class="keyword">var</span> arry_two = [<span class="number">2</span>]</span><br><span class="line"> <span class="keyword">var</span> i = <span class="number">0</span></span><br><span class="line"> <span class="keyword">var</span> arry_three = [<span class="number">3</span>]</span><br><span class="line"> <span class="keyword">var</span> j = <span class="number">0</span></span><br><span class="line"> <span class="keyword">var</span> arry_five = [<span class="number">5</span>]</span><br><span class="line"> <span class="keyword">var</span> k = <span class="number">0</span> </span><br><span class="line"></span><br><span class="line"> <span class="keyword">var</span> a = arry_two[i]</span><br><span class="line"> <span class="keyword">var</span> b = arry_three[i]</span><br><span class="line"> <span class="keyword">var</span> c = arry_five[i]</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (ff < <span class="number">5</span>) {</span><br><span class="line"> <span class="keyword">return</span> ff</span><br><span class="line"> } </span><br><span class="line"> <span class="keyword">while</span> (<span class="number">1</span>) {</span><br><span class="line"> <span class="keyword">if</span> ( a < b && a < c) {</span><br><span class="line"> arry_two.push(a * <span class="number">2</span>)</span><br><span class="line"> count++</span><br><span class="line"> <span class="keyword">if</span>(count === n) <span class="keyword">break</span> </span><br><span class="line"></span><br><span class="line"> arry_three.push(a * <span class="number">3</span>)</span><br><span class="line"> count++</span><br><span class="line"> <span class="keyword">if</span>(count === n) <span class="keyword">break</span> </span><br><span class="line"> </span><br><span class="line"> arry_five.push(a * <span class="number">5</span>)</span><br><span class="line"> count++</span><br><span class="line"> <span class="keyword">if</span>(count === n) <span class="keyword">break</span> </span><br><span class="line"></span><br><span class="line"> a = arry_two[i += <span class="number">1</span>]</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span>(b < a && b < c ) {</span><br><span class="line"> arry_three.push(b * <span class="number">3</span>)</span><br><span class="line"> count++</span><br><span class="line"> <span class="keyword">if</span>(count === n) <span class="keyword">break</span> </span><br><span class="line"></span><br><span class="line"> arry_five.push(b * <span class="number">5</span>)</span><br><span class="line"> count++</span><br><span class="line"> <span class="keyword">if</span>(count === n) <span class="keyword">break</span> </span><br><span class="line"></span><br><span class="line"> b = arry_three[j += <span class="number">1</span>]</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (c < a && c < b) {</span><br><span class="line"> arry_five.push(c * <span class="number">5</span>) </span><br><span class="line"> count++</span><br><span class="line"> <span class="keyword">if</span>(count === n) <span class="keyword">break</span> </span><br><span class="line"></span><br><span class="line"> c = arry_five[k += <span class="number">1</span>]</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> }</span><br><span class="line"> arry_temp = arry_two.concat(arry_three)</span><br><span class="line"> arry = arry_temp.concat(arry_five)</span><br><span class="line"> <span class="function"><span class="keyword">function</span> <span class="title">sortNumber</span>(<span class="params">a,b</span>)</span>{</span><br><span class="line"> <span class="keyword">return</span> a - b</span><br><span class="line"> }</span><br><span class="line"> arry.sort(sortNumber)</span><br><span class="line"> <span class="comment">//console.log(arry)</span></span><br><span class="line"> <span class="keyword">return</span> arry[n - <span class="number">152</span>] <span class="comment">//多算了x个 减去 0和 1</span></span><br><span class="line">};</span><br></pre></td></tr></table></figure></p><p>这个程序的思路没有放在取出来的丑数上,而是放在了求出来的丑数上,我计算出目前算了多少个丑数,比如要10个我就计算10个,结果发现求出来的并没有按顺序(中间有空缺),比如算10个丑数,其实只计算到了15,计算第11个丑数的时候才把12计算出来,当时头脑一发热,好不是少计算了,那我多计算好了,所以我们多计算150个,结果在1 和 1690 的时候都对,在(1406,1430)之间不对,其余数字都对,真让人心累,为什么出现这样情况,现在头脑不清楚,有空好好进去瞅瞅,应该还是少计算的原因,不过比他大的数字都是好的,这个就很奇怪了,不过就算这个可以通过测试,比如我多计算500个或者600个。这个思路都是有问题的,不是好思路。</p>]]></content>
<summary type="html">
<p>今天做了丑数2,遇到个坑,卡主自己好久,所以make先,以后有空再仔细研究<br>
</summary>
<category term="leetcode" scheme="https://fengmumu1.github.io/categories/leetcode/"/>
<category term="算法" scheme="https://fengmumu1.github.io/tags/%E7%AE%97%E6%B3%95/"/>
<category term="leetcode" scheme="https://fengmumu1.github.io/tags/leetcode/"/>
</entry>
<entry>
<title>line_text</title>
<link href="https://fengmumu1.github.io/2018/07/08/line-text/"/>
<id>https://fengmumu1.github.io/2018/07/08/line-text/</id>
<published>2018-07-08T14:20:58.000Z</published>
<updated>2018-07-08T14:20:58.283Z</updated>
<summary type="html">
</summary>
</entry>
<entry>
<title>牛顿-拉弗森方法(Newton-Raphson_method)求平方根</title>
<link href="https://fengmumu1.github.io/2018/07/08/Newton-Raphson-method/"/>
<id>https://fengmumu1.github.io/2018/07/08/Newton-Raphson-method/</id>
<published>2018-07-08T04:37:24.000Z</published>
<updated>2018-07-08T08:35:49.185Z</updated>
<content type="html"><![CDATA[<blockquote><p>牛顿法(英语:Newton’s method)又称为牛顿-拉弗森方法(英语:Newton-Raphson method),它是一种在实数域和复数域上近似求解方程的方法。方法使用函数 {\displaystyle f(x)} f(x)的泰勒级数的前面几项来寻找方程 {\displaystyle f(y)=0} {\displaystyle f(y)=0}的根。</p><footer><strong>维基解密 @https://zh.wikipedia.org/wiki/%E7%89%9B%E9%A1%BF%E6%B3%95</strong></footer></blockquote><a id="more"></a><p>再leetcode上看到这么一道题,题目很简单:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Sqrt(x)</span><br><span class="line">Implement int sqrt(int x).</span><br><span class="line">Compute and return the square root of x, where x is guaranteed to be a non-negative integer.</span><br><span class="line">Since the return type is an integer, the decimal digits are truncated and only the integer part of the result is returned.</span><br></pre></td></tr></table></figure></p><p>就是求一个数字的平方根,嗯题目没有截取完整们对于开方开出来是小数的,直接抛弃小数位(不是四舍五入)。<br>解题思路可以有很多,比较快的就是牛顿法了,一开始没有一下子想通牛顿法咋做,后来想通啦,所以就记录一下。<br>首先我们列一个关于被开方数z(在程序中是入口参数x)以及开放根x1的方程,x1 * x1 - z = y,我们把它记成F(x),当 y === 0 的时候说明x1为z的开放根。我们把他的图像画出来,图像如下(图是我从维基百科上偷得,自己的灵魂画图太丑了)</p><img src="/2018/07/08/Newton-Raphson-method/NR2.jpg" width="400" height="200"><p>我们在x轴上找一点x0,过xo在F(x)的位置上做一条切线L1,我们可以看到L1与x轴的交点x1是逐渐逼近与F(x)与x轴的交点的,而这个交点也就是我们要求的开放根,然后我们继续做过x1在F(x)上的切线我们得到x2,不断的迭代下去,我们就可以得到一个符合我们要求的精确范围内的开放根。<br>现在我们需要用函数来写出来,我们想到了递归,但是想一下递归的空间复杂度,所以我们用循环来做,我们只需要不断的求x直到x满足要求的精度我们就跳出循环。<br>让我们来想一下我们如何通过现在的x来的出下一个x1呢?<br>我们看图像L1是F(x)在x0处的切线,那么这条切线的斜率就是F(x)的导函数在x0的结果。 现在我们这样子看一下<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><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">原函数F(x): x1 *x1 - z </span><br><span class="line">原函数的导函数f'(x): 2 * x1</span><br><span class="line">过x0的切线的方程我们设为:y = k*x + b </span><br><span class="line"></span><br><span class="line">现在带入x0在此处的斜率和y</span><br><span class="line"> k = 2 * x0</span><br><span class="line"> y = x0 * x0 - z</span><br><span class="line">我们得b = x0 * x0 - z - 2 * x0 * x0</span><br><span class="line">所以得到x0的方程是 :</span><br><span class="line"> y = 2 * x0 * x + x0 * x0 - z - 2 * x0 * x0</span><br><span class="line"> = 2 * x0 * x - z - x0 * x0</span><br><span class="line">我们可以看到,L1与x轴相交的点就是我们要求的x1,此时y = 0,所以x1 = (x0 * x0 + z)/ (2 * x0 * 10)</span><br></pre></td></tr></table></figure></p><p>然后的出的x1不满足精确度,我们就把x1带入上面的式子,得出x2,然后不断迭代。代码如下<br><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> mySqrt = <span class="function"><span class="keyword">function</span>(<span class="params">x</span>) </span>{</span><br><span class="line"></span><br><span class="line"> <span class="keyword">var</span> cout = <span class="number">2</span></span><br><span class="line"> <span class="keyword">while</span> (<span class="built_in">Math</span>.abs(cout ** <span class="number">2</span> - x) > <span class="number">0.0000001</span>) {</span><br><span class="line"> cout = (cout ** <span class="number">2</span> + x) / (<span class="number">2</span> * cout)</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">parseInt</span>(cout)</span><br><span class="line">};</span><br></pre></td></tr></table></figure></p>]]></content>
<summary type="html">
<blockquote><p>牛顿法(英语:Newton’s method)又称为牛顿-拉弗森方法(英语:Newton-Raphson method),它是一种在实数域和复数域上近似求解方程的方法。方法使用函数 {\displaystyle f(x)} f(x)的泰勒级数的前面几项来寻找方程 {\displaystyle f(y)=0} {\displaystyle f(y)=0}的根。</p>
<footer><strong>维基解密 @https://zh.wikipedia.org/wiki/%E7%89%9B%E9%A1%BF%E6%B3%95</strong></footer></blockquote>
</summary>
<category term="leetcode" scheme="https://fengmumu1.github.io/categories/leetcode/"/>
<category term="算法" scheme="https://fengmumu1.github.io/tags/%E7%AE%97%E6%B3%95/"/>
<category term="leetcode" scheme="https://fengmumu1.github.io/tags/leetcode/"/>
</entry>
<entry>
<title>leetcode之Counting_Bits</title>
<link href="https://fengmumu1.github.io/2018/07/07/Counting-Bits/"/>
<id>https://fengmumu1.github.io/2018/07/07/Counting-Bits/</id>
<published>2018-07-07T14:51:52.000Z</published>
<updated>2018-07-07T15:04:43.102Z</updated>
<content type="html"><![CDATA[<p>Counting_Bits<br>Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1’s in their binary representation and return them as an array.</p><p>Example:<br>For num = 5 you should return [0,1,1,2,1,2].</p><p>Follow up:<br> It is very easy to come up with a solution with run time O(n*sizeof(integer)). But can you do it in linear time O(n) /possibly in a single pass?<br> Space complexity should be O(n).<br> Can you do it like a boss? Do it without using any builtin function like __builtin_popcount in c++ or in any other language.<br>Credits:<br>Special thanks to @ syedee for adding this problem and creating all test cases.<br><a id="more"></a><br>题目如上,就是给你一个数字,让给输出从0到这个数字之间所有数字转化为二进制后1的个数。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><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">// 0 0000 0 </span><br><span class="line">// 1 0001 1 </span><br><span class="line">// 2 0010 1</span><br><span class="line">// 3 0011 2</span><br><span class="line">// 4 0100 1</span><br><span class="line">// 5 0101 2</span><br><span class="line">// 6 0110 2</span><br><span class="line">// 7 0111 3</span><br><span class="line">// ------------- </span><br><span class="line">// 8 1000 1 </span><br><span class="line">// 9 1001 2 </span><br><span class="line">// 10 1010 2 </span><br><span class="line">// 11 1011 3 </span><br><span class="line">// 12 1100 2 </span><br><span class="line">// 13 1101 3</span><br><span class="line">// 14 1110 3</span><br><span class="line">// 15 1111 4</span><br><span class="line">// 16 10000 1</span><br><span class="line">// 17 10001 2</span><br><span class="line"></span><br><span class="line">// 31 1 1111 5</span><br><span class="line">// 63 11 1111 6</span><br></pre></td></tr></table></figure></p><p>解法一:<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> countBits = <span class="function"><span class="keyword">function</span>(<span class="params">num</span>) </span>{</span><br><span class="line"> <span class="keyword">debugger</span></span><br><span class="line"> <span class="keyword">var</span> res = [<span class="number">0</span>]</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">1</span>; i <= num; ++i) {</span><br><span class="line"> <span class="keyword">if</span> (i % <span class="number">2</span> == <span class="number">0</span>) res.push(res[<span class="built_in">parseInt</span>(i / <span class="number">2</span>)])</span><br><span class="line"> <span class="keyword">else</span> res.push(res[<span class="built_in">parseInt</span>((i / <span class="number">2</span>))] + <span class="number">1</span>)</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> res</span><br></pre></td></tr></table></figure><br>解题思路:<br>从1开始,遇到偶数时,其1的个数和该偶数除以2得到的数字的1的个数相同,<br> 遇到奇数时,其1的个数等于该奇数除以2得到的数字的1的个数然后再加上1<br>第二种思路:<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> countBits = <span class="function"><span class="keyword">function</span>(<span class="params">num</span>) </span>{</span><br><span class="line"> <span class="keyword">debugger</span></span><br><span class="line"> <span class="keyword">var</span> res = [<span class="number">0</span>]</span><br><span class="line"> <span class="keyword">for</span> (int i = <span class="number">1</span>; i <= num; ++i) {</span><br><span class="line"> res[i] = res[i & (i - <span class="number">1</span>)] + <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> res</span><br></pre></td></tr></table></figure><br>解题思路:每个i值都是i&(i-1)对应的值加1 (简单暴力,神奇的n与n-1)</p><hr><p>第二种参考自<a href="https://www.cnblogs.com/grandyang/p/5294255.html" target="_blank" rel="noopener">Grandyangde的博客:</a></p><hr>]]></content>
<summary type="html">
<p>Counting_Bits<br>Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1’s in their binary representation and return them as an array.</p>
<p>Example:<br>For num = 5 you should return [0,1,1,2,1,2].</p>
<p>Follow up:<br> It is very easy to come up with a solution with run time O(n*sizeof(integer)). But can you do it in linear time O(n) /possibly in a single pass?<br> Space complexity should be O(n).<br> Can you do it like a boss? Do it without using any builtin function like __builtin_popcount in c++ or in any other language.<br>Credits:<br>Special thanks to @ syedee for adding this problem and creating all test cases.<br>
</summary>
<category term="leetcode" scheme="https://fengmumu1.github.io/categories/leetcode/"/>
<category term="算法" scheme="https://fengmumu1.github.io/tags/%E7%AE%97%E6%B3%95/"/>
<category term="leetcode" scheme="https://fengmumu1.github.io/tags/leetcode/"/>
</entry>
<entry>
<title>使用ftp方式上传博客</title>
<link href="https://fengmumu1.github.io/2018/07/07/hexo-ftp/"/>
<id>https://fengmumu1.github.io/2018/07/07/hexo-ftp/</id>
<published>2018-07-07T11:00:25.000Z</published>
<updated>2018-07-07T11:25:08.540Z</updated>
<content type="html"><![CDATA[<p>在github上传博客,有时候会失败,而且速度也很慢,所以就想放到国内的服务器上,怎奈何囊中羞涩买不起服务器,手里正好有个云主机,所以就用ftp的形式上传hexo的静态文件啦<br><a id="more"></a><br>先放上hexo的官方文档的传送门<a href="https://hexo.io/docs/deployment.html#FTPSync" target="_blank" rel="noopener">点我</a><br>先在你的bloge目录运行如下代码:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ npm install hexo-deployer-ftpsync --save</span><br></pre></td></tr></table></figure></p><p>然后在站点配置文件找到<code>deploy:</code><br>我的配置是这样子的:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><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">deploy:</span><br><span class="line">- type: git</span><br><span class="line"> repo: xxxxxxxx</span><br><span class="line"> branch: master</span><br><span class="line">- type: ftpsync</span><br><span class="line"> host: xxxxx #主机地址</span><br><span class="line"> user: xxxx #用户名</span><br><span class="line"> pass: xxxx #密码</span><br><span class="line"> //注意我用的是阿里云的云主机,按照他的规定我必须把文件放到根目录下的htdocs文件夹内</span><br><span class="line"> remote: /htdocs/ #上传到空间的指定目录。比如/public_html/。默认为/</span><br><span class="line"> port: 21 #端口,默认为21</span><br><span class="line"> //logreport 也是云主机的文件,无法删除,需要忽略它,都则会报错</span><br><span class="line"> ignore: [/logreport] #忽略的文件</span><br><span class="line"> connections: 1 #使用的连接数,默认1</span><br><span class="line"> verbose: true #显示调试信息,默认false</span><br></pre></td></tr></table></figure></p><div class="note info"><ul><li>hexo本身支持多站点上传,所以我们不需要删除以前的上传方式,不过注意正确的缩进以及空格</li><li>由于使用ftpsync上传,每次都会删除以前的文件,所以把你没有权限删除的以及不想删除或者<br>修改的文件写到ignore这里,ignore: [“/s”,”/c”],中间要用逗号隔开,注意路径(引号貌似可以不加) </li></ul></div>]]></content>
<summary type="html">
<p>在github上传博客,有时候会失败,而且速度也很慢,所以就想放到国内的服务器上,怎奈何囊中羞涩买不起服务器,手里正好有个云主机,所以就用ftp的形式上传hexo的静态文件啦<br>
</summary>
<category term="hexo" scheme="https://fengmumu1.github.io/categories/hexo/"/>
<category term="ftp" scheme="https://fengmumu1.github.io/tags/ftp/"/>
<category term="hexo上传" scheme="https://fengmumu1.github.io/tags/hexo%E4%B8%8A%E4%BC%A0/"/>
</entry>
<entry>
<title>浅谈立即执行函数</title>
<link href="https://fengmumu1.github.io/2018/07/06/immediate-execution-function/"/>
<id>https://fengmumu1.github.io/2018/07/06/immediate-execution-function/</id>
<published>2018-07-06T11:28:06.000Z</published>
<updated>2018-07-10T12:40:27.359Z</updated>
<content type="html"><),在这条语句执行后c指向函数d,而d在全局是undefined 因为,其只在函数内部可见,在外部不可见</span></span><br><span class="line"><span class="keyword">var</span> c = <span class="function"><span class="keyword">function</span> <span class="title">d</span>(<span class="params"></span>) </span>{</span><br><span class="line"> <span class="built_in">console</span>.log(<span class="string">"c函数声明"</span>)</span><br><span class="line">}</span><br></pre></td></tr></table></figure><blockquote><p>要区分一个代码是函数声明还是函数表达式,那要看代码的应用上下文。</p><ul><li>如果有运算符号,那它就是函数表达式。</li><li>如果没有运算符号而且不在条件判断语句中,就说明是函数声明,无法直接加()进行调用(运算符包括赋值号跟括号)</li><li>如果在条件语句中,函数声明也会强行被当做函数表达式执行。</li></ul><footer><strong>@Kelichao</strong><cite><a href="https://github.com/Kelichao/javascript.basics/issues/19" target="_blank" rel="noopener">github.com/Kelichao/javascript.basics/issues/19</a></cite></footer></blockquote><div class="note danger"><p>注意我们如果需要向下面这样声明函数,会在不同浏览器下得到不同结果<br>undefined</p><p>我们应该是用函数表达式声明,就可以的得到对的结果 </p></div><h3 id="立即执行函数(Immediately-Invoked-Function-Expression)"><a href="#立即执行函数(Immediately-Invoked-Function-Expression)" class="headerlink" title="立即执行函数(Immediately Invoked Function Expression)"></a>立即执行函数(Immediately Invoked Function Expression)</h3><p>在我们使用函数表达式来声明函数的时候,b指向的就是函数,我们要执行函数的时候就是b()。那么b的内容是什么 ?<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><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">我们把b的内容打印出来b == function() {</span><br><span class="line"> console.log("b函数声明")</span><br><span class="line"> }</span><br><span class="line">我们是不是想到了,如果 function() {</span><br><span class="line"> console.log("b函数声明")</span><br><span class="line"> }() </span><br><span class="line">是不是也可以让函数得到执行,我们把这种执行叫做立即执行函数,不过此处有个坑。</span><br><span class="line">他会报错`token(`,因为function是个关键字,编译器在编译的时候,如果以function开头那么</span><br><span class="line">就应该以}结尾,但是咱么以)结尾了,所以我们只需要不让function开头就好啦,我们可以</span><br><span class="line">给function前面放!/+/-或者用一个()把function() {</span><br><span class="line"> console.log("b函数声明")</span><br><span class="line"> }() </span><br><span class="line">整个包起来,或者只包裹函数声明的那一部分,不过用!/+ /-有可能改变函数的返回值,同时为了更</span><br><span class="line">符合函数的定义所以我们一般用()把函数声明的那一部分包起来,就变成了</span><br><span class="line">{% codeblock lang:Javascript %}</span><br><span class="line">(function f(){</span><br><span class="line"> console.log("xxx")</span><br><span class="line">})()</span><br><span class="line">{% endcodeblock %}</span><br></pre></td></tr></table></figure></p><div class="note danger"><p>我们需要注意的是,小括号有多种语义,此时的语义是:强制表达式运算 ,被称作:分组操作符<br>他只能包含表达式,所以此时的小括号就把语句转成了函数表达式的声明方式,但是,我们如果把return,var等语句写进去就会报语法错误</p></div><hr><p>有关立即执行函数以及闭包等,等以后知识库充足了再写<br>IIFE(Immediately Invoked Function Expression),立即执行函数表达式<br>javascript中没用私有作用域的概念,如果在多人开发的项目上,你在全局或局部作用域中声明了一些变量,可能会被其他人不小心用同名的变量给覆盖掉,</p><p>根据javascript函数作用域链的特性,可以使用这种技术可以模仿一个私有作用域,用匿名函数作为一个“容器”,“容器”内部可以访问外部的变量,</p><p>而外部环境不能访问“容器”内部的变量,所以( function(){…} )()内部定义的变量不会和外部的变量发生冲突,俗称“匿名包裹器”或“命名空间”。</p>]]></content>
<summary type="html">
<p>发现一个有意思的问题,有下面一段代码<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">f</span>(<span class="params">x, y</span>)</span>&#123;</span><br><span class="line"> <span class="built_in">console</span>.log(x + y)</span><br><span class="line">&#125;(<span class="number">3</span>,<span class="number">4</span>)</span><br></pre></td></tr></table></figure><br>我们把它输入到firebug下的命令控制台里面,回车之后会输出什么?<br>
</summary>
<category term="JavaScript" scheme="https://fengmumu1.github.io/categories/JavaScript/"/>
<category term="js" scheme="https://fengmumu1.github.io/tags/js/"/>
<category term="函数" scheme="https://fengmumu1.github.io/tags/%E5%87%BD%E6%95%B0/"/>
</entry>
<entry>
<title>计算素数个数的三段进阶</title>
<link href="https://fengmumu1.github.io/2018/07/04/count-primes-think/"/>
<id>https://fengmumu1.github.io/2018/07/04/count-primes-think/</id>
<published>2018-07-04T12:48:58.000Z</published>
<updated>2018-07-04T15:57:22.587Z</updated>
<content type="html"><![CDATA[<p>今天坐leetcode上的<a href="https://leetcode.com/problems/count-primes/description/" target="_blank" rel="noopener">Count Primes</a>这道题,题目要求比较的简单:Count the number of prime numbers less than a non-negative number, n. 就是给一个数字,然后输出从0到这个数字内有多少个素数。<br>老办法先实现后优化,实现之后发现优化真不容易,借助外界各种资源后,差不多算是达到了自己想达到的效果,故记录一下此次一波三折的优化。<br><a id="more"></a></p><h3 id="低阶版"><a href="#低阶版" class="headerlink" title="低阶版"></a>低阶版</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">isPrimes</span>(<span class="params">num</span>) </span>{</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">var</span> j = <span class="number">2</span>; j <= <span class="built_in">Math</span>.sqrt(num); j++) {</span><br><span class="line"> <span class="keyword">if</span>(num % j == <span class="number">0</span>){ </span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span></span><br><span class="line">}</span><br><span class="line"><span class="keyword">var</span> countPrimes = <span class="function"><span class="keyword">function</span>(<span class="params">n</span>) </span>{</span><br><span class="line"> <span class="keyword">var</span> coun = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">var</span> i =<span class="number">2</span>; i < n; i++) {</span><br><span class="line"> <span class="keyword">if</span>(isPrimes(i)) {</span><br><span class="line"> coun++</span><br><span class="line"> }</span><br><span class="line"> } </span><br><span class="line"> <span class="keyword">return</span> coun</span><br><span class="line">};</span><br></pre></td></tr></table></figure><p>我们可以看到函数逻辑比较简单,内层isPrimes函数为了提高速度,给除数加了一个小于等于Math.sqrt(num)的限制,之所以可以用这个数字来做限制是因为:num = a * b 当a增大的时候b一定减小,我们假设a从1一直增加,那么b将从num一直减小,当到a = Math.sqrt(num)的时候,a == b ,如果此时a继续增大呢,a是不是就向刚才一直减小的b一样了,也就是说我们相当于把之前做的运算又从新做了一遍,而这个计算是没有意义的,所以如果一个数除到他的开跟都不能整除,基本可以判定他是一个素数了。</p><h3 id="进阶版"><a href="#进阶版" class="headerlink" title="进阶版"></a>进阶版</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> primesList = [] </span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">isPrimes</span>(<span class="params">num</span>) </span>{</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">var</span> j = <span class="number">0</span>; primesList[j] <= <span class="built_in">Math</span>.sqrt(num); j++) {</span><br><span class="line"> <span class="keyword">if</span>(num % primesList[j] == <span class="number">0</span>){ </span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span></span><br><span class="line">}</span><br><span class="line"><span class="keyword">var</span> countPrimes = <span class="function"><span class="keyword">function</span>(<span class="params">n</span>) </span>{</span><br><span class="line"> <span class="keyword">var</span> coun = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">var</span> i =<span class="number">2</span>; i < n; i++) {</span><br><span class="line"> <span class="keyword">if</span>(isPrimes(i)) {</span><br><span class="line"> primesList.push(i) <span class="comment">//给数组添加质数,丰富质数表</span></span><br><span class="line"> coun++</span><br><span class="line"> }</span><br><span class="line"> } </span><br><span class="line"> <span class="keyword">return</span> coun</span><br><span class="line">};</span><br></pre></td></tr></table></figure><p>我们看一下上面的函数,上面函数的思路是这样的:一个数(大于1),他不是质数(素数)就是合数,合数可以分解成几个质数相乘,那么我是不是只要用这个数去除以质数我就知道他是不是一个合数了,那么问题来看了,一个数我们记作A,我们只需要依次他除以[2,√A]之间的质数就能判断出来他是不是一个合数了,这样子比我们从[2,√A],一个一个除要快很多,好了现在问题来了,我们是不是需要一个[2,√A]之间的质数表,上面的程序是这样子构建这个质数表的,从2开始,一边判断一边添加,这样子后面的数字就可以用前面的质数表了(实际上一个质数的平方是远大于紧跟在在后面的那个质数的),我们现在回到程序(其实单步跟一下程序就能看出来啦)。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">if(isPrimes(i)) {</span><br><span class="line"> primesList.push(i) //给数组添加质数,丰富质数表</span><br><span class="line"> coun++</span><br><span class="line">}1</span><br></pre></td></tr></table></figure></p><p>这个语句作用是,如果发现一个数是质数就给他放到质数表里,然后在记数结果+1<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><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">function isPrimes(num) {</span><br><span class="line"> for(var j = 0; primesList[j] <= Math.sqrt(num); j++) {</span><br><span class="line"> if(num % primesList[j] == 0){ </span><br><span class="line"> return false</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> return true</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p>这个函数是判断函数啦,需要注意的是,第一次计算的时候<code>primesList[0] == undefine</code> ,<code>num % primesList[j]</code>的结果是NAN(我更喜欢叫他是无意义的计算),然后NAN !== 0 (NAN连自己都相等) 这样子第一质数2,就成功的放入了数组啦<br>我们又成功地优化了函数,不禁要问这样子还可以优化吗?答案是:必须可以啊。</p><h4 id="进阶版小优化"><a href="#进阶版小优化" class="headerlink" title="进阶版小优化"></a>进阶版小优化</h4><p>我们给上面函数的 countPrimes 函数改一下<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> countPrimes = <span class="function"><span class="keyword">function</span>(<span class="params">n</span>) </span>{</span><br><span class="line"> <span class="keyword">var</span> coun = <span class="number">1</span></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">var</span> i =<span class="number">3</span>; i < n; i+=<span class="number">2</span>) {</span><br><span class="line"> <span class="keyword">if</span>(isPrimes(i)) {</span><br><span class="line"> primesList.push(i) <span class="comment">//给数组添加质数,丰富质数表</span></span><br><span class="line"> coun++</span><br><span class="line"> }</span><br><span class="line"> } </span><br><span class="line"> <span class="keyword">return</span> coun</span><br><span class="line">};</span><br></pre></td></tr></table></figure><br>我们把<code>coun</code> 初始值改成1,变量<code>i</code>从3开始,每次都往里放奇数(偶数绝逼是合数),这样子速度又快了不少</p><h3 id="再进阶版"><a href="#再进阶版" class="headerlink" title="再进阶版"></a>再进阶版</h3><p>虽然上面的好理解,而且有了一定的优化,但是效率并不高,那么有没有效率更高的呢,答案是必须的,我们来看一下几千年前的一个算法:<a href="https://open.163.com/movie/2012/10/0/6/M99VJKUHC_M9ENDUB06.html" target="_blank" rel="noopener">埃拉托斯特尼筛法</a><br>其实 埃拉托斯特尼筛法 简单的说就是,把[2,A]之间的[2,√A]的数的所有倍数全部划去,最后留下的就是质数。<br>那么我们是不是可以这样子生成一个大小为n的数组,数组全部都为1,每发现一个合数,我们就把一个数组的元素变为0,最后我们只需要统计1的个数就好了<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">countPrimes</span>(<span class="params">n</span>) </span>{</span><br><span class="line"> <span class="comment">//我们声明一个大小为n的数组,并且全部标记为1(我们把标记1是质数,0标记合数),</span></span><br><span class="line"> <span class="keyword">var</span> flags = <span class="keyword">new</span> <span class="built_in">Array</span>(n).fill(<span class="number">1</span>)</span><br><span class="line"> <span class="comment">//其实这里的想法是 0 1 全不是质数,所以打掉,</span></span><br><span class="line"> flags[<span class="number">0</span>] = flags[<span class="number">1</span>] = <span class="number">0</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">var</span> sn = <span class="built_in">Math</span>.sqrt(n)</span><br><span class="line"> <span class="comment">//我们只比对到[2,√A]的所有倍数</span></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">var</span> i = <span class="number">2</span>; i <= sn; i++) {</span><br><span class="line"> <span class="comment">//注意在循环里面我们已经操作了flags,所以我们此时不需要再判断划掉了的元素(flags[i] == 0) </span></span><br><span class="line"> <span class="keyword">if</span> (flags[i]) {</span><br><span class="line"> <span class="comment">//注意我们这个j,埃拉托斯特尼筛法 是从数字的倍数开始划的</span></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">var</span> j = i * i; j < n; j += i) {</span><br><span class="line"> flags[j] = <span class="number">0</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">var</span> count = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">var</span> i = <span class="number">0</span>; i<n; i++) {</span><br><span class="line"> <span class="keyword">if</span>(flags[i]) {</span><br><span class="line"> count++</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> count</span><br><span class="line">}</span><br></pre></td></tr></table></figure><br>现在我们又GET了一个新技能,我们再想一下是不是还可以优化一下,答案依然是是的,我们看一下他的进阶版</p><h3 id="再再进阶版"><a href="#再再进阶版" class="headerlink" title="再再进阶版"></a>再再进阶版</h3><p>如果你有心的话,你会发现我们上一个版本的函数,在划去合数的时候,会有重复划去的过程,这个我也就不上图了,自己单步走一下,或者在纸上画一下一切就会浮现出来的。<br>我们先上函数<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment">//小于3 就是 0 1 直接标记为0</span></span><br><span class="line"><span class="keyword">var</span> countPrimesx = <span class="function"><span class="keyword">function</span>(<span class="params">n</span>) </span>{</span><br><span class="line"> <span class="keyword">if</span> (n < <span class="number">3</span>) {</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//数组全部置1</span></span><br><span class="line"> <span class="keyword">var</span> f = <span class="keyword">new</span> <span class="built_in">Array</span>(n).fill(<span class="literal">true</span>)</span><br><span class="line"><span class="comment">//有一半的数字为偶数,所以直接打掉一半,然后后面的或是为了取整</span></span><br><span class="line"> <span class="keyword">var</span> count = n / <span class="number">2</span> | <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">var</span> i = <span class="number">3</span>; i * i < n; i += <span class="number">2</span>) {</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">var</span> j = i * i; j < n; j += <span class="number">2</span>*i) {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (f[j]) {</span><br><span class="line"> --count</span><br><span class="line"> f[j] = <span class="literal">false</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">return</span> count</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><hr><p>文章末尾感谢那些愿意分享知识的人:<br>谢大喵<br><a href="https://blog.csdn.net/tel_annie/article/details/79744902" target="_blank" rel="noopener">TanX的博客</a></p><hr>]]></content>
<summary type="html">
<p>今天坐leetcode上的<a href="https://leetcode.com/problems/count-primes/description/" target="_blank" rel="noopener">Count Primes</a>这道题,题目要求比较的简单:Count the number of prime numbers less than a non-negative number, n. 就是给一个数字,然后输出从0到这个数字内有多少个素数。<br>老办法先实现后优化,实现之后发现优化真不容易,借助外界各种资源后,差不多算是达到了自己想达到的效果,故记录一下此次一波三折的优化。<br>
</summary>
<category term="leetcode" scheme="https://fengmumu1.github.io/categories/leetcode/"/>
<category term="算法" scheme="https://fengmumu1.github.io/tags/%E7%AE%97%E6%B3%95/"/>
<category term="leet" scheme="https://fengmumu1.github.io/tags/leet/"/>
<category term="素数" scheme="https://fengmumu1.github.io/tags/%E7%B4%A0%E6%95%B0/"/>
</entry>
<entry>
<title>JavaScript的递归以及浅谈尾调用</title>
<link href="https://fengmumu1.github.io/2018/07/03/JavaScript-tail-Call/"/>
<id>https://fengmumu1.github.io/2018/07/03/JavaScript-tail-Call/</id>
<published>2018-07-03T13:52:59.000Z</published>
<updated>2018-07-04T03:43:06.085Z</updated>
<content type="html"><![CDATA[<h3 id="一个递归引发的血案"><a href="#一个递归引发的血案" class="headerlink" title="一个递归引发的血案"></a>一个递归引发的血案</h3><h4 id="案发现场"><a href="#案发现场" class="headerlink" title="案发现场"></a>案发现场</h4><p>今天看到了递归,测试的时候必须是经典的 <a href="https://www.baidu.com/link?url=K3gRN6fMUN_l6_8f7UiOQoRhsa5v0LEQzjwKOJkpuNiywF3ivK9ELpd2KW-A8KCn888Ekr6Xv70ZjRguMF5Gn7fhzOfVyMUleJaW5QC-zdJIINMXZGP-Nx945Pox-L_JYVUX5_adWxCpUDqVOEgu5_&wd=&eqid=ccb3c7a0000077f8000000045b3b813f" target="_blank" rel="noopener">Fibonacci (斐波纳契) 数列</a>,然后我做的时候的代码如下:<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">Fibonacci</span> (<span class="params">n</span>) </span>{</span><br><span class="line"> <span class="keyword">if</span> ( n <= <span class="number">1</span> ) {<span class="keyword">return</span> <span class="number">1</span>};</span><br><span class="line"> <span class="keyword">return</span> Fibonacci(n - <span class="number">1</span>) + Fibonacci(n - <span class="number">2</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><br>这是一个很简答的递归函数,单纯且不做作。他很简单,看一眼就知道他是如何运算的,单纯到到计算一个Fibonacci(100)就给我来个栈溢出错误(stack overflow),然后我很奇葩的算了一下Fibonacci(25),然后就卡-住-了,这不行啊,所以我就去搜原因去咯。<br><a id="more"></a></p><h4 id="抢救现场"><a href="#抢救现场" class="headerlink" title="抢救现场"></a>抢救现场</h4><p>找了一下,找了一个有优化效果的函数:<br><figure class="highlight javascript"><figcaption><span>尾递归优化后的程序</span><a href="http://phpstudy.php.cn/c.php/107851.html" target="_blank" rel="noopener">源程序连接</a></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> fibArr =[<span class="number">0</span>,<span class="number">1</span>,<span class="number">1</span>];</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">Fibonacci</span>(<span class="params">n</span>)</span>{</span><br><span class="line"> <span class="keyword">return</span> fibArr[n]? fibArr[n]:(fibArr[n]=Fibonacci(n<span class="number">-1</span>)+Fibonacci(n<span class="number">-2</span>));</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><h4 id="案件复盘"><a href="#案件复盘" class="headerlink" title="案件复盘"></a>案件复盘</h4><p>嗯,解释这个程序的思想之前我们先来看一下我们以前的程序都干了什么,在这之前我们先来补充一个小知识点:<br><blockquote><p>我们知道,函数调用会在内存形成一个“调用记录”,又称“调用帧”(call frame),保存调用位置和内部变量等信息。如果在函数A的内部调用函数B,那么在A的调用帧上方,还会形成一个B的调用帧。等到B运行结束,将结果返回到A,B的调用帧才会消失。如果函数B内部还调用函数C,那就还有一个C的调用帧,以此类推。所有的调用帧,就形成一个“调用栈”(call stack)。</p><footer><strong>@阮一峰</strong><cite><a href="http://es6.ruanyifeng.com/?search=%E9%80%92%E5%BD%92&x=0&y=0#docs/function" target="_blank" rel="noopener">es6.ruanyifeng.com/?search=%E9%80%92%E5%BD%92&x=0&y=0#docs/function</a></cite></footer></blockquote><br><blockquote class="blockquote-center"><p>通过上面我们知道了,要是每次调用都会在内存生成一个调用帧,然后我们看一下Fibonacci数列,我们单步进入程序的时候(或者在纸上画一下)可以发现,我们一开始的程序在计算的时候会压入很多重复的计算,也就是说很多调用帧的返回结果是相同的,但是我们还是把他们压入到了调用栈里面,(函数先计算+左边的,然后就不断的进入函数内部,不断的压栈,计算完成后再一层一层的往回出栈,等到+左边的计算完了,再来右边的,你会发现右边的很多调用帧的结果刚才都算出来了,可是在算+左边结果的时候又把它们清除了,这样子是不是浪费了大把的时间)这样一来就是两个结果,栈不够用爆掉啦,栈将将够用,然后程序慢慢进再慢慢的出,这时候好的电脑运行会变慢,差的电脑就会卡住或者死机,让我哭一会。</p></blockquote></p><h3 id="引入尾调用"><a href="#引入尾调用" class="headerlink" title="引入尾调用"></a>引入尾调用</h3><p>我哭好了,我们继续看优化后的函数,优化后的函数优化就是优化了重复的那个一部分,我们用数组来存储+左边我们每一个调用帧计算的结果,到计算+右边的时候我们直接和数组里面的数字(注意那个n)进行比对,准确的说是看参数是否相同,相同的话就直接出返回结果而不进栈了。<br>这里其实用到了一点缓存区的概念(这个我们有空再聊哈),我们这样子优化的直接效果就是进去的调用帧少了,直接结果是栈不会爆了,也没有了多余的重复计算,速度直接就上去了。<br>那么问题来了,是不是递归都会有这个问题,答案是:一些形式的递归是的,这个由JavaScript的栈机制造成的。<br>是不是要说,一些形式是的,那不就是还有形式不是,好了,我要开始装逼了,那个形式就是:尾调用。<br>直接上阮一峰大佬的解释:<br><blockquote><p>尾调用(Tail Call)是函数式编程的一个重要概念,本身非常简单,一句话就能说清楚,就是指某个函数的最后一步是调用另一个函数。</p><p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">f</span>(<span class="params">x</span>)</span>{</span><br><span class="line"> <span class="keyword">return</span> g(x);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><br>上面代码中,函数f的最后一步是调用函数g,这就叫尾调用。<br>以下三种情况,都不属于尾调用。</p><p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment">// 情况一</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">f</span>(<span class="params">x</span>)</span>{</span><br><span class="line"> <span class="keyword">let</span> y = g(x);</span><br><span class="line"> <span class="keyword">return</span> y;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 情况二</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">f</span>(<span class="params">x</span>)</span>{</span><br><span class="line"> <span class="keyword">return</span> g(x) + <span class="number">1</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 情况三</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">f</span>(<span class="params">x</span>)</span>{</span><br><span class="line"> g(x);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><br>上面代码中,情况一是调用函数g之后,还有赋值操作,所以不属于尾调用,即使语义完全一样。情况二也属于调用后还有操作,即使写在一行内。情况三等同于下面的代码。</p><p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">f</span>(<span class="params">x</span>)</span>{</span><br><span class="line"> g(x);</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">undefined</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><br>尾调用不一定出现在函数尾部,只要是最后一步操作即可。</p><p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">f</span>(<span class="params">x</span>) </span>{</span><br><span class="line"> <span class="keyword">if</span> (x > <span class="number">0</span>) {</span><br><span class="line"> <span class="keyword">return</span> m(x)</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> n(x);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><br>上面代码中,函数m和n都属于尾调用,因为它们都是函数f的最后一步操作。</p><footer><strong>@阮一峰</strong><cite><a href="http://es6.ruanyifeng.com/?search=%E9%80%92%E5%BD%92&x=0&y=0#docs/function#%E5%B0%BE%E8%B0%83%E7%94%A8%E4%BC%98%E5%8C%96" target="_blank" rel="noopener">es6.ruanyifeng.com/?search=%E9%80%92%E5%BD%92&x=0&y=0#docs/function#%E5%B0%BE%E8%B0%83%E7%94%A8%E4%BC%98%E5%8C%96</a></cite></footer></blockquote></p><h3 id="关于尾调用的优化"><a href="#关于尾调用的优化" class="headerlink" title="关于尾调用的优化"></a>关于尾调用的优化</h3><p>好了现在知道了尾调用,按道理我应该引入尾调用的优化,毕竟ES6第一次明确规定,所有 ECMAScript 的实现,都必须部署“尾调用优化”。这就是说,ES6 中只要使用尾递归,就不会发生栈溢出,相对节省内存。<br>也就是说,尾调用是一写法形式,写成这样子,浏览器会自动进行优化(不过目前只有苹果的才支持,其它的浏览器需要在严格模式下才执行这个操作),又或者我们可以写一个函数,自己来做这个尾调用优化,但是我依稀还记得 Eloquent_JavaScript(第二版) 中有一句话:<br><blockquote><p>The dilemma of speed versus elegance is an interesting one. You can see it as a kind of continuum between human-friendliness and machinefriendliness. Almost any program can be made faster by making it bigger and more convoluted. The programmer must decide on an appropriate balance.</p><footer><strong>Marijn Haverbeke</strong><cite>Eloquent_JavaScript</cite></footer></blockquote><br>其实自己进行优化的方式也只是把递归转化成循环的样子,有的人会坚持尽可能的用循环而不是用递归,应为为达到同样的效果用循环更快,其实二者那个好都说不好的,或许等到浏览器都支持在正常模式下也进行尾递归优化的时候,递归就用的越来越多了,毕竟他有其独到的优势哈。</p><h3 id="递归函数的规则"><a href="#递归函数的规则" class="headerlink" title="递归函数的规则"></a>递归函数的规则</h3><p>最后附上一个写递归函数的规则:<br><blockquote><p>当编写递归例程的时候,关键是要牢记递归的四条基本法则:</p><ol><li>基准情形。必须总有某些基准情形,它无须递归就能解出。</li><li>不断推进。对于那些需要递归求解的情形嗯每一次递归调用都必须要使求解状况朝接近基准情形的方向推进。</li><li>设计法则。假设所有的递归调用都能运行。</li><li>合成效益法则(ωmpound interest rule ) 。在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性的工作。</li></ol><footer><strong>Mark Allen Weiss·著 冯舜玺·译</strong><cite>数据结构与算法分析:C语言描述(第2版)</cite></footer></blockquote></p><p>以下是本博文参考的资料,感谢他们的分享</p><hr><p>数据结构与算法分析:C语言描述(第2版)<br>阮一峰大佬的:<a href="http://es6.ruanyifeng.com/?search=%E9%80%92%E5%BD%92&x=0&y=0#docs/function#%E5%B0%BE%E8%B0%83%E7%94%A8%E4%BC%98%E5%8C%96" target="_blank" rel="noopener">ECMAScript 6入门</a><br><a href="http://phpstudy.php.cn/c.php/107851.html" target="_blank" rel="noopener">phpstudy的文章</a><br><a href="https://blog.csdn.net/jxgz_leo/article/details/53208524" target="_blank" rel="noopener">jxgz_leo的博客</a>。关于尾数调用优化,这个博文写的比阮大佬能详细</p><hr>]]></content>
<summary type="html">
<h3 id="一个递归引发的血案"><a href="#一个递归引发的血案" class="headerlink" title="一个递归引发的血案"></a>一个递归引发的血案</h3><h4 id="案发现场"><a href="#案发现场" class="headerlink" title="案发现场"></a>案发现场</h4><p>今天看到了递归,测试的时候必须是经典的 <a href="https://www.baidu.com/link?url=K3gRN6fMUN_l6_8f7UiOQoRhsa5v0LEQzjwKOJkpuNiywF3ivK9ELpd2KW-A8KCn888Ekr6Xv70ZjRguMF5Gn7fhzOfVyMUleJaW5QC-zdJIINMXZGP-Nx945Pox-L_JYVUX5_adWxCpUDqVOEgu5_&amp;wd=&amp;eqid=ccb3c7a0000077f8000000045b3b813f" target="_blank" rel="noopener">Fibonacci (斐波纳契) 数列</a>,然后我做的时候的代码如下:<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">Fibonacci</span> (<span class="params">n</span>) </span>&#123;</span><br><span class="line"> <span class="keyword">if</span> ( n &lt;= <span class="number">1</span> ) &#123;<span class="keyword">return</span> <span class="number">1</span>&#125;;</span><br><span class="line"> <span class="keyword">return</span> Fibonacci(n - <span class="number">1</span>) + Fibonacci(n - <span class="number">2</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><br>这是一个很简答的递归函数,单纯且不做作。他很简单,看一眼就知道他是如何运算的,单纯到到计算一个Fibonacci(100)就给我来个栈溢出错误(stack overflow),然后我很奇葩的算了一下Fibonacci(25),然后就卡-住-了,这不行啊,所以我就去搜原因去咯。<br>
</summary>
<category term="JavaScript" scheme="https://fengmumu1.github.io/categories/JavaScript/"/>
<category term="JavaScript" scheme="https://fengmumu1.github.io/tags/JavaScript/"/>
<category term="递归" scheme="https://fengmumu1.github.io/tags/%E9%80%92%E5%BD%92/"/>
<category term="栈" scheme="https://fengmumu1.github.io/tags/%E6%A0%88/"/>
</entry>
<entry>
<title>发现个异或的妙用</title>
<link href="https://fengmumu1.github.io/2018/07/02/Single-Number/"/>
<id>https://fengmumu1.github.io/2018/07/02/Single-Number/</id>
<published>2018-07-02T13:35:45.000Z</published>
<updated>2018-07-03T01:32:41.439Z</updated>
<content type="html"><![CDATA[<p>有个题目是这样子的:<a href="https://leetcode.com/problems/single-number/description/" target="_blank" rel="noopener">Single Number</a><br>题目要求如下:Given a non-empty array of integers, every element appears twice except for one. Find that single one.<br>Note:<br>Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?<br>意思就是一个数组[2,2,3,3,5] 5就是那个 single numble了<br>然后自己想了半天也就会笨办法,倒也能通过,然后看了一下前面人的解法,又一次打开了脑洞<br><a id="more"></a><br>大佬的代码如下:<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> singleNumber = <span class="function"><span class="keyword">function</span>(<span class="params">nums</span>) </span>{</span><br><span class="line"> <span class="keyword">if</span> (!nums || nums.length === <span class="number">0</span>) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="built_in">Error</span>();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">var</span> res = nums[<span class="number">0</span>];</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">1</span>; i < nums.length; i++) {</span><br><span class="line"> res ^= nums[i]; </span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> res;</span><br><span class="line">};</span><br></pre></td></tr></table></figure><br>一开始我还没有看懂为什么异或就可以,不就是相同为0,不同为1啊,然后单步进去运行了一下,还是一头雾水(单步的时候res没有规律),出去上个厕所,喝口水。然后突然想到,从把数组所有的数字全拿出来,一个一个异或,可以看成相同的和相同的异或,然后得到的是0 ,最后剩下一个奇数的single number,把他和0异或(^)就得到他本身啊。</p><div class="note info"><p>多动动,多喝水,没事上个厕所,买个小黄鸭,换个角度,问题就迎刃而解啊啊啊啊啊啊!!!!</p></div>]]></content>
<summary type="html">
<p>有个题目是这样子的:<a href="https://leetcode.com/problems/single-number/description/" target="_blank" rel="noopener">Single Number</a><br>题目要求如下:Given a non-empty array of integers, every element appears twice except for one. Find that single one.<br>Note:<br>Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?<br>意思就是一个数组[2,2,3,3,5] 5就是那个 single numble了<br>然后自己想了半天也就会笨办法,倒也能通过,然后看了一下前面人的解法,又一次打开了脑洞<br>
</summary>
<category term="leetcode" scheme="https://fengmumu1.github.io/categories/leetcode/"/>
<category term="算法" scheme="https://fengmumu1.github.io/tags/%E7%AE%97%E6%B3%95/"/>
<category term="leetcode" scheme="https://fengmumu1.github.io/tags/leetcode/"/>
<category term="思路" scheme="https://fengmumu1.github.io/tags/%E6%80%9D%E8%B7%AF/"/>
</entry>
<entry>
<title>从Power_of_Two所得</title>
<link href="https://fengmumu1.github.io/2018/07/02/leetode-Power-of-Two-think/"/>
<id>https://fengmumu1.github.io/2018/07/02/leetode-Power-of-Two-think/</id>
<published>2018-07-02T07:21:40.000Z</published>
<updated>2018-07-02T08:22:31.606Z</updated>
<content type="html"><![CDATA[<p>开始刷leetcode上的题目了,毕竟写程序也是需要开脑洞的,刷题目就能让自己脑洞越来越大的说,这不发现了一个题目: <a href="https://leetcode.com/problems/power-of-two/description/" target="_blank" rel="noopener">Power of Two</a><br>题目要求:<br>Given an integer, write a function to determine if it is a power of two.<br>其实就是让你看一个数是不是2的幂次方<br><a id="more"></a></p><hr><p>先说我的思路吧,一个数一直除以2,除到他小于4的时候,2的幂方数就是只有 2 1 这两个数字了,那么我判断一下是不是他俩就好啦<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> isPowerOfTwo = <span class="function"><span class="keyword">function</span> (<span class="params">n</span>) </span>{</span><br><span class="line"> <span class="keyword">var</span> wx = n</span><br><span class="line"> <span class="keyword">var</span> falg = <span class="number">0</span></span><br><span class="line"> <span class="keyword">while</span> (falg == <span class="number">0</span>) {</span><br><span class="line"> <span class="comment">// wx = wx >> 1</span></span><br><span class="line"> wx = wx / <span class="number">2</span></span><br><span class="line"> <span class="keyword">if</span> (wx < <span class="number">4</span>) {</span><br><span class="line"> <span class="comment">//需要考虑一开始就是1的情况</span></span><br><span class="line"> <span class="keyword">if</span> (wx == <span class="number">2</span> || wx == <span class="number">1</span> || wx == <span class="number">0.5</span>) {</span><br><span class="line"> falg = <span class="number">1</span></span><br><span class="line"> <span class="comment">// console.log("true")</span></span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span></span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> falg = <span class="number">2</span></span><br><span class="line"> <span class="comment">// console.log("false")</span></span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">};</span><br></pre></td></tr></table></figure></p><hr><p>然后看了看别人的代码,发现了一个很棒的思路,思路就是看 n 与 n-1 与出来的结果是不是 0<br>我们看一下 4 二进制是:0100 那么3呢,3是 0011,二者与出来就是0,所以这个思路太赞了,一下子就得出结果了。代码是没有的,思路都有了,代码还写不出来吗!</p><hr><p>又发现了个看数字是不是4的幂的题<br>我的想法是 先看他是不是2的幂,再看他是不是小于10,小于的话,等不等于 4 或者 8<br>然后发现了一个想法是,先看是不是2 的幂,然后看能不能整除4<br>然后又发现了个是不是3的幂的数,我的思路是利用数学规则(各个位相加为三的倍数)看他是不是能被3整除,能的话就除以3,用结果继续这样子判断,一直到他小于10的时候,看是不是 3 或者 9<br>结果发现了一个更惊为天人的思路,思路是这样子的,把可以取值范围内的最大3的幂数求出来,记为 a , 然后给个数字b 如果 a % b === 0那b就是3的幂数,没有想到的话看下面<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">a = 3 * 3 * 3 * 3 * 3 *3 *3 </span><br><span class="line">b = 3 * 3 * 3 </span><br><span class="line">c = 3 * 3 * 4</span><br></pre></td></tr></table></figure></p><p>这个就很直观了吧!</p><hr>]]></content>
<summary type="html">
<p>开始刷leetcode上的题目了,毕竟写程序也是需要开脑洞的,刷题目就能让自己脑洞越来越大的说,这不发现了一个题目: <a href="https://leetcode.com/problems/power-of-two/description/" target="_blank" rel="noopener">Power of Two</a><br>题目要求:<br>Given an integer, write a function to determine if it is a power of two.<br>其实就是让你看一个数是不是2的幂次方<br>
</summary>
<category term="leetcode" scheme="https://fengmumu1.github.io/categories/leetcode/"/>
<category term="算法" scheme="https://fengmumu1.github.io/tags/%E7%AE%97%E6%B3%95/"/>
<category term="leetcode" scheme="https://fengmumu1.github.io/tags/leetcode/"/>
<category term="思路" scheme="https://fengmumu1.github.io/tags/%E6%80%9D%E8%B7%AF/"/>
</entry>
<entry>
<title>给文章加入版权信息</title>
<link href="https://fengmumu1.github.io/2018/07/02/tip-copyright/"/>
<id>https://fengmumu1.github.io/2018/07/02/tip-copyright/</id>
<published>2018-07-02T02:22:30.000Z</published>
<updated>2018-07-03T01:30:27.442Z</updated>
<content type="html"><![CDATA[<p>看到别人的的博客下面都有版权信息(就是本文最底下的那个啦),然后自己也想加上一个,搜了一下都是17年的老文章,用的是自定义的方法。<br>本来打算去DIY一下,然后突发奇想去主题插件搜了一下版权(copyright),然后发现了这个东西<br><a id="more"></a><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">post_copyright:</span><br><span class="line"> enable: false</span><br><span class="line">.....</span><br></pre></td></tr></table></figure></p><p>就把那个<code>enable: false</code> 改成<code>enable: true</code> 就好啦<br><code>`</code></p><hr><p>ps:如果底下的版权信息中的本文链接:成了<code>http://yoursite.com/2018/07/02/tip-copyright</code>这个样子<br>只需要在网站配置文件下把url: <a href="http://yoursite.com" target="_blank" rel="noopener">http://yoursite.com</a> 改成url: <a href="https://fengmumu1.github.io">https://fengmumu1.github.io</a> 就好啦</p><p>有一篇博文还可以,就是关于next配置的,不过文章写的时间有点老,方法都还是有效果的,不过新的next版本会有更好的实现方式,所以不要以为的抄啦。 <a href="http://shenzekun.cn/hexo%E7%9A%84next%E4%B8%BB%E9%A2%98%E4%B8%AA%E6%80%A7%E5%8C%96%E9%85%8D%E7%BD%AE%E6%95%99%E7%A8%8B.html" target="_blank" rel="noopener">文章传送门</a></p><hr>]]></content>
<summary type="html">
<p>看到别人的的博客下面都有版权信息(就是本文最底下的那个啦),然后自己也想加上一个,搜了一下都是17年的老文章,用的是自定义的方法。<br>本来打算去DIY一下,然后突发奇想去主题插件搜了一下版权(copyright),然后发现了这个东西<br>
</summary>
<category term="hexo" scheme="https://fengmumu1.github.io/categories/hexo/"/>
<category term="hexo" scheme="https://fengmumu1.github.io/tags/hexo/"/>
</entry>
</feed>