Jekyll2024-02-04T02:32:10+00:00https://xtea.io/feed.xmlLi Xiaomeng’s BlogCoding | Design | Thinking. 醉里挑灯看剑,梦回吹角连营。30分钟入门Swift语言简明教程2020-04-06T02:40:00+00:002020-04-06T02:40:00+00:00https://xtea.io/tools/2020/04/06/learn-swift-programing<p>作为一个有多年编程经验的熟练工程师,学习一门新语言的成本应该是非常低的。下面我将学习swift语言的过程记录下来,及帮助自己做个笔记,也帮助swift新手们尝鲜。</p>
<h2 id="学以致用">学以致用</h2>
<p>首先要时刻铭记,学习的目的就是为了在实践中应用,要带着问题和目的去学习,而不是为了学习而学习。</p>
<p>根据我的经验,最好的学习路径应该是:
<strong>学习 -> 实践 -> 遇到问题 -> 学习 -> 实践 …</strong></p>
<h2 id="准备内容">准备内容</h2>
<p>一台安装了Xcode的Mac电脑。</p>
<h2 id="开始学习">开始学习</h2>
<h3 id="1--hello-world">1- Hello World</h3>
<p>老规矩,先从hellow world程序开始。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>var myString = "Hello, World!"
print(myString)
</code></pre></div></div>
<p>看起来,语言还是比较简洁讨人喜欢的。参数使用的var,和JS一样。而打印方法和python 3是一样的。</p>
<p>重点的是我们了解到,<strong>swift语言是不强制使用分号结尾的</strong>。</p>
<h3 id="2--基础语法">2- 基础语法</h3>
<p><strong>定义变量</strong></p>
<p>直接关键字 var,无需关注数据类型可以直接赋值,和js看起来是一样的。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> var msg = "\n hello world \n"
var num = 1984 // 数字
var float_num = 1999.0 // 浮点数字
var flag = true // 布尔类型
// 可变类型,重复赋值
num = 1997
float_num = 2012.01
</code></pre></div></div>
<p>使用关键字 let 来定义常量,效果通Java中的 final。</p>
<p>值得注意的是,虽然swift看起来像解释性语言一样方便,但是实际上他还是强类型的语言。可以强制定义其数据的类型。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> var msg:String = "\n hello world \n"
var num:Int = 1984 // 数字
var float_num:Float = 1999.0 // 浮点数字
var flag:Bool = true // 布尔类型
</code></pre></div></div>
<p><strong>数组</strong></p>
<p>创建数组方式一,以下实例创建了一个类型为 Int ,数量为 3,初始值为 0 的空数组:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>var someInts = [Int](repeating: 0, count: 3)
</code></pre></div></div>
<p>创建数组方式二:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
var someInts:[Int] = [10, 20, 30]
</code></pre></div></div>
<p>可以直接使用下标访问数组,下标从0开始。新增元素可以用使用append方法或者直接 +=</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> var someInts = [Int]()
someInts.append(20) // 添加 20
someInts.append(30) // 添加 30
someInts += [40] // 添加 40
</code></pre></div></div>
<blockquote>
<p>数组的长度使用 count 属性; isEmpty来判断是否为空数组。</p>
</blockquote>
<p><strong>字符串</strong></p>
<p>掌握字符串的处理是入门一个开发语言的基本操作,因此要重点学习下字符串处理相关的方法。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>var greeting = "Hi"
var name = "jack"
var msg = greeting + " " + name
print(msg) // Hi jack
var msg2 = "\(greeting) \(name)"
print(msg2) // Hi jack
print(msg == msg2) // true
</code></pre></div></div>
<p>格式化字符串和数字时候直接使用 “(parm)”来替代既可以,非常方便。</p>
<blockquote>
<p>属性count和isEmpty在字符串处理同样适用。</p>
</blockquote>
<p><strong>关于nil</strong></p>
<p>代表空的指针,和java中的null、python中的None相同。</p>
<p><strong>运算符</strong></p>
<p>包含多种运算符,例如:算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符及其他运算符。基本与其它高级语言无区别,再此不做多余记录。</p>
<blockquote>
<p>注意:swift3 中已经取消了++、–。</p>
</blockquote>
<p><strong>注释</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>//这是一行注释
/* 这也是一条注释,
但跨越多行 */
</code></pre></div></div>
<h3 id="程序结构">程序结构</h3>
<p>程序的3中结构:顺序、选择和循环。下面看一下如果来处理选择和循环。</p>
<p><strong>选择</strong></p>
<p>不需要括号包含布尔表达式, 其它与Java相同。</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>if boolean_expression {
/* 如果布尔表达式为真将执行的语句 */
}
var a = 1
// && = 与 , || = 或
if a < 10 {
print("a 小于 10")
}
</code></pre></div></div>
<p><strong>循环</strong></p>
<p>循环数组</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>var someStrs = [String]()
someStrs.append("Apple")
someStrs.append("Amazon")
someStrs.append("Runoob")
someStrs += ["Google"]
// 仅元素
for item in someStrs {
print(item)
}
// 元素与下标
for (index, item) in someStrs.enumerated() {
print("在 index = \(index) 位置上的值为 \(item)")
}
</code></pre></div></div>
<p>循环字符串</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>for ch in "Runoob" {
print(ch)
}
</code></pre></div></div>
<p>其余与其它语言无异同。</p>
<h3 id="数据结构">数据结构</h3>
<p>数组刚才已经提到了,下面讲解下字典(对应Java里的Hash table)</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"]
var someVar = someDict[1] // 访问字典元素
someDict.updateValue("One 新的值", forKey: 1) // 修改字典元素
var removedValue = someDict.removeValue(forKey: 2) // 删除字典元素
// 遍历字典
for (key, value) in someDict {
print("字典 key \(key) - 字典 value \(value)")
}
let dictKeys = [Int](someDict.keys) // 所有的key
let dictValues = [String](someDict.values) // 所有的value
print("输出字典的键(key)")
print("输出字典的值(value)")
</code></pre></div></div>
<h3 id="面向对象或函数式编程">面向对象(或函数式编程)</h3>
<h3 id="高级特性">高级特性</h3>
<h2 id="总结">总结</h2>作为一个有多年编程经验的熟练工程师,学习一门新语言的成本应该是非常低的。下面我将学习swift语言的过程记录下来,及帮助自己做个笔记,也帮助swift新手们尝鲜。创建一个电报账号群组搜索引擎2020-01-01T04:40:00+00:002020-01-01T04:40:00+00:00https://xtea.io/tools/2020/01/01/telegram-search<p>看到网上有很多人推荐电报群组的导航网站,其实每个人都可以建立一个自己的搜索引擎。</p>
<p>访问这个链接看效果: <a href="https://xtea.io/ts.html">https://xtea.io/ts.html</a></p>
<p>其实原理很简单,基于google提供的自定义搜索 <code class="language-plaintext highlighter-rouge">cse.google.com</code>.</p>
<p><img src="/img/2020/1.png" alt="create" /></p>
<p>创建步骤如下:</p>
<ol>
<li>在搜索的网站输入 <code class="language-plaintext highlighter-rouge">t.me</code> 电报群组的网站。</li>
<li>给搜索引擎定义一个名字,如:电报搜索。</li>
<li>点击<code class="language-plaintext highlighter-rouge">创建</code>按钮.</li>
<li>创建成功了,点击<code class="language-plaintext highlighter-rouge">公开地址</code> 就可以访问了.</li>
</ol>
<p>大功告成,试试效果吧。</p>
<p><img src="/img/2020/2.png" alt="show" /></p>看到网上有很多人推荐电报群组的导航网站,其实每个人都可以建立一个自己的搜索引擎。应届生面试不要做这3件事2019-09-24T09:50:00+00:002019-09-24T09:50:00+00:00https://xtea.io/interview/2019/09/24/for-new-grad-interview-tips<p>作为一个毕业快十年的”老”程序员最近被抓壮丁,参加校园招聘作为一、二面的面试官。连续一周的面试有一些感悟,总结一下大家失败的原因,给未来的应届生一些建议和行为指导。</p>
<p><strong>1.不要迟到</strong></p>
<p>迟到的行为非常恶劣,会给人第一印象非常差。另外迟到会让应聘者非常慌张,不利于面试发挥。总之,宁可取消面试也千万不要迟到。</p>
<p><strong>2.要闷头做题</strong></p>
<p>对于工程师的面试总要一项就是写代码,但是千万不要拿到一个题立刻开始写代码,这个情况基本就是Fail了,不管是否写的正确。</p>
<p>原因是你缺少有效沟通,看到一道题要先和面试官确定理解是否正确,输入值的范围(正数/负数) 、是否有序等、是否可以用方法A,时间复杂度的要求、空间复杂度的要求。这些问题都需要逐一的澄清才能往后做。沟通是很重要的技能,这将决定你今后的职业生涯的高度。</p>
<p><strong>3.不要自High</strong></p>
<p>大多数同学基于一个面试官的问题,迫切的希望引入到自己的领地,把准备的面经快速的讲出来。但是没有抓住重点,也许面试官想问的根本不是这个问题。所以保持一个良好的问题澄清习惯,回答之前先确定是否是你心中的问题,然后在进一步回答。</p>
<p>Btw,现在的应届生都很厉害,技术都在伯仲之间。但是还是要做出一些差异性,比如有自己的开源项目是很加分的。</p>作为一个毕业快十年的”老”程序员最近被抓壮丁,参加校园招聘作为一、二面的面试官。连续一周的面试有一些感悟,总结一下大家失败的原因,给未来的应届生一些建议和行为指导。[LeetCode] 269.Alien Dictionary 火星词典2019-09-21T10:58:00+00:002019-09-21T10:58:00+00:00https://xtea.io/coding/2019/09/21/leetcode-269-alien-dictionary<p><strong>Leetcode 269, Alien Dictionary</strong></p>
<p>使用BFS的拓扑排序.</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="kd">class</span> <span class="nc">Solution</span> <span class="o">{</span>
<span class="kd">public</span> <span class="nc">String</span> <span class="nf">alienOrder</span><span class="o">(</span><span class="nc">String</span><span class="o">[]</span> <span class="n">words</span><span class="o">)</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">words</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">||</span> <span class="n">words</span><span class="o">.</span><span class="na">length</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="s">""</span><span class="o">;</span>
<span class="o">}</span>
<span class="c1">// init nodes.</span>
<span class="kt">int</span><span class="o">[]</span> <span class="n">indegree</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="mi">256</span><span class="o">];</span>
<span class="nc">Arrays</span><span class="o">.</span><span class="na">fill</span><span class="o">(</span><span class="n">indegree</span><span class="o">,</span> <span class="o">-</span><span class="mi">1</span><span class="o">);</span>
<span class="nc">Set</span><span class="o"><</span><span class="nc">Character</span><span class="o">>[]</span> <span class="n">edges</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Set</span><span class="o">[</span><span class="mi">256</span><span class="o">];</span>
<span class="n">build</span><span class="o">(</span><span class="n">words</span><span class="o">,</span> <span class="n">indegree</span><span class="o">,</span> <span class="n">edges</span><span class="o">);</span>
<span class="c1">// start bfs.</span>
<span class="nc">Queue</span><span class="o"><</span><span class="nc">Character</span><span class="o">></span> <span class="n">queue</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">LinkedList</span><span class="o">();</span>
<span class="nc">Set</span><span class="o"><</span><span class="nc">Character</span><span class="o">></span> <span class="n">hset</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">HashSet</span><span class="o">();</span>
<span class="k">for</span> <span class="o">(</span><span class="kt">char</span> <span class="n">root</span> <span class="o">:</span> <span class="n">findRoots</span><span class="o">(</span><span class="n">indegree</span><span class="o">))</span> <span class="o">{</span>
<span class="n">queue</span><span class="o">.</span><span class="na">offer</span><span class="o">(</span><span class="n">root</span><span class="o">);</span>
<span class="n">hset</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">root</span><span class="o">);</span>
<span class="o">}</span>
<span class="nc">String</span> <span class="n">ans</span> <span class="o">=</span> <span class="s">""</span><span class="o">;</span>
<span class="k">if</span> <span class="o">(</span><span class="n">queue</span><span class="o">.</span><span class="na">size</span><span class="o">()</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">ans</span><span class="o">;</span>
<span class="o">}</span>
<span class="k">while</span> <span class="o">(</span><span class="n">queue</span><span class="o">.</span><span class="na">size</span><span class="o">()</span> <span class="o">></span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
<span class="kt">char</span> <span class="n">node</span> <span class="o">=</span> <span class="n">queue</span><span class="o">.</span><span class="na">poll</span><span class="o">();</span>
<span class="n">ans</span> <span class="o">+=</span> <span class="n">node</span><span class="o">;</span>
<span class="k">for</span> <span class="o">(</span><span class="kt">char</span> <span class="n">next</span> <span class="o">:</span> <span class="n">edges</span><span class="o">[</span><span class="n">node</span><span class="o">])</span> <span class="o">{</span>
<span class="n">indegree</span><span class="o">[</span><span class="n">next</span><span class="o">]--;</span>
<span class="k">if</span> <span class="o">(</span><span class="n">indegree</span><span class="o">[</span><span class="n">next</span><span class="o">]</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">hset</span><span class="o">.</span><span class="na">contains</span><span class="o">(</span><span class="n">next</span><span class="o">))</span> <span class="o">{</span>
<span class="k">continue</span><span class="o">;</span>
<span class="o">}</span>
<span class="n">queue</span><span class="o">.</span><span class="na">offer</span><span class="o">(</span><span class="n">next</span><span class="o">);</span>
<span class="n">hset</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">next</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="kt">int</span> <span class="n">charCount</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
<span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o"><</span> <span class="mi">256</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">edges</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
<span class="n">charCount</span><span class="o">++;</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="k">if</span> <span class="o">(</span><span class="n">ans</span><span class="o">.</span><span class="na">length</span><span class="o">()</span> <span class="o">!=</span> <span class="n">charCount</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="s">""</span><span class="o">;</span>
<span class="o">}</span>
<span class="k">return</span> <span class="n">ans</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">build</span><span class="o">(</span><span class="nc">String</span><span class="o">[]</span> <span class="n">words</span><span class="o">,</span> <span class="kt">int</span><span class="o">[]</span> <span class="n">indegree</span><span class="o">,</span> <span class="nc">Set</span><span class="o"><</span><span class="nc">Character</span><span class="o">>[]</span> <span class="n">edges</span><span class="o">)</span> <span class="o">{</span>
<span class="c1">// init</span>
<span class="k">for</span> <span class="o">(</span><span class="nc">String</span> <span class="n">word</span> <span class="o">:</span> <span class="n">words</span><span class="o">)</span> <span class="o">{</span>
<span class="k">for</span> <span class="o">(</span><span class="kt">char</span> <span class="n">ch</span> <span class="o">:</span> <span class="n">word</span><span class="o">.</span><span class="na">toCharArray</span><span class="o">())</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">edges</span><span class="o">[</span><span class="n">ch</span><span class="o">]</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
<span class="n">indegree</span><span class="o">[</span><span class="n">ch</span><span class="o">]</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
<span class="n">edges</span><span class="o">[</span><span class="n">ch</span><span class="o">]</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">HashSet</span><span class="o"><</span><span class="nc">Character</span><span class="o">>();</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">words</span><span class="o">.</span><span class="na">length</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
<span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="o">;</span> <span class="n">j</span> <span class="o"><</span> <span class="n">words</span><span class="o">.</span><span class="na">length</span><span class="o">;</span> <span class="n">j</span><span class="o">++)</span> <span class="o">{</span>
<span class="kt">int</span> <span class="n">index</span> <span class="o">=</span> <span class="n">findFirstNonEquals</span><span class="o">(</span><span class="n">words</span><span class="o">[</span><span class="n">i</span><span class="o">],</span> <span class="n">words</span><span class="o">[</span><span class="n">j</span><span class="o">]);</span>
<span class="k">if</span> <span class="o">(</span><span class="n">index</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="o">)</span> <span class="o">{</span>
<span class="k">continue</span><span class="o">;</span>
<span class="o">}</span>
<span class="kt">char</span> <span class="n">from</span> <span class="o">=</span> <span class="n">words</span><span class="o">[</span><span class="n">i</span><span class="o">].</span><span class="na">charAt</span><span class="o">(</span><span class="n">index</span><span class="o">);</span>
<span class="kt">char</span> <span class="n">to</span> <span class="o">=</span> <span class="n">words</span><span class="o">[</span><span class="n">j</span><span class="o">].</span><span class="na">charAt</span><span class="o">(</span><span class="n">index</span><span class="o">);</span>
<span class="c1">// build edges.</span>
<span class="k">if</span> <span class="o">(</span><span class="n">from</span> <span class="o">!=</span> <span class="n">to</span> <span class="o">&&</span> <span class="o">!</span><span class="n">edges</span><span class="o">[</span><span class="n">from</span><span class="o">].</span><span class="na">contains</span><span class="o">(</span><span class="n">to</span><span class="o">))</span> <span class="o">{</span>
<span class="n">edges</span><span class="o">[</span><span class="n">from</span><span class="o">].</span><span class="na">add</span><span class="o">(</span><span class="n">to</span><span class="o">);</span>
<span class="n">indegree</span><span class="o">[</span><span class="n">to</span><span class="o">]++;</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">int</span> <span class="nf">findFirstNonEquals</span><span class="o">(</span><span class="nc">String</span> <span class="n">a</span><span class="o">,</span> <span class="nc">String</span> <span class="n">b</span><span class="o">)</span> <span class="o">{</span>
<span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
<span class="k">while</span> <span class="o">(</span><span class="n">i</span> <span class="o"><</span> <span class="n">a</span><span class="o">.</span><span class="na">length</span><span class="o">()</span> <span class="o">&&</span> <span class="n">i</span> <span class="o"><</span> <span class="n">b</span><span class="o">.</span><span class="na">length</span><span class="o">())</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">a</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="n">i</span><span class="o">)</span> <span class="o">==</span> <span class="n">b</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="n">i</span><span class="o">))</span> <span class="o">{</span>
<span class="n">i</span><span class="o">++;</span>
<span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">i</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="nc">List</span><span class="o"><</span><span class="nc">Character</span><span class="o">></span> <span class="nf">findRoots</span><span class="o">(</span><span class="kt">int</span><span class="o">[]</span> <span class="n">indegree</span><span class="o">)</span> <span class="o">{</span>
<span class="nc">List</span><span class="o"><</span><span class="nc">Character</span><span class="o">></span> <span class="n">roots</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ArrayList</span><span class="o">();</span>
<span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o"><</span> <span class="mi">256</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">indegree</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
<span class="n">roots</span><span class="o">.</span><span class="na">add</span><span class="o">((</span><span class="kt">char</span><span class="o">)</span> <span class="n">i</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="k">return</span> <span class="n">roots</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>Leetcode 269, Alien Dictionary[LeetCode] 505. The Maze II 迷宫II2019-09-07T04:40:00+00:002019-09-07T04:40:00+00:00https://xtea.io/coding/2019/09/07/leetcode-505-the-maze-II<p><strong>Leetcode 505, The MazeII</strong></p>
<p>这个题可以用DFS、BFS或者使用Dijkstra算法,以下是我使用Dijkstra实现。</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">Maze2</span> <span class="o">{</span>
<span class="kd">class</span> <span class="nc">Point</span> <span class="kd">implements</span> <span class="nc">Comparator</span><span class="o"><</span><span class="nc">Point</span><span class="o">></span> <span class="o">{</span>
<span class="kt">int</span> <span class="n">x</span><span class="o">,</span> <span class="n">y</span><span class="o">;</span>
<span class="kt">int</span> <span class="n">distance</span><span class="o">;</span>
<span class="kd">public</span> <span class="nf">Point</span><span class="o">()</span> <span class="o">{</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="nf">Point</span><span class="o">(</span><span class="kt">int</span> <span class="n">x</span><span class="o">,</span> <span class="kt">int</span> <span class="n">y</span><span class="o">,</span> <span class="kt">int</span> <span class="n">distance</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="na">x</span> <span class="o">=</span> <span class="n">x</span><span class="o">;</span>
<span class="k">this</span><span class="o">.</span><span class="na">y</span> <span class="o">=</span> <span class="n">y</span><span class="o">;</span>
<span class="k">this</span><span class="o">.</span><span class="na">distance</span> <span class="o">=</span> <span class="n">distance</span><span class="o">;</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">int</span> <span class="nf">compare</span><span class="o">(</span><span class="nc">Point</span> <span class="n">o1</span><span class="o">,</span> <span class="nc">Point</span> <span class="n">o2</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">o1</span><span class="o">.</span><span class="na">distance</span> <span class="o">-</span> <span class="n">o2</span><span class="o">.</span><span class="na">distance</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">int</span> <span class="nf">shortestDistance</span><span class="o">(</span><span class="kt">int</span><span class="o">[][]</span> <span class="n">maze</span><span class="o">,</span> <span class="kt">int</span><span class="o">[]</span> <span class="n">start</span><span class="o">,</span> <span class="kt">int</span><span class="o">[]</span> <span class="n">destination</span><span class="o">)</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">maze</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">||</span> <span class="n">maze</span><span class="o">.</span><span class="na">length</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="o">;</span>
<span class="o">}</span>
<span class="kt">int</span> <span class="n">m</span> <span class="o">=</span> <span class="n">maze</span><span class="o">.</span><span class="na">length</span><span class="o">;</span>
<span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">maze</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="na">length</span><span class="o">;</span>
<span class="c1">// distanceTo from start to current point.</span>
<span class="kt">int</span><span class="o">[][]</span> <span class="n">distance</span> <span class="o">=</span> <span class="n">initDistance</span><span class="o">(</span><span class="n">m</span><span class="o">,</span> <span class="n">n</span><span class="o">,</span> <span class="n">start</span><span class="o">);</span>
<span class="nc">PriorityQueue</span><span class="o"><</span><span class="nc">Point</span><span class="o">></span> <span class="n">priorityQueue</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">PriorityQueue</span><span class="o"><>(</span><span class="k">new</span> <span class="nc">Point</span><span class="o">());</span>
<span class="c1">// put start to heap.</span>
<span class="n">priorityQueue</span><span class="o">.</span><span class="na">offer</span><span class="o">(</span><span class="k">new</span> <span class="nc">Point</span><span class="o">(</span><span class="n">start</span><span class="o">[</span><span class="mi">0</span><span class="o">],</span> <span class="n">start</span><span class="o">[</span><span class="mi">1</span><span class="o">],</span> <span class="mi">0</span><span class="o">));</span>
<span class="c1">// start bfs.</span>
<span class="k">while</span> <span class="o">(</span><span class="n">priorityQueue</span><span class="o">.</span><span class="na">size</span><span class="o">()</span> <span class="o">></span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
<span class="nc">Point</span> <span class="n">point</span> <span class="o">=</span> <span class="n">priorityQueue</span><span class="o">.</span><span class="na">poll</span><span class="o">();</span>
<span class="nc">List</span><span class="o"><</span><span class="nc">Point</span><span class="o">></span> <span class="n">nextPoints</span> <span class="o">=</span> <span class="n">findNextPoints</span><span class="o">(</span><span class="n">point</span><span class="o">,</span> <span class="n">maze</span><span class="o">);</span>
<span class="k">for</span> <span class="o">(</span><span class="nc">Point</span> <span class="n">np</span> <span class="o">:</span> <span class="n">nextPoints</span><span class="o">)</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">np</span><span class="o">.</span><span class="na">distance</span> <span class="o"><</span> <span class="n">distance</span><span class="o">[</span><span class="n">np</span><span class="o">.</span><span class="na">x</span><span class="o">][</span><span class="n">np</span><span class="o">.</span><span class="na">y</span><span class="o">])</span> <span class="o">{</span>
<span class="n">distance</span><span class="o">[</span><span class="n">np</span><span class="o">.</span><span class="na">x</span><span class="o">][</span><span class="n">np</span><span class="o">.</span><span class="na">y</span><span class="o">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="na">distance</span><span class="o">;</span>
<span class="c1">// put to heap and mark visited.</span>
<span class="n">priorityQueue</span><span class="o">.</span><span class="na">offer</span><span class="o">(</span><span class="n">np</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="c1">// shortest distanceTo from start to destination</span>
<span class="kt">int</span> <span class="n">ans</span> <span class="o">=</span> <span class="n">distance</span><span class="o">[</span><span class="n">destination</span><span class="o">[</span><span class="mi">0</span><span class="o">]][</span><span class="n">destination</span><span class="o">[</span><span class="mi">1</span><span class="o">]];</span>
<span class="k">return</span> <span class="n">ans</span> <span class="o">==</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">MAX_VALUE</span> <span class="o">?</span> <span class="o">-</span><span class="mi">1</span> <span class="o">:</span> <span class="n">ans</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="kt">int</span><span class="o">[][]</span> <span class="nf">initDistance</span><span class="o">(</span><span class="kt">int</span> <span class="n">m</span><span class="o">,</span> <span class="kt">int</span> <span class="n">n</span><span class="o">,</span> <span class="kt">int</span><span class="o">[]</span> <span class="n">start</span><span class="o">)</span> <span class="o">{</span>
<span class="kt">int</span><span class="o">[][]</span> <span class="n">ans</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">m</span><span class="o">][</span><span class="n">n</span><span class="o">];</span>
<span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">m</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
<span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">j</span> <span class="o"><</span> <span class="n">n</span><span class="o">;</span> <span class="n">j</span><span class="o">++)</span> <span class="o">{</span>
<span class="n">ans</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">MAX_VALUE</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="n">ans</span><span class="o">[</span><span class="n">start</span><span class="o">[</span><span class="mi">0</span><span class="o">]][</span><span class="n">start</span><span class="o">[</span><span class="mi">1</span><span class="o">]]</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
<span class="k">return</span> <span class="n">ans</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="nc">List</span><span class="o"><</span><span class="nc">Point</span><span class="o">></span> <span class="nf">findNextPoints</span><span class="o">(</span><span class="nc">Point</span> <span class="n">point</span><span class="o">,</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">maze</span><span class="o">)</span> <span class="o">{</span>
<span class="kt">int</span><span class="o">[][]</span> <span class="n">directions</span> <span class="o">=</span> <span class="o">{</span> <span class="o">{</span><span class="mi">1</span><span class="o">,</span> <span class="mi">0</span><span class="o">},</span> <span class="o">{-</span><span class="mi">1</span><span class="o">,</span> <span class="mi">0</span><span class="o">},</span> <span class="o">{</span><span class="mi">0</span><span class="o">,</span> <span class="mi">1</span><span class="o">},</span> <span class="o">{</span><span class="mi">0</span><span class="o">,</span> <span class="o">-</span><span class="mi">1</span><span class="o">}</span> <span class="o">};</span>
<span class="nc">List</span><span class="o"><</span><span class="nc">Point</span><span class="o">></span> <span class="n">ans</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ArrayList</span><span class="o"><>();</span>
<span class="c1">// go four directions.</span>
<span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">directions</span><span class="o">.</span><span class="na">length</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
<span class="kt">int</span> <span class="n">nx</span> <span class="o">=</span> <span class="n">point</span><span class="o">.</span><span class="na">x</span><span class="o">;</span>
<span class="kt">int</span> <span class="n">ny</span> <span class="o">=</span> <span class="n">point</span><span class="o">.</span><span class="na">y</span><span class="o">;</span>
<span class="kt">int</span> <span class="n">step</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
<span class="c1">// move until next is wall.</span>
<span class="k">while</span> <span class="o">(</span><span class="n">canMove</span><span class="o">(</span><span class="n">nx</span> <span class="o">+</span> <span class="n">directions</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="mi">0</span><span class="o">],</span> <span class="n">ny</span> <span class="o">+</span> <span class="n">directions</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="mi">1</span><span class="o">],</span> <span class="n">maze</span><span class="o">))</span> <span class="o">{</span>
<span class="n">nx</span> <span class="o">+=</span> <span class="n">directions</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="mi">0</span><span class="o">];</span>
<span class="n">ny</span> <span class="o">+=</span> <span class="n">directions</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="mi">1</span><span class="o">];</span>
<span class="n">step</span><span class="o">++;</span>
<span class="o">}</span>
<span class="nc">Point</span> <span class="n">np</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Point</span><span class="o">(</span><span class="n">nx</span><span class="o">,</span> <span class="n">ny</span><span class="o">,</span> <span class="n">point</span><span class="o">.</span><span class="na">distance</span> <span class="o">+</span> <span class="n">step</span><span class="o">);</span>
<span class="n">ans</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">np</span><span class="o">);</span>
<span class="o">}</span>
<span class="k">return</span> <span class="n">ans</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">canMove</span><span class="o">(</span><span class="kt">int</span> <span class="n">x</span><span class="o">,</span> <span class="kt">int</span> <span class="n">y</span><span class="o">,</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">maze</span><span class="o">)</span> <span class="o">{</span>
<span class="kt">int</span> <span class="n">r</span> <span class="o">=</span> <span class="n">maze</span><span class="o">.</span><span class="na">length</span><span class="o">;</span>
<span class="kt">int</span> <span class="n">c</span> <span class="o">=</span> <span class="n">maze</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="na">length</span><span class="o">;</span>
<span class="k">if</span> <span class="o">(</span><span class="n">x</span> <span class="o"><</span> <span class="mi">0</span> <span class="o">||</span> <span class="n">x</span> <span class="o">>=</span> <span class="n">r</span> <span class="o">||</span> <span class="n">y</span> <span class="o"><</span> <span class="mi">0</span> <span class="o">||</span> <span class="n">y</span> <span class="o">>=</span> <span class="n">c</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="kc">false</span><span class="o">;</span>
<span class="o">}</span>
<span class="k">return</span> <span class="n">maze</span><span class="o">[</span><span class="n">x</span><span class="o">][</span><span class="n">y</span><span class="o">]</span> <span class="o">==</span> <span class="mi">0</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>Leetcode 505, The MazeIILeetcode The Maze solution in Java2019-09-05T09:40:00+00:002019-09-05T09:40:00+00:00https://xtea.io/coding/2019/09/05/leetcode-the-maze-solution-in-Java<p><strong>Leetcode 490, The Maze</strong></p>
<p>今天刷了这个题,被饶了很久,原因把 visted 和 wall 这2种情况混淆了。特此留念!</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="kd">class</span> <span class="nc">Solution</span> <span class="o">{</span>
<span class="kt">int</span><span class="o">[][]</span> <span class="n">directions</span> <span class="o">=</span> <span class="o">{</span>
<span class="o">{</span><span class="mi">1</span><span class="o">,</span> <span class="mi">0</span><span class="o">},</span> <span class="o">{-</span><span class="mi">1</span><span class="o">,</span> <span class="mi">0</span><span class="o">},</span> <span class="o">{</span><span class="mi">0</span><span class="o">,</span> <span class="mi">1</span><span class="o">},</span> <span class="o">{</span><span class="mi">0</span><span class="o">,</span> <span class="o">-</span><span class="mi">1</span><span class="o">}</span>
<span class="o">};</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">hasPath</span><span class="o">(</span><span class="kt">int</span><span class="o">[][]</span> <span class="n">maze</span><span class="o">,</span> <span class="kt">int</span><span class="o">[]</span> <span class="n">start</span><span class="o">,</span> <span class="kt">int</span><span class="o">[]</span> <span class="n">destination</span><span class="o">)</span> <span class="o">{</span>
<span class="kt">boolean</span><span class="o">[][]</span> <span class="n">visited</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">boolean</span><span class="o">[</span><span class="n">maze</span><span class="o">.</span><span class="na">length</span><span class="o">][</span><span class="n">maze</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="na">length</span><span class="o">];</span>
<span class="k">return</span> <span class="nf">helper</span><span class="o">(</span><span class="n">maze</span><span class="o">,</span> <span class="n">start</span><span class="o">,</span> <span class="n">destination</span><span class="o">,</span> <span class="n">visited</span><span class="o">);</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">helper</span><span class="o">(</span><span class="kt">int</span><span class="o">[][]</span> <span class="n">maze</span><span class="o">,</span> <span class="kt">int</span><span class="o">[]</span> <span class="n">start</span><span class="o">,</span> <span class="kt">int</span><span class="o">[]</span> <span class="n">destination</span><span class="o">,</span> <span class="kt">boolean</span><span class="o">[][]</span> <span class="n">visited</span><span class="o">)</span> <span class="o">{</span>
<span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="n">start</span><span class="o">[</span><span class="mi">0</span><span class="o">];</span>
<span class="kt">int</span> <span class="n">y</span> <span class="o">=</span> <span class="n">start</span><span class="o">[</span><span class="mi">1</span><span class="o">];</span>
<span class="k">if</span> <span class="o">(!</span><span class="n">canMove</span><span class="o">(</span><span class="n">x</span><span class="o">,</span> <span class="n">y</span><span class="o">,</span> <span class="n">maze</span><span class="o">))</span> <span class="o">{</span>
<span class="k">return</span> <span class="kc">false</span><span class="o">;</span>
<span class="o">}</span>
<span class="n">visited</span><span class="o">[</span><span class="n">x</span><span class="o">][</span><span class="n">y</span><span class="o">]</span> <span class="o">=</span> <span class="kc">true</span><span class="o">;</span>
<span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">directions</span><span class="o">.</span><span class="na">length</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
<span class="kt">int</span> <span class="n">nx</span> <span class="o">=</span> <span class="n">x</span><span class="o">;</span>
<span class="kt">int</span> <span class="n">ny</span> <span class="o">=</span> <span class="n">y</span><span class="o">;</span>
<span class="c1">// move until next is wall.</span>
<span class="k">while</span> <span class="o">(</span><span class="n">canMove</span><span class="o">(</span><span class="n">nx</span> <span class="o">+</span> <span class="n">directions</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="mi">0</span><span class="o">],</span> <span class="n">ny</span> <span class="o">+</span> <span class="n">directions</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="mi">1</span><span class="o">],</span> <span class="n">maze</span><span class="o">))</span> <span class="o">{</span>
<span class="n">nx</span> <span class="o">+=</span> <span class="n">directions</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="mi">0</span><span class="o">];</span>
<span class="n">ny</span> <span class="o">+=</span> <span class="n">directions</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="mi">1</span><span class="o">];</span>
<span class="o">}</span>
<span class="c1">// check if visited.</span>
<span class="k">if</span> <span class="o">(</span><span class="n">visited</span><span class="o">[</span><span class="n">nx</span><span class="o">][</span><span class="n">ny</span><span class="o">])</span> <span class="o">{</span>
<span class="k">continue</span><span class="o">;</span>
<span class="o">}</span>
<span class="c1">// check if find destination</span>
<span class="k">if</span> <span class="o">(</span><span class="n">nx</span> <span class="o">==</span> <span class="n">destination</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span> <span class="o">&&</span> <span class="n">ny</span> <span class="o">==</span> <span class="n">destination</span><span class="o">[</span><span class="mi">1</span><span class="o">])</span> <span class="o">{</span>
<span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
<span class="o">}</span>
<span class="c1">// recursion with new start.</span>
<span class="k">if</span> <span class="o">(</span><span class="n">helper</span><span class="o">(</span><span class="n">maze</span><span class="o">,</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[]{</span><span class="n">nx</span><span class="o">,</span> <span class="n">ny</span><span class="o">},</span> <span class="n">destination</span><span class="o">,</span> <span class="n">visited</span><span class="o">))</span> <span class="o">{</span>
<span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="k">return</span> <span class="kc">false</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">canMove</span><span class="o">(</span><span class="kt">int</span> <span class="n">x</span><span class="o">,</span> <span class="kt">int</span> <span class="n">y</span><span class="o">,</span> <span class="kt">int</span><span class="o">[][]</span> <span class="n">maze</span><span class="o">)</span> <span class="o">{</span>
<span class="kt">int</span> <span class="n">r</span> <span class="o">=</span> <span class="n">maze</span><span class="o">.</span><span class="na">length</span><span class="o">;</span>
<span class="kt">int</span> <span class="n">c</span> <span class="o">=</span> <span class="n">maze</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="na">length</span><span class="o">;</span>
<span class="k">if</span> <span class="o">(</span><span class="n">x</span> <span class="o"><</span> <span class="mi">0</span> <span class="o">||</span> <span class="n">x</span> <span class="o">>=</span> <span class="n">r</span> <span class="o">||</span> <span class="n">y</span> <span class="o"><</span> <span class="mi">0</span> <span class="o">||</span> <span class="n">y</span> <span class="o">>=</span> <span class="n">c</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="kc">false</span><span class="o">;</span>
<span class="o">}</span>
<span class="k">if</span> <span class="o">(</span><span class="n">maze</span><span class="o">[</span><span class="n">x</span><span class="o">][</span><span class="n">y</span><span class="o">]</span> <span class="o">==</span> <span class="mi">1</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="kc">false</span><span class="o">;</span>
<span class="o">}</span>
<span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>Leetcode 490, The MazeLeetcode Integer to English Words solution in Java2019-09-04T09:40:00+00:002019-09-04T09:40:00+00:00https://xtea.io/coding/2019/09/04/leetcode-Integer-to-English-Words-Solution<p><strong>Leetcode 273, Integer to English Words</strong></p>
<p>总体的思路:分治, 每三个数字当成一组处理,这样方便增加单位。</p>
<p>有很多细节需要考虑,比如0的时候,另外:11 - 19 这个范围需要特殊处理。</p>
<p><em>PS: 说实话,如果面试遇到这类问题并且之前没有做过,那就等着跪吧。</em></p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="kd">class</span> <span class="nc">Solution</span> <span class="o">{</span>
<span class="kd">private</span> <span class="nc">String</span><span class="o">[]</span> <span class="n">oneMap</span> <span class="o">=</span> <span class="o">{</span><span class="s">"One"</span><span class="o">,</span> <span class="s">"Two"</span><span class="o">,</span> <span class="s">"Three"</span><span class="o">,</span> <span class="s">"Four"</span><span class="o">,</span> <span class="s">"Five"</span><span class="o">,</span> <span class="s">"Six"</span><span class="o">,</span> <span class="s">"Seven"</span><span class="o">,</span> <span class="s">"Eight"</span><span class="o">,</span> <span class="s">"Nine"</span><span class="o">};</span>
<span class="kd">private</span> <span class="nc">String</span><span class="o">[]</span> <span class="n">n10Map</span> <span class="o">=</span> <span class="o">{</span><span class="s">"Ten"</span><span class="o">,</span> <span class="s">"Eleven"</span><span class="o">,</span> <span class="s">"Twelve"</span><span class="o">,</span> <span class="s">"Thirteen"</span><span class="o">,</span> <span class="s">"Fourteen"</span><span class="o">,</span> <span class="s">"Fifteen"</span><span class="o">,</span> <span class="s">"Sixteen"</span><span class="o">,</span> <span class="s">"Seventeen"</span><span class="o">,</span> <span class="s">"Eighteen"</span><span class="o">,</span> <span class="s">"Nineteen"</span><span class="o">};</span>
<span class="kd">private</span> <span class="nc">String</span><span class="o">[]</span> <span class="n">n20Map</span> <span class="o">=</span> <span class="o">{</span><span class="s">"Twenty"</span><span class="o">,</span> <span class="s">"Thirty"</span><span class="o">,</span> <span class="s">"Forty"</span><span class="o">,</span> <span class="s">"Fifty"</span><span class="o">,</span> <span class="s">"Sixty"</span><span class="o">,</span> <span class="s">"Seventy"</span><span class="o">,</span> <span class="s">"Eighty"</span><span class="o">,</span> <span class="s">"Ninety"</span><span class="o">};</span>
<span class="kd">public</span> <span class="nc">String</span> <span class="nf">numberToWords</span><span class="o">(</span><span class="kt">int</span> <span class="n">num</span><span class="o">)</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">num</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="s">"Zero"</span><span class="o">;</span>
<span class="o">}</span>
<span class="nc">List</span><span class="o"><</span><span class="nc">String</span><span class="o">></span> <span class="n">ans</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ArrayList</span><span class="o">();</span>
<span class="nc">String</span><span class="o">[]</span> <span class="n">units</span> <span class="o">=</span> <span class="o">{</span><span class="s">"Thousand"</span><span class="o">,</span> <span class="s">"Million"</span><span class="o">,</span> <span class="s">"Billion"</span><span class="o">};</span>
<span class="kt">int</span> <span class="n">unitIndex</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="o">;</span>
<span class="k">while</span> <span class="o">(</span><span class="n">num</span> <span class="o">></span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">num</span> <span class="o">%</span> <span class="mi">1000</span> <span class="o">!=</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
<span class="nc">String</span> <span class="n">nums</span> <span class="o">=</span> <span class="n">toWords</span><span class="o">(</span><span class="n">num</span> <span class="o">%</span> <span class="mi">1000</span><span class="o">);</span>
<span class="k">if</span> <span class="o">(</span><span class="n">unitIndex</span> <span class="o">>=</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
<span class="n">ans</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">units</span><span class="o">[</span><span class="n">unitIndex</span><span class="o">]);</span>
<span class="o">}</span>
<span class="n">ans</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">nums</span><span class="o">);</span>
<span class="o">}</span>
<span class="n">num</span> <span class="o">/=</span> <span class="mi">1000</span><span class="o">;</span>
<span class="n">unitIndex</span><span class="o">++;</span>
<span class="o">}</span>
<span class="k">return</span> <span class="nf">toResultString</span><span class="o">(</span><span class="n">ans</span><span class="o">);</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="nc">String</span> <span class="nf">toWords</span><span class="o">(</span><span class="kt">int</span> <span class="n">num</span><span class="o">)</span> <span class="o">{</span>
<span class="nc">String</span> <span class="n">snum</span> <span class="o">=</span> <span class="nc">String</span><span class="o">.</span><span class="na">valueOf</span><span class="o">(</span><span class="n">num</span><span class="o">);</span>
<span class="k">if</span> <span class="o">(</span><span class="n">snum</span><span class="o">.</span><span class="na">length</span><span class="o">()</span> <span class="o">==</span> <span class="mi">1</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="nf">oneNumber</span><span class="o">(</span><span class="n">num</span><span class="o">);</span>
<span class="o">}</span> <span class="k">else</span> <span class="k">if</span> <span class="o">(</span><span class="n">snum</span><span class="o">.</span><span class="na">length</span><span class="o">()</span> <span class="o">==</span> <span class="mi">2</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="nf">twoNumber</span><span class="o">(</span><span class="n">num</span><span class="o">);</span>
<span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
<span class="kt">int</span> <span class="n">kOfNum</span> <span class="o">=</span> <span class="n">snum</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">0</span><span class="o">)</span> <span class="o">-</span> <span class="sc">'0'</span><span class="o">;</span>
<span class="nc">String</span> <span class="n">ans</span> <span class="o">=</span> <span class="n">oneNumber</span><span class="o">(</span><span class="n">kOfNum</span><span class="o">);</span>
<span class="k">if</span> <span class="o">(</span><span class="n">ans</span><span class="o">.</span><span class="na">length</span><span class="o">()</span> <span class="o">></span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
<span class="n">ans</span> <span class="o">+=</span> <span class="s">" Hundred"</span><span class="o">;</span>
<span class="o">}</span>
<span class="nc">String</span> <span class="n">tw</span> <span class="o">=</span> <span class="n">twoNumber</span><span class="o">(</span><span class="nc">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">snum</span><span class="o">.</span><span class="na">substring</span><span class="o">(</span><span class="mi">1</span><span class="o">)));</span>
<span class="k">return</span> <span class="n">tw</span><span class="o">.</span><span class="na">length</span><span class="o">()</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">?</span> <span class="n">ans</span> <span class="o">:</span> <span class="n">ans</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="n">tw</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="nc">String</span> <span class="nf">oneNumber</span><span class="o">(</span><span class="kt">int</span> <span class="n">n</span><span class="o">)</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">n</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="s">""</span><span class="o">;</span>
<span class="o">}</span>
<span class="k">return</span> <span class="n">oneMap</span><span class="o">[</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="o">];</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="nc">String</span> <span class="nf">twoNumber</span><span class="o">(</span><span class="kt">int</span> <span class="n">n</span><span class="o">)</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">n</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="s">""</span><span class="o">;</span>
<span class="o">}</span>
<span class="k">if</span> <span class="o">(</span><span class="n">n</span> <span class="o"><</span> <span class="mi">10</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="nf">oneNumber</span><span class="o">(</span><span class="n">n</span><span class="o">);</span>
<span class="o">}</span>
<span class="k">if</span> <span class="o">(</span><span class="n">n</span> <span class="o"><</span> <span class="mi">20</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">n10Map</span><span class="o">[</span><span class="n">n</span> <span class="o">-</span> <span class="mi">10</span><span class="o">];</span>
<span class="o">}</span>
<span class="nc">String</span> <span class="n">ans</span> <span class="o">=</span> <span class="n">n20Map</span><span class="o">[</span><span class="n">n</span> <span class="o">/</span> <span class="mi">10</span> <span class="o">-</span> <span class="mi">2</span><span class="o">];</span>
<span class="nc">String</span> <span class="n">last</span> <span class="o">=</span> <span class="n">oneNumber</span><span class="o">(</span><span class="n">n</span> <span class="o">%</span> <span class="mi">10</span><span class="o">);</span>
<span class="k">if</span> <span class="o">(</span><span class="n">last</span><span class="o">.</span><span class="na">length</span><span class="o">()</span> <span class="o">></span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">ans</span> <span class="o">+</span> <span class="s">" "</span> <span class="o">+</span> <span class="n">last</span><span class="o">;</span>
<span class="o">}</span>
<span class="k">return</span> <span class="n">ans</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="nc">String</span> <span class="nf">toResultString</span><span class="o">(</span><span class="nc">List</span><span class="o"><</span><span class="nc">String</span><span class="o">></span> <span class="n">ans</span><span class="o">)</span> <span class="o">{</span>
<span class="nc">StringBuffer</span> <span class="n">sb</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">StringBuffer</span><span class="o">();</span>
<span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">ans</span><span class="o">.</span><span class="na">size</span><span class="o">()</span> <span class="o">-</span> <span class="mi">1</span><span class="o">;</span> <span class="n">i</span> <span class="o">>=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span><span class="o">--)</span> <span class="o">{</span>
<span class="n">sb</span><span class="o">.</span><span class="na">append</span><span class="o">(</span><span class="n">ans</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">i</span><span class="o">)</span> <span class="o">+</span> <span class="s">" "</span><span class="o">);</span>
<span class="o">}</span>
<span class="k">return</span> <span class="n">sb</span><span class="o">.</span><span class="na">toString</span><span class="o">().</span><span class="na">trim</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>Leetcode 273, Integer to English WordsCodility flags solution in Java2019-09-03T02:40:00+00:002019-09-03T02:40:00+00:00https://xtea.io/coding/2019/09/03/codility-flags-solution-java<p>本文来源于Codility 的一道题目.<a href="https://app.codility.com/programmers/lessons/10-prime_and_composite_numbers/flags/">原题传送门</a></p>
<h3 id="question">Question</h3>
<p>在给定一个数组中,存在0 - k个peak节点(值大于左右2个邻居的), 目标是将旗子放到peak的位置,并且两个peak的距离(下标差)必须大于等于总旗子数量。</p>
<h3 id="brute-force">Brute Force</h3>
<p>先从简单的方案入手,要想知道最多能插入旗子的数量,总共需要2个步骤:</p>
<ol>
<li>找到数组所有peak, 放入 peak_list.</li>
<li>依次从1到size(peak_list) 尝试是否能够放入指定的旗子.</li>
</ol>
<p>这个过程可以用以下伪代码来代替,但是注意这只是第一步,还没到正式开始写代码的阶段。</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="kd">public</span> <span class="kt">int</span> <span class="nf">solution</span><span class="o">(</span><span class="kt">int</span><span class="o">[]</span> <span class="no">A</span><span class="o">)</span> <span class="o">{</span>
<span class="nc">List</span><span class="o"><</span><span class="nc">Integer</span><span class="o">></span> <span class="n">peaks</span> <span class="o">=</span> <span class="n">getAllPeaks</span><span class="o">(</span><span class="no">A</span><span class="o">);</span>
<span class="kt">int</span> <span class="n">ans</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
<span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">peak</span><span class="o">.</span><span class="na">size</span><span class="o">();</span> <span class="n">i</span> <span class="o">++)</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">canPutFlags</span><span class="o">(</span><span class="n">peaks</span><span class="o">,</span> <span class="n">i</span><span class="o">))</span> <span class="o">{</span>
<span class="n">ans</span> <span class="o">=</span> <span class="n">i</span><span class="o">;</span>
<span class="o">}</span><span class="k">else</span><span class="o">{</span>
<span class="k">break</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="k">return</span> <span class="n">ans</span><span class="o">;</span>
<span class="o">}</span>
</code></pre></div></div>
<p>其中<code class="language-plaintext highlighter-rouge">canPutFlags</code>方法可以依次遍历全有的peak, 判断具体是否满足,如果满足则可以放入旗子。最后判断放入的总旗子是否满足条件。</p>
<p>时间复杂度: <code class="language-plaintext highlighter-rouge">O(N) + O(N) * O(N) = O(N^2)</code></p>
<h3 id="optimize">Optimize</h3>
<p>整个程序瓶颈在于第二阶段,寻找最大旗子的过程。那么我们看下是否能够优化呢?</p>
<p>尝试寻找规律,如果存在满足条件旗子数为<code class="language-plaintext highlighter-rouge">K</code>,那么<code class="language-plaintext highlighter-rouge">K - 1</code> 也一定满足。因此可以使用二分法来减少每次搜索的数量。</p>
<p>尝试从中间位置 MID = PEAK_SIZE / 2,分为2种情况:</p>
<ol>
<li>如果MID满足,则0 - MID全部满足条件,无需搜索。</li>
<li>如果MID不满足,则MID - PEAK_SIZE全部不满足,无需搜索。</li>
</ol>
<p>现在我们的代码变成:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="kd">public</span> <span class="kt">int</span> <span class="nf">solution</span><span class="o">(</span><span class="kt">int</span><span class="o">[]</span> <span class="no">A</span><span class="o">)</span> <span class="o">{</span>
<span class="nc">List</span><span class="o"><</span><span class="nc">Integer</span><span class="o">></span> <span class="n">peaks</span> <span class="o">=</span> <span class="n">getAllPeaks</span><span class="o">(</span><span class="no">A</span><span class="o">);</span>
<span class="k">return</span> <span class="nf">binarySearch</span><span class="o">(</span><span class="n">peaks</span><span class="o">,</span> <span class="mi">1</span><span class="o">,</span> <span class="n">peaks</span><span class="o">.</span><span class="na">size</span><span class="o">());;</span>
<span class="o">}</span>
</code></pre></div></div>
<p>时间复杂度: <code class="language-plaintext highlighter-rouge">O(N) + O(N) * O(N * log(N)) = O(N * log(N))</code></p>
<p>总体的复杂度下降了一个量级,下面开始真正写代码.</p>
<h3 id="implement">Implement</h3>
<p>一般来说我们最好将代码按照模块化的方式拆分成若干函数,这样做虽然代码量变多,但是好处多多。</p>
<ul>
<li>可读性好</li>
<li>扩展性更好</li>
<li>易于测试、问题定位</li>
<li>实现简单,只需要专注在一个小问题上。</li>
</ul>
<p>PS:面试时间不够,可以抓大放小,简单的方法和面试官说一下思路。</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c1">// you can also use imports, for example:</span>
<span class="kn">import</span> <span class="nn">java.util.*</span><span class="o">;</span>
<span class="c1">// you can write to stdout for debugging purposes, e.g.</span>
<span class="c1">// System.out.println("this is a debug message");</span>
<span class="kd">class</span> <span class="nc">Solution</span> <span class="o">{</span>
<span class="kd">public</span> <span class="kt">int</span> <span class="nf">solution</span><span class="o">(</span><span class="kt">int</span><span class="o">[]</span> <span class="no">A</span><span class="o">)</span> <span class="o">{</span>
<span class="c1">// write your code in Java SE 8</span>
<span class="k">if</span> <span class="o">(</span><span class="no">A</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">||</span> <span class="no">A</span><span class="o">.</span><span class="na">length</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="mi">0</span><span class="o">;</span>
<span class="o">}</span>
<span class="c1">// 1. find all peaks.</span>
<span class="nc">List</span><span class="o"><</span><span class="nc">Integer</span><span class="o">></span> <span class="n">peaks</span> <span class="o">=</span> <span class="n">getAllPeaks</span><span class="o">(</span><span class="no">A</span><span class="o">);</span>
<span class="c1">// find max flags, range from 1 - k</span>
<span class="c1">// 2. binary search.</span>
<span class="k">return</span> <span class="nf">binarySearch</span><span class="o">(</span><span class="n">peaks</span><span class="o">);</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="nc">List</span><span class="o"><</span><span class="nc">Integer</span><span class="o">></span> <span class="nf">getAllPeaks</span><span class="o">(</span><span class="kt">int</span><span class="o">[]</span> <span class="no">A</span><span class="o">)</span> <span class="o">{</span>
<span class="nc">List</span><span class="o"><</span><span class="nc">Integer</span><span class="o">></span> <span class="n">peaks</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ArrayList</span><span class="o">();</span>
<span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span> <span class="n">i</span> <span class="o"><</span> <span class="no">A</span><span class="o">.</span><span class="na">length</span> <span class="o">-</span> <span class="mi">1</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="no">A</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">></span> <span class="no">A</span><span class="o">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="o">]</span> <span class="o">&&</span> <span class="no">A</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">></span> <span class="no">A</span><span class="o">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="o">])</span> <span class="o">{</span>
<span class="n">peaks</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">i</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="k">return</span> <span class="n">peaks</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="nc">Integer</span> <span class="nf">binarySearch</span><span class="o">(</span><span class="nc">List</span><span class="o"><</span><span class="nc">Integer</span><span class="o">></span> <span class="n">peaks</span><span class="o">)</span> <span class="o">{</span>
<span class="kt">int</span> <span class="n">begin</span> <span class="o">=</span> <span class="mi">1</span><span class="o">,</span> <span class="n">end</span> <span class="o">=</span> <span class="n">peaks</span><span class="o">.</span><span class="na">size</span><span class="o">();</span>
<span class="k">while</span> <span class="o">(</span><span class="n">begin</span> <span class="o">+</span> <span class="mi">1</span> <span class="o"><</span> <span class="n">end</span><span class="o">)</span> <span class="o">{</span>
<span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="n">begin</span> <span class="o">+</span> <span class="o">(</span><span class="n">end</span> <span class="o">-</span> <span class="n">begin</span><span class="o">)</span> <span class="o">/</span> <span class="mi">2</span><span class="o">;</span>
<span class="k">if</span> <span class="o">(</span><span class="n">canPutFlags</span><span class="o">(</span><span class="n">peaks</span><span class="o">,</span> <span class="n">mid</span><span class="o">))</span> <span class="o">{</span>
<span class="n">begin</span> <span class="o">=</span> <span class="n">mid</span><span class="o">;</span>
<span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
<span class="n">end</span> <span class="o">=</span> <span class="n">mid</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="k">if</span> <span class="o">(</span><span class="n">canPutFlags</span><span class="o">(</span><span class="n">peaks</span><span class="o">,</span> <span class="n">end</span><span class="o">))</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">end</span><span class="o">;</span>
<span class="o">}</span>
<span class="k">if</span> <span class="o">(</span><span class="n">canPutFlags</span><span class="o">(</span><span class="n">peaks</span><span class="o">,</span> <span class="n">begin</span><span class="o">))</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">begin</span><span class="o">;</span>
<span class="o">}</span>
<span class="k">return</span> <span class="mi">0</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">canPutFlags</span><span class="o">(</span><span class="nc">List</span><span class="o"><</span><span class="nc">Integer</span><span class="o">></span> <span class="n">peaks</span><span class="o">,</span> <span class="kt">int</span> <span class="n">flags</span><span class="o">)</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">peaks</span><span class="o">.</span><span class="na">size</span><span class="o">()</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="kc">false</span><span class="o">;</span>
<span class="o">}</span>
<span class="kt">int</span> <span class="n">lastIndex</span> <span class="o">=</span> <span class="n">peaks</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span>
<span class="kt">int</span> <span class="n">usedFlags</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span>
<span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">p</span> <span class="o">=</span> <span class="mi">1</span><span class="o">;</span> <span class="n">p</span> <span class="o"><</span> <span class="n">peaks</span><span class="o">.</span><span class="na">size</span><span class="o">();</span> <span class="n">p</span><span class="o">++)</span> <span class="o">{</span>
<span class="kt">int</span> <span class="n">pIndex</span> <span class="o">=</span> <span class="n">peaks</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">p</span><span class="o">);</span>
<span class="k">if</span> <span class="o">(</span><span class="n">pIndex</span> <span class="o">-</span> <span class="n">lastIndex</span> <span class="o">>=</span> <span class="n">flags</span><span class="o">)</span> <span class="o">{</span>
<span class="n">usedFlags</span><span class="o">++;</span>
<span class="n">lastIndex</span> <span class="o">=</span> <span class="n">pIndex</span><span class="o">;</span>
<span class="o">}</span>
<span class="k">if</span> <span class="o">(</span><span class="n">usedFlags</span> <span class="o">==</span> <span class="n">flags</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="c1">// ensure only one peek.</span>
<span class="k">return</span> <span class="n">usedFlags</span> <span class="o">==</span> <span class="n">flags</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<h3 id="test">Test</h3>
<p>设计一些极端的case,避免产生corner case,例如:</p>
<ul>
<li>没有peak</li>
<li>只有1个peak</li>
<li>peak 的距离间隔为1</li>
<li>…</li>
</ul>
<h3 id="总结">总结</h3>
<p>结果查看: <a href="https://app.codility.com/demo/results/trainingKNHF4F-8UV/">https://app.codility.com/demo/results/trainingKNHF4F-8UV/</a></p>本文来源于Codility 的一道题目.原题传送门Hello world!2019-08-29T08:54:57+00:002019-08-29T08:54:57+00:00https://xtea.io/other/2019/08/29/hello-world<p>博客开篇,还是用程序员的习惯写一个HELLO WORLD, 未来期望用文字来记录自己的一些思考。</p>
<p>主要还是专注在技术领域,如果能够帮助别人那更是再好不过。</p>
<p><strong>世界很美好,加油吧!</strong></p>博客开篇,还是用程序员的习惯写一个HELLO WORLD, 未来期望用文字来记录自己的一些思考。