<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>arth (Cangz)</title>
    <link>https://ruby-china.org/arth</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>Matz 真得要来参加 Ruby Summit 了， 10月13日 郑州见！</title>
      <description>&lt;p&gt;今年 Ruby Conf 停办（姜-san 说放到 2019 年办，但 2019 年不会举办两次 RubyConf，所以就是要停办一年），然后强-san 组织了 Ruby Summit。
但有很多不了解强生的情况，管理员也做了特别说明。我也是吃瓜群众之一，不知详情。&lt;/p&gt;

&lt;p&gt;看到强生邀请了 Matz 参加本次 Summit，将信将疑，我在 Tvviter 上向 Matz 本人求证了一下。
发英文未得到答复，后发日语推文，Matz 肯定表示“Yes”。&lt;/p&gt;

&lt;p&gt;那么，我们郑州见吧！&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/e5d70e74-1b5d-4931-aa9d-e87de87cc843.png!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>arth</author>
      <pubDate>Fri, 31 Aug 2018 18:54:54 +0800</pubDate>
      <link>https://ruby-china.org/topics/37417</link>
      <guid>https://ruby-china.org/topics/37417</guid>
    </item>
    <item>
      <title>刷题的几个实用建议</title>
      <description>&lt;p&gt;随着秋招热度的减退，下一季准备求职的同学已经开始着手刷算法题夯基础了。下面提供一些 tips，希望对刷题的朋友有帮助。&lt;/p&gt;

&lt;p&gt;一、明确输入输出&lt;/p&gt;

&lt;p&gt;包括 1) 明确数据类型 or null；2）取值范围（如数字是否为正整数);  3) corner case&lt;/p&gt;

&lt;p&gt;拿到题目后，先明确输入输出类型，并考虑几个典型的 case 以便于分析。有思路之后，需要考虑潜在 corner case。
Leetcode 上的 word break 一题，如果考虑不到字符串为"wwwwwwwwww.....wwwwwwwwwww"，字典为 ['w','ww',...,'wwwwwwww...w'] 的情形，直接搜索会导致中间状态过多而超时。&lt;/p&gt;

&lt;p&gt;二、尽情使用 map, reduce, select, reject&lt;/p&gt;

&lt;p&gt;能使用 map, reduce, select, reject 就尽量避免 nums.each, x.times do 类型的迭代。这会帮你精简大量的无效代码并减少踩坑。
下面是一个对树进行层序遍历的例子。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;level_order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;any?&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ss"&gt;:val&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map!&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;right&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;compact&lt;/span&gt; &lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;flatten!&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="n"&gt;result&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;三、把分支语句尽可能提取出循环体，减少执行开销。&lt;/p&gt;

&lt;p&gt;有一个同学曾这样写一个关于链表的解法：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;method_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;new_head&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;
&lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;head&lt;/span&gt;
&lt;span class="n"&gt;last_node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kp"&gt;nil&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;
    &lt;span class="n"&gt;new_head&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;last_node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;new_head&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;....&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里，他判断当前节点符合条件时，需要加入结果中。由于头结点可能不存在，他每一次循环都进行了对头结点判空再做处理。这个分支语句的执行成本是 O(n)，但仅实现了为头结点赋值。
在链表类题目中，一般通过使用哑（dummy) 节点来避免这种情况。&lt;/p&gt;

&lt;p&gt;四、Debug&lt;/p&gt;

&lt;p&gt;1）注意与语言特性相关的坑：负数除法的实现&lt;/p&gt;

&lt;p&gt;cond = -10/3 == -3
这个语句在在 ruby、python 中均为真，但在 java 中为假。java 让结果更偏向于 0，而 ruby、python 更倾向于将结果偏向负无穷大。&lt;/p&gt;

&lt;p&gt;2）在链式方法调用中对数组使用 tap 快速查看内容。
例子如下：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(1..10).to_a.map{ |i| i * i - 4 * i + 3 }.tap{ |i| puts i }.min
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;五、减少中间变量&lt;/p&gt;

&lt;p&gt;中间变量越多，代码量越大，出错概率也越高。例如，对需要根据数组的大小进行循环操作。常见的写法是下面例子中的 bad 写法。一些人认为 ary.length 可能会变化，在循环过程中可能会执行多次。经实验，该方法并不会在循环过程中执行多次。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;#bad&lt;/span&gt;
&lt;span class="n"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="n"&gt;ary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;length&lt;/span&gt;
&lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;times&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="c1"&gt;#somthing }&lt;/span&gt;

&lt;span class="c1"&gt;# good&lt;/span&gt;
&lt;span class="n"&gt;ary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;length&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;times&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="c1"&gt;# something }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>arth</author>
      <pubDate>Wed, 02 Nov 2016 16:28:46 +0800</pubDate>
      <link>https://ruby-china.org/topics/31504</link>
      <guid>https://ruby-china.org/topics/31504</guid>
    </item>
    <item>
      <title>给初学者推荐一本书</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/c59e05fdcbb43f426e5ae8c9356570d9.jpeg" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;对涨姿势很有帮助&lt;/p&gt;</description>
      <author>arth</author>
      <pubDate>Tue, 29 Mar 2016 21:04:31 +0800</pubDate>
      <link>https://ruby-china.org/topics/29500</link>
      <guid>https://ruby-china.org/topics/29500</guid>
    </item>
    <item>
      <title>编译的 Ruby 2.3.0 缺少 openssl 支持的解决方法 (已解决)</title>
      <description>&lt;p&gt;按：mac 升级 10.11 后，关于 openssl 的问题出现了很多。按下面方法编译前，需要确认由 openssl 目录。今天我在一台全新 mac 上安装，发现只有 openssl 可执行文件而没有对应目录。可到 openssl.org 下载安装后执行以下方法，即可解决。&lt;/p&gt;

&lt;p&gt;前两天在 osx 10.11 上编译安装了 ruby2.3.0。然后安装 gem 时，会有错误提示：
ERROR:  While executing gem ... (Gem::Exception)
    Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources&lt;/p&gt;

&lt;p&gt;重新编译发现，make 的输出中有
configuring openssl
Failed to configure openssl. It will not be installed.
如上字样。 &lt;/p&gt;

&lt;p&gt;然后重新配置，在运行 configure 时加上了 openssl 路径信息即可。正确编译的姿势如下：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;ruby-2.3.0
&lt;span class="nv"&gt;$ &lt;/span&gt;./configure  &lt;span class="nt"&gt;--with-openssl-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/ssl
&lt;span class="nv"&gt;$ &lt;/span&gt;make
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;make &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再次安装 gem，无报错信息。编译成功。 &lt;/p&gt;</description>
      <author>arth</author>
      <pubDate>Thu, 31 Dec 2015 10:09:43 +0800</pubDate>
      <link>https://ruby-china.org/topics/28575</link>
      <guid>https://ruby-china.org/topics/28575</guid>
    </item>
    <item>
      <title>这里有使用 Emacs 写 Ruby 的程序员吗？  </title>
      <description>&lt;p&gt;使用 vim 的 Ruby 程序员很多很多了，但 emacs 也不错啊。然而 emacs 相关的资源太少，仅有的那么几个又太久。   &lt;/p&gt;

&lt;p&gt;版上有没有高人，愿意出来带带我们，一起用 emacs 写 ruby？ &lt;/p&gt;

&lt;p&gt;对使用 Mac 的程序员来说，Mac 的输入框都支持 emacs 的编辑。比如按 Ctrl-A 将插入点移动到当前行的头部，再按 Ctrl-k 即可删除从插入点到行尾的整行。学习 Emacs 对提高工作效率是大有裨益的。但 Emacs 的相关教程很少，而且都很老。比如《学习 GNU Emacs》这本书是 2003 年出版的，而水木社区的 emacs 教程是 2006 年出的。 &lt;/p&gt;

&lt;p&gt;新人想要快速入门 emacs，成本很高。即便是学会了 emacs 的基本操作，想方便地使用，仍然有太多的东西去加载。我想这也许是在新时代 emacs 无法普及的一个原因。&lt;/p&gt;

&lt;p&gt;对于我自己，从去年学了一些终端下可用的 emacs 快捷键后，一直想试试用 emacs 做开发的体验。但相关教程太少。能找到的一些，都要做很麻烦的配置。有多麻烦我想初学 emacs 的都有体会。 &lt;/p&gt;

&lt;p&gt;昨晚发的这个帖，正是想实现快速编译和运行而不得的情况下发出的抱怨。&lt;/p&gt;

&lt;p&gt;刚刚找到一个可以实现直接运行当前 buffer 内容的配置  --&amp;gt;  &lt;a href="http://stackoverflow.com/a/8969799" rel="nofollow" target="_blank"&gt;http://stackoverflow.com/a/8969799&lt;/a&gt;&lt;/p&gt;</description>
      <author>arth</author>
      <pubDate>Wed, 23 Dec 2015 22:00:01 +0800</pubDate>
      <link>https://ruby-china.org/topics/28504</link>
      <guid>https://ruby-china.org/topics/28504</guid>
    </item>
    <item>
      <title>Rails 5 什么时候出？ </title>
      <description>&lt;p&gt;不是说 2015 年秋发布吗？这都 December 了。只看到上个月出了 4.2.5。。。 &lt;/p&gt;</description>
      <author>arth</author>
      <pubDate>Sun, 06 Dec 2015 22:52:06 +0800</pubDate>
      <link>https://ruby-china.org/topics/28296</link>
      <guid>https://ruby-china.org/topics/28296</guid>
    </item>
    <item>
      <title>下面这个二分搜索有 Bug 吗？ </title>
      <description>&lt;p&gt;注：数组是有序的，和面试官确认过。方法签名是 int bbsearch(int[] sorted,int ta)；也和面试官确认过。
前天面试某司，让写个二分查找，输入一个数组和目标值 ta，输出小于 ta 的最大值的下标（更新），没有则输出 -1。这样的题目我做过很多了，很快就写出了如下版本（java）。然后发生了如下对话（回忆）：
面：你这个代码没问题吗？ 
我：这里 r 表示不可达的右边界，可以简化判断。根据我做题的经验，感觉没有问题。
面：如果 p=2,r=3,a[m]&amp;lt;ta，你算法就有死循环了。
我：这个应该不会，这样的条件应该不会发生。我再看看。
。。。。（肉眼 debug，此时面试官在看电脑）.
大概三分钟后，我仍然没看出自己代码有什么问题。为了降低 bug，我把 p=m 修改成了 p=m-1。
我：我修改了一下，这样应该不会死循环了。
面：...（略作思考）
我：这里要加个条件，防止 p&amp;lt;0。
面：这题就到这里吧。&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="cm"&gt;/** solution in java*/&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;bbsearch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ta&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;+(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;)/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;]&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ta&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&amp;gt;=&lt;/span&gt;&lt;span class="n"&gt;ta&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;// 被修改的一行&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后来得知自己挂掉了，感觉很郁闷，这样的代码都能写错？于是刚刚拿 ruby 改写了一遍。测试都通过了。
面试官提到的死循环，我感觉是不可能发生的。如果能达到他说的条件，那的确有可能死循环。但实际上无法满足那个条件，个人感觉。
无论有是面试措辞，还是程序，或者（能不能）达到死循环的用例，都希望能得到大家的提示。求职心切，先谢了。 &lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# my ruby solution&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;bbsearch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
  &lt;span class="nb"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;length&lt;/span&gt;
  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;
    &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;p&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ta&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="n"&gt;ta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ta&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;p&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;):(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;bbsearch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;bbsearch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;bbsearch&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;bbsearch&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;bbsearch&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>arth</author>
      <pubDate>Sun, 11 Oct 2015 21:15:49 +0800</pubDate>
      <link>https://ruby-china.org/topics/27633</link>
      <guid>https://ruby-china.org/topics/27633</guid>
    </item>
    <item>
      <title>一个另类简洁 (优雅吗？) 的快速排序实现</title>
      <description>&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;qsort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="n"&gt;small&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
  &lt;span class="n"&gt;large&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;=&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
  &lt;span class="n"&gt;qsort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;small&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;i!&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;qsort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;large&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里用了 3 趟遍历实现 partition，仅仅是为了读起来容易。 
但完全可以用一趟实现 partition，但感觉代码略丑。 &lt;/p&gt;

&lt;p&gt;有没有更好的实现？&lt;/p&gt;</description>
      <author>arth</author>
      <pubDate>Fri, 09 Oct 2015 23:52:37 +0800</pubDate>
      <link>https://ruby-china.org/topics/27612</link>
      <guid>https://ruby-china.org/topics/27612</guid>
    </item>
    <item>
      <title>免费释放明日大会签到码</title>
      <description>&lt;p&gt;入题，不在深圳，又过了退款期限。联系微信 acearth. 藏真&lt;/p&gt;</description>
      <author>arth</author>
      <pubDate>Fri, 09 Oct 2015 23:19:29 +0800</pubDate>
      <link>https://ruby-china.org/topics/27610</link>
      <guid>https://ruby-china.org/topics/27610</guid>
    </item>
    <item>
      <title>几道有趣的 leetcode 题目</title>
      <description>&lt;p&gt;今天刚刚做完第 200 道 leetcode 题目。说说自己的感受，并分享两道有趣的题目。&lt;/p&gt;

&lt;p&gt;1.运行时间排名
只有相同语言的排名才有意义。我原先以为 ruby 比 python 快，有时确实如此，但也不确定。前几天看了个 leetcode 的 discuss 帖子，说某题用 python 比 C++ 要快很多----都知道 C、C++ 在时间排名上一般总高于其他语言。系统管理员 1337coder 的回复大概是与机器等配置有关，用户不宜以此和其他语言做对比。&lt;/p&gt;

&lt;p&gt;运行时间排名十分不稳定，这可能与目前 ruby 的提交量太少有关，但也与服务器有关。我的猜测是，如果有相邻两个时间分布式相同的，那得到这两种分布的概率是相同的。比如下图，92ms 和 104ms 的运行时间有相同的分布。如果这次运行时间是 92ms，下次也可能是 104ms。
&lt;img src="https://l.ruby-china.com/photo/2015/3ae6dbb4a878d0306df8830e15f7d625.png" title="" alt=""&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;做题训练很有价值
这两百道题，至少有 170 道题目是自己想出来然后一行行 coding 提交 AC 的。现在回顾前面一百题，已经感觉自己原先的方法十分拙劣了。这算是做题的一个收获。&lt;br&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;3.两道有趣的题目
3.1 majority elements 
求一个元素中出现次数最多的元素。这个题目的常规解法是使用优化后的动态规划。遍历一遍数组得到结果。但一个更有效的方法是排序。先上代码&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;majority_element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其实上面的分布图就是该题使用排序法得到的结果，该法的运行时间明显优于其他方法。但是排序时间复杂度为 O(nlogn)，为何这里特别快？ 
记得库函数中的 sort 方法都是三路快排加插入排序。在该题中，由于至少有一般的元素是相同的，所以插入的过程应该是直接插入尾部，这样时间几乎接近线性。但和传统方法比又少了若干次比较，所以更快。该法思路来源于同组同学。&lt;/p&gt;

&lt;p&gt;3.2 find first missing one. 
找出一个乱序数组中缺少的第一个正数。如 [4, 0 ,3,1] 缺少的第一个正数是 2。 
这题一般的思路是直接将正数值放入其对应下标，然后按序遍历数组，找到和值不对应的下标即为所缺。但这样仍然需要多次比较和读写数组（尽管是线性复杂度）。本人的思路如代码所示：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;first_missing_positive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;oldBase&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reverse&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="kp"&gt;loop&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;break&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="n"&gt;oldBase&lt;/span&gt;
    &lt;span class="n"&gt;oldBase&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;首先记录当前已有的值（初始为零），然后按序遍历数组，如果 1 出现了，就找 2，2 出现了就找 3，直到找到为止。为了加速移动，并应对数组已经有序的情况，在正序遍历数组后再逆序遍历数组。和常规方法相比，该法的复杂度是 O(n*n)。但只要输入序列不是锯齿状（如快排的 killer adversary, 又如 [2,4,1,3]），该法在除锯齿状数据的情况以外运行时间都很短。在随机产生数据的前提下，我对两种思路的数据都做了实验，O(n*n) 的解法要快于 O(n) 法。但如果数据是用 knuth shuffle 洗牌的思路生成随机数组（如 [4,2,1,3]），只是将原组做了交换，缺失值为最大值的情况下，该法将产生很多循环，运行效果变差（在对 10000 个连续值 shuffle 后的数组处理）。用这种思路解题，运行时间 76ms，和其他方法的最优时间相同。 &lt;/p&gt;

&lt;p&gt;最后感谢关注了 leetcodePractice 的各位朋友，是你们带给我更大动力。特别感谢&lt;a href="/quakewang" class="user-mention" title="@quakewang"&gt;&lt;i&gt;@&lt;/i&gt;quakewang&lt;/a&gt;，对我提出了许多批评的同时展示了许多书写良好的代码。
本人 LeetcodePractice 项目地址：&lt;a href="https://github.com/acearth/LeetCodePractice" rel="nofollow" target="_blank"&gt;https://github.com/acearth/LeetCodePractice&lt;/a&gt;&lt;br&gt;
欢迎批评和关注！&lt;/p&gt;</description>
      <author>arth</author>
      <pubDate>Wed, 19 Aug 2015 18:27:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/26988</link>
      <guid>https://ruby-china.org/topics/26988</guid>
    </item>
    <item>
      <title>Ruby 版 Leetcode，已水完 100 题，求同好 Review</title>
      <description>&lt;p&gt;忽然就发现 leetcode 支持 ruby 了。然后就开始刷刷刷，从月初到现在，终于刷完了 100 题简单题。下面说下感受：&lt;/p&gt;

&lt;p&gt;1.确实有开挂的感觉，使用 ruby 的话可以不用关心溢出、字符串数字互转、二进制十进制互转。对于专门要考察这些操作的题不应当使用 ruby 特性解决外，其他问题完全可以利用这种特性；&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ruby 的负数除法是向负无穷取整的。10/(-3) 得到的是 -4 而不是 -3。这和 c 系语言向零取整恰好相反。这样，c 系语言能过的用例，只要有负数除法，ruby 必然过不了，需要处理一下才能 AC。记得这个问题是在求解逆波兰式时遇到的。&lt;/li&gt;
&lt;li&gt;如果题目要求不要返回任何对象，那你需要在方法的最后一行填上 return 空语句。否则 ruby 会把之前循环体或者其他最后的对象返回。&lt;/li&gt;
&lt;li&gt;如果需要返回空串，就 return "", return String.new 产生的是个空数组 [ ]  。&lt;/li&gt;
&lt;li&gt;用 ruby 刷题，性能根本不是问题，一般只比 c 慢。举个昨天刚 ac 的例子：如下图。本题是将 k 个一组的链表节点逆置，应该没有多种解法，优化空间小。
&lt;img src="https://l.ruby-china.com/photo/2015/11d8b4455c90e2d2f7b148bf5fe44893.png" title="" alt=""&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;偶尔会比其他一两种语言慢一点，但一般绝不会比 python 差。&lt;/p&gt;

&lt;p&gt;6.如果不幸发生了超时，除了优化算法，还可以使用 profile 工具确认是那些方法导致的。做 3sum 时，我使用了二分搜索查找值，但总是超时。还能是哪里出问题？可能要提前剪枝？我加了一些判断，若第一个数就大于零，就直接跳过。几个用例就通过了，但剩下的仍然通不过，我将第三个数也加了相同剪纸条件，又有新的用例通过，但依旧 TLE。怎么办？那天刚好看到本站友人介绍 profile 工具，就现学现用了。测了一下，发现 bisearch 耗时占 75%。问题一定是出在这里了。仔细查看代码，发现，应该当查找 bisearch(nums,m+1,h,target) 这里的 m+1，我误写成了 l+1。性能比逐次查找的还要差。修改错误后直接 ac。 &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;部分题目可以使用闭包。比如 zigzag convert 字符串。可以用闭包产生下一个坐标。raise&lt;/li&gt;
&lt;li&gt;有时我竟然利用了异常处理来解题，不知道这样的做法是不是超出了算法界讲究的 RAM 模型。比如，某题需要递归求值，但如果递归遇到特定条件时，应该立即返回特定值给主程序。但使用普通的 return，值只会传递给堆栈的下一级。方法的结束不是有 return 和 raise exception 两种方式吗？于是我拿出了不受欢迎的 raise，这样，原本超时的题目竟然 ac 了。这样真的好吗？ &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;搜了一下本站，就发现半年前有人要用 ruby 解题，但有人只做了很少的几道题就不了了之了。下面是我最新 ac 的 100 题，其中 90% 以上的题目用 ruby 完成，有几道是刚开始用 java 做的，也有的是因为题目并没有提供 ruby 版本。  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/acearth/LeetCodePractice" rel="nofollow" target="_blank"&gt;https://github.com/acearth/LeetCodePractice&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;一般来说，一个好方法的长度不应该超过 10 行代码。但解题时，代码是“一处编写，一处运行”，几乎不会有任何重用。我将自己在 20 行以内的解法视为可接受的解法。同时，有几道题使用了 ruby 的语法特性，这种做题目能 ac，但对涨姿势却一点作用也没有。从这个角度来说，4 行以下的方法不算好方法。从这种评判角度来说，我的代码，有 50% 以上的都是不合格代码，而剩下的解法中，还有很多是算法非最优，或者代码啰嗦的。这么说，这些代码都不该拿出来。但我还没发现有人公布 ruby 版的 leetcode 解法，就当是抛砖引玉吧。&lt;/p&gt;</description>
      <author>arth</author>
      <pubDate>Fri, 17 Jul 2015 09:11:13 +0800</pubDate>
      <link>https://ruby-china.org/topics/26529</link>
      <guid>https://ruby-china.org/topics/26529</guid>
    </item>
  </channel>
</rss>
