<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://xtea.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://xtea.io/" rel="alternate" type="text/html" /><updated>2026-02-28T23:37:02+00:00</updated><id>https://xtea.io/feed.xml</id><title type="html">Li Xiaomeng’s  Blog</title><subtitle>Coding | Design | Thinking. 醉里挑灯看剑，梦回吹角连营。</subtitle><entry><title type="html">30分钟入门Swift语言简明教程</title><link href="https://xtea.io/tools/2020/04/06/learn-swift-programing.html" rel="alternate" type="text/html" title="30分钟入门Swift语言简明教程" /><published>2020-04-06T02:40:00+00:00</published><updated>2020-04-06T02:40:00+00:00</updated><id>https://xtea.io/tools/2020/04/06/learn-swift-programing</id><content type="html" xml:base="https://xtea.io/tools/2020/04/06/learn-swift-programing.html"><![CDATA[<p>作为一个有多年编程经验的熟练工程师，学习一门新语言的成本应该是非常低的。下面我将学习swift语言的过程记录下来，及帮助自己做个笔记，也帮助swift新手们尝鲜。</p>

<h2 id="学以致用">学以致用</h2>

<p>首先要时刻铭记，学习的目的就是为了在实践中应用，要带着问题和目的去学习，而不是为了学习而学习。</p>

<p>根据我的经验，最好的学习路径应该是：
<strong>学习 -&gt; 实践 -&gt; 遇到问题 -&gt; 学习 -&gt; 实践 …</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 

// &amp;&amp; = 与 ， || = 或
if a  &lt; 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>]]></content><author><name></name></author><category term="tools" /><category term="swift" /><category term="简要教程" /><summary type="html"><![CDATA[X分钟学习swift简要语言教程]]></summary></entry><entry><title type="html">创建一个电报账号群组搜索引擎</title><link href="https://xtea.io/tools/2020/01/01/telegram-search.html" rel="alternate" type="text/html" title="创建一个电报账号群组搜索引擎" /><published>2020-01-01T04:40:00+00:00</published><updated>2020-01-01T04:40:00+00:00</updated><id>https://xtea.io/tools/2020/01/01/telegram-search</id><content type="html" xml:base="https://xtea.io/tools/2020/01/01/telegram-search.html"><![CDATA[<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>]]></content><author><name></name></author><category term="tools" /><category term="telegram" /><category term="搜索" /><summary type="html"><![CDATA[只需要1分钟教会你如何构建一个电报账号群组搜索引擎]]></summary></entry><entry><title type="html">应届生面试不要做这3件事</title><link href="https://xtea.io/interview/2019/09/24/for-new-grad-interview-tips.html" rel="alternate" type="text/html" title="应届生面试不要做这3件事" /><published>2019-09-24T09:50:00+00:00</published><updated>2019-09-24T09:50:00+00:00</updated><id>https://xtea.io/interview/2019/09/24/for-new-grad-interview-tips</id><content type="html" xml:base="https://xtea.io/interview/2019/09/24/for-new-grad-interview-tips.html"><![CDATA[<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>]]></content><author><name></name></author><category term="interview" /><category term="interview" /><summary type="html"><![CDATA[应届生面试不要做这几件事]]></summary></entry><entry><title type="html">[LeetCode] 269.Alien Dictionary 火星词典</title><link href="https://xtea.io/coding/2019/09/21/leetcode-269-alien-dictionary.html" rel="alternate" type="text/html" title="[LeetCode] 269.Alien Dictionary 火星词典" /><published>2019-09-21T10:58:00+00:00</published><updated>2019-09-21T10:58:00+00:00</updated><id>https://xtea.io/coding/2019/09/21/leetcode-269-alien-dictionary</id><content type="html" xml:base="https://xtea.io/coding/2019/09/21/leetcode-269-alien-dictionary.html"><![CDATA[<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">&lt;</span><span class="nc">Character</span><span class="o">&gt;[]</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">&lt;</span><span class="nc">Character</span><span class="o">&gt;</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">&lt;</span><span class="nc">Character</span><span class="o">&gt;</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">&gt;</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">&lt;</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">&lt;</span><span class="nc">Character</span><span class="o">&gt;[]</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">&lt;</span><span class="nc">Character</span><span class="o">&gt;();</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">&lt;</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">&lt;</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">&amp;&amp;</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">&lt;</span> <span class="n">a</span><span class="o">.</span><span class="na">length</span><span class="o">()</span> <span class="o">&amp;&amp;</span> <span class="n">i</span> <span class="o">&lt;</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">&lt;</span><span class="nc">Character</span><span class="o">&gt;</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">&lt;</span><span class="nc">Character</span><span class="o">&gt;</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">&lt;</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>]]></content><author><name></name></author><category term="coding" /><category term="coding" /><category term="leetcode" /><category term="leetcode269" /><summary type="html"><![CDATA[269.Alien Dictionary 火星词典]]></summary></entry><entry><title type="html">[LeetCode] 505. The Maze II 迷宫II</title><link href="https://xtea.io/coding/2019/09/07/leetcode-505-the-maze-II.html" rel="alternate" type="text/html" title="[LeetCode] 505. The Maze II 迷宫II" /><published>2019-09-07T04:40:00+00:00</published><updated>2019-09-07T04:40:00+00:00</updated><id>https://xtea.io/coding/2019/09/07/leetcode-505-the-maze-II</id><content type="html" xml:base="https://xtea.io/coding/2019/09/07/leetcode-505-the-maze-II.html"><![CDATA[<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">&lt;</span><span class="nc">Point</span><span class="o">&gt;</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">&lt;</span><span class="nc">Point</span><span class="o">&gt;</span> <span class="n">priorityQueue</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">PriorityQueue</span><span class="o">&lt;&gt;(</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">&gt;</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">&lt;</span><span class="nc">Point</span><span class="o">&gt;</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">&lt;</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">&lt;</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">&lt;</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">&lt;</span><span class="nc">Point</span><span class="o">&gt;</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">&lt;</span><span class="nc">Point</span><span class="o">&gt;</span> <span class="n">ans</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ArrayList</span><span class="o">&lt;&gt;();</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">&lt;</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">&lt;</span> <span class="mi">0</span> <span class="o">||</span> <span class="n">x</span> <span class="o">&gt;=</span> <span class="n">r</span> <span class="o">||</span> <span class="n">y</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="o">||</span> <span class="n">y</span> <span class="o">&gt;=</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>]]></content><author><name></name></author><category term="coding" /><category term="coding" /><category term="leetcode" /><category term="leetcode505" /><summary type="html"><![CDATA[The Maze II 迷宫II Java 实现]]></summary></entry><entry><title type="html">Leetcode The Maze solution in Java</title><link href="https://xtea.io/coding/2019/09/05/leetcode-the-maze-solution-in-Java.html" rel="alternate" type="text/html" title="Leetcode The Maze solution in Java" /><published>2019-09-05T09:40:00+00:00</published><updated>2019-09-05T09:40:00+00:00</updated><id>https://xtea.io/coding/2019/09/05/leetcode-the-maze-solution-in-Java</id><content type="html" xml:base="https://xtea.io/coding/2019/09/05/leetcode-the-maze-solution-in-Java.html"><![CDATA[<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">&lt;</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">&amp;&amp;</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">&lt;</span> <span class="mi">0</span> <span class="o">||</span> <span class="n">x</span> <span class="o">&gt;=</span> <span class="n">r</span> <span class="o">||</span> <span class="n">y</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="o">||</span> <span class="n">y</span> <span class="o">&gt;=</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>]]></content><author><name></name></author><category term="coding" /><category term="coding" /><category term="leetcode" /><category term="leetcode490" /><summary type="html"><![CDATA[Leetcode maze solution in Java]]></summary></entry><entry><title type="html">Leetcode Integer to English Words solution in Java</title><link href="https://xtea.io/coding/2019/09/04/leetcode-Integer-to-English-Words-Solution.html" rel="alternate" type="text/html" title="Leetcode Integer to English Words solution in Java" /><published>2019-09-04T09:40:00+00:00</published><updated>2019-09-04T09:40:00+00:00</updated><id>https://xtea.io/coding/2019/09/04/leetcode-Integer-to-English-Words-Solution</id><content type="html" xml:base="https://xtea.io/coding/2019/09/04/leetcode-Integer-to-English-Words-Solution.html"><![CDATA[<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">&lt;</span><span class="nc">String</span><span class="o">&gt;</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">&gt;</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">&gt;=</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">&gt;</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">&lt;</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">&lt;</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">&gt;</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">&lt;</span><span class="nc">String</span><span class="o">&gt;</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">&gt;=</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>]]></content><author><name></name></author><category term="coding" /><category term="coding" /><category term="leetcode" /><category term="leetcode273" /><summary type="html"><![CDATA[Integer to English Words solution in Java leetcode273]]></summary></entry><entry><title type="html">Codility flags solution in Java</title><link href="https://xtea.io/coding/2019/09/03/codility-flags-solution-java.html" rel="alternate" type="text/html" title="Codility flags solution in Java" /><published>2019-09-03T02:40:00+00:00</published><updated>2019-09-03T02:40:00+00:00</updated><id>https://xtea.io/coding/2019/09/03/codility-flags-solution-java</id><content type="html" xml:base="https://xtea.io/coding/2019/09/03/codility-flags-solution-java.html"><![CDATA[<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">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</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">&lt;</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">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</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">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</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">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</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">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</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">&lt;</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">&gt;</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">&amp;&amp;</span> <span class="no">A</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">&gt;</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">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</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">&lt;</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">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</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">&lt;</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">&gt;=</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>]]></content><author><name></name></author><category term="coding" /><category term="coding" /><category term="codility" /><category term="leetcode" /><category term="flags" /><summary type="html"><![CDATA[Codility Flag 题解，java版本]]></summary></entry><entry><title type="html">Hello world!</title><link href="https://xtea.io/other/2019/08/29/hello-world.html" rel="alternate" type="text/html" title="Hello world!" /><published>2019-08-29T08:54:57+00:00</published><updated>2019-08-29T08:54:57+00:00</updated><id>https://xtea.io/other/2019/08/29/hello-world</id><content type="html" xml:base="https://xtea.io/other/2019/08/29/hello-world.html"><![CDATA[<p>博客开篇，还是用程序员的习惯写一个HELLO WORLD， 未来期望用文字来记录自己的一些思考。</p>

<p>主要还是专注在技术领域，如果能够帮助别人那更是再好不过。</p>

<p><strong>世界很美好，加油吧！</strong></p>]]></content><author><name></name></author><category term="Other" /><summary type="html"><![CDATA[博客开篇，还是用程序员的习惯写一个HELLO WORLD， 未来期望用文字来记录自己的一些思考。]]></summary></entry></feed>