﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-coding everyday-随笔分类-Algorithm</title><link>http://www.cppblog.com/everyday/category/20592.html</link><description>编程面试题
https://interview.codeplex.com</description><language>zh-cn</language><lastBuildDate>Thu, 29 Aug 2013 02:54:33 GMT</lastBuildDate><pubDate>Thu, 29 Aug 2013 02:54:33 GMT</pubDate><ttl>60</ttl><item><title>统计数组中未出现和多次出现的值</title><link>http://www.cppblog.com/everyday/archive/2013/08/29/202841.html</link><dc:creator>everyday</dc:creator><author>everyday</author><pubDate>Thu, 29 Aug 2013 02:24:00 GMT</pubDate><guid>http://www.cppblog.com/everyday/archive/2013/08/29/202841.html</guid><wfw:comment>http://www.cppblog.com/everyday/comments/202841.html</wfw:comment><comments>http://www.cppblog.com/everyday/archive/2013/08/29/202841.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/everyday/comments/commentRss/202841.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/everyday/services/trackbacks/202841.html</trackback:ping><description><![CDATA[<p><a href="http://huati.weibo.com/k/%E9%9D%A2%E8%AF%95%E9%A2%98?from=501">#<span style="font-family:SimSun;">面试题</span>#</a><span style="font-family:SimSun;">给定数组</span>A<span style="font-family:SimSun;">，大小为</span>n<span style="font-family:SimSun;">，数组元素为</span>1<span style="font-family:SimSun;">到</span>n<span style="font-family:SimSun;">的数字，不过有的数字出现了多次，有的数字没有出现。请给出算法和程序，统计哪些数字没有出现，哪些数字出现了多少次。能够在</span>O(n)<span style="font-family:SimSun;">的时间复杂度，</span>O(1)<span style="font-family:SimSun;">的空间复杂度要求下完成么</span><span style="font-family:SimSun;">？</span></p>
<p><span style="font-family:SimSun;"><br />
</span></p>
<p><span style="font-family:SimSun;">想了好久，都没能想出来算法，我觉得是不是自己走进死胡同了，决定再看一遍题目，这一遍果然让我发现，原来自己真的理解错了题目的意思，我一开始以为要输出多次出现的数字对应的数字，所以一直都绕不过来弯。</span></p>
<p><span style="font-family:SimSun;">所以有时候面试过程中，重新确认题目还是有必要的，有时候面试紧张会误解题目意思，当自己没有思路的时候，可以尝试确认题意，以来可以缓解一下自己的心情，再者可能面试官会跟你有更多的互动，增加好感。</span></p>
<p><span style="font-family:SimSun;"><br />
</span></p>
<p><span style="font-family:SimSun;">确定了题意，基于之前的思考，我的算法是这样的遍历一遍数组，用</span><span style="font-family:SimSun;">-2,-1,0来表示没有出现，出现一次，出现多次，如果当前节点大于0，目标节点为它对应的值，当前置为-2，若小于0，加一但不要超过0。算法需要一个递归函数（用来递归处理目标节点一直大于0的情况，即未处理过的）和一个遍历的函数。最终0即为多次出现，-1出现1次的，-2没有出现。因为有2个前提这个算法才有效：1～n；只要出现多次和没出现的数字，不需要次数。</span></p>
<p>&nbsp;</p>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">array</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;std;<br />
</span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">template</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;N</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;array_stat&nbsp;{<br />
</span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />
</span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;array_stat(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;array</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,&nbsp;N</span><span style="color: #000000; ">&gt;&amp;</span><span style="color: #000000; ">&nbsp;arr)&nbsp;:&nbsp;m_arr(arr)&nbsp;{<br />
</span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">operator</span><span style="color: #000000; ">()()&nbsp;{<br />
</span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">N;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />
</span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;process(i);<br />
</span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">N;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />
</span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(m_arr[i]&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />
</span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;i</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;exists&nbsp;more&nbsp;than&nbsp;once</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br />
</span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(m_arr[i]&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">2</span><span style="color: #000000; ">)<br />
</span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;i</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;doesnt&nbsp;exist</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br />
</span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:<br />
</span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;array</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,&nbsp;N</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;m_arr;<br />
</span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;process(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i)&nbsp;{<br />
</span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(m_arr[i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br />
</span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;cur&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;m_arr[i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">];<br />
</span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_arr[i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;process(cur);<br />
</span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />
</span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_arr[i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(m_arr[i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />
</span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_arr[i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">};<br />
</span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()&nbsp;{<br />
</span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;array</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;arr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">6</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">6</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">6</span><span style="color: #000000; ">};<br />
</span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;array_stat</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;stat(arr);<br />
</span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;stat();<br />
</span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">}<br />
</span></div>
<br /><a href="https://interview.codeplex.com/SourceControl/latest#array_stat.cpp">源代码</a><img src ="http://www.cppblog.com/everyday/aggbug/202841.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/everyday/" target="_blank">everyday</a> 2013-08-29 10:24 <a href="http://www.cppblog.com/everyday/archive/2013/08/29/202841.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第n杯水</title><link>http://www.cppblog.com/everyday/archive/2013/08/01/202274.html</link><dc:creator>everyday</dc:creator><author>everyday</author><pubDate>Thu, 01 Aug 2013 05:43:00 GMT</pubDate><guid>http://www.cppblog.com/everyday/archive/2013/08/01/202274.html</guid><wfw:comment>http://www.cppblog.com/everyday/comments/202274.html</wfw:comment><comments>http://www.cppblog.com/everyday/archive/2013/08/01/202274.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/everyday/comments/commentRss/202274.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/everyday/services/trackbacks/202274.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一座金字塔，从上到下，第一层有一个杯子、第二层有两个杯子，依次类推。每个杯子的容量为C升，从塔顶倒下L升水，当1号杯子满了之后，会等量溢出到2号和3号杯子。当2号和3号满了，2号溢出到4号和5号，3号溢出到5号和6号，注意5号接受来自两个杯子的水。依次类推。给定C和L，请问，第n杯里有多少水。 &nbsp;&nbsp;<a href='http://www.cppblog.com/everyday/archive/2013/08/01/202274.html'>阅读全文</a><img src ="http://www.cppblog.com/everyday/aggbug/202274.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/everyday/" target="_blank">everyday</a> 2013-08-01 13:43 <a href="http://www.cppblog.com/everyday/archive/2013/08/01/202274.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>面试题：熟悉的陌生人</title><link>http://www.cppblog.com/everyday/archive/2013/07/19/201944.html</link><dc:creator>everyday</dc:creator><author>everyday</author><pubDate>Fri, 19 Jul 2013 01:52:00 GMT</pubDate><guid>http://www.cppblog.com/everyday/archive/2013/07/19/201944.html</guid><wfw:comment>http://www.cppblog.com/everyday/comments/201944.html</wfw:comment><comments>http://www.cppblog.com/everyday/archive/2013/07/19/201944.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/everyday/comments/commentRss/201944.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/everyday/services/trackbacks/201944.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: #面试题#Facebook用户都是双向的好友，a是b的好友，那么b一定是a的。给定一个用户列表，有些用户是好友，有些不是，请判断，这些用户是否可以划分为两组，每组内的用户，互相都不是好友。如果能，请给出这个划分。比如用户：{1, 2, 3} 好友关系：1-2， 2-3 划分：{1,3} {2}。<br><br>题目乍一看，感觉像是图连通的问题。细细品了下，貌似不是滴。&nbsp;&nbsp;<a href='http://www.cppblog.com/everyday/archive/2013/07/19/201944.html'>阅读全文</a><img src ="http://www.cppblog.com/everyday/aggbug/201944.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/everyday/" target="_blank">everyday</a> 2013-07-19 09:52 <a href="http://www.cppblog.com/everyday/archive/2013/07/19/201944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>算法题：一个不能少</title><link>http://www.cppblog.com/everyday/archive/2013/07/18/201921.html</link><dc:creator>everyday</dc:creator><author>everyday</author><pubDate>Thu, 18 Jul 2013 02:14:00 GMT</pubDate><guid>http://www.cppblog.com/everyday/archive/2013/07/18/201921.html</guid><wfw:comment>http://www.cppblog.com/everyday/comments/201921.html</wfw:comment><comments>http://www.cppblog.com/everyday/archive/2013/07/18/201921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/everyday/comments/commentRss/201921.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/everyday/services/trackbacks/201921.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: #面试编程题#一 个不能少：有k个有序的数组，请找到一个最小的数字范围。使得这k个有序数组中，每个数组都至少有一个数字在该范围中。例如：1:{ 4, 10, 15, 24, 26 }；2: { 0, 9, 12, 20 }；3: { 5, 18, 22, 30 }。所得最小范围为[20,24]，其中，20在2中，22在3中，24在1中。&nbsp;&nbsp;<a href='http://www.cppblog.com/everyday/archive/2013/07/18/201921.html'>阅读全文</a><img src ="http://www.cppblog.com/everyday/aggbug/201921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/everyday/" target="_blank">everyday</a> 2013-07-18 10:14 <a href="http://www.cppblog.com/everyday/archive/2013/07/18/201921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>括号匹配问题</title><link>http://www.cppblog.com/everyday/archive/2013/07/13/201771.html</link><dc:creator>everyday</dc:creator><author>everyday</author><pubDate>Sat, 13 Jul 2013 09:20:00 GMT</pubDate><guid>http://www.cppblog.com/everyday/archive/2013/07/13/201771.html</guid><wfw:comment>http://www.cppblog.com/everyday/comments/201771.html</wfw:comment><comments>http://www.cppblog.com/everyday/archive/2013/07/13/201771.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/everyday/comments/commentRss/201771.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/everyday/services/trackbacks/201771.html</trackback:ping><description><![CDATA[这个问题很简单，大学学数据结构的时候，讲堆栈一章的时候作为其中一个例子来说的。但是如果面试中被问到这个题，我想用堆栈来做应该不能被接受吧，理由是空间和时间的代价都挺高的。<br /><br />有没有稍微好点的算法呢？介绍个时间O(n), 空间O(1)的算法。<br /><br />既然我们只是要找出括号有没有匹配就行了，那我们用一种方式记下左括号和右括号的次数不就可以了，例如left_count, right_count。它们的差为0不就好了？只要不为0，肯定就不匹配了，对吧？更进一步，为啥非要用2个变量呢，一个就够了嘛。遇到左括号++，遇到右括号--，最后为0即匹配。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;is_brackets_match(<span style="color: #0000FF; ">char</span>&nbsp;*<span style="color: #0000FF; ">const</span>&nbsp;input)&nbsp;{<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(input&nbsp;!=&nbsp;nullptr)&nbsp;{<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*p&nbsp;=&nbsp;input;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;count&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(*p&nbsp;!=&nbsp;'\0')&nbsp;{<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(*p&nbsp;==&nbsp;'(')<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++count;<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(*p&nbsp;==&nbsp;')')<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--count;<br /><span style="color: #008080; ">11</span>&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p++;<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">14</span>&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(count&nbsp;==&nbsp;0)<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">19</span>&nbsp;}</div><img src ="http://www.cppblog.com/everyday/aggbug/201771.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/everyday/" target="_blank">everyday</a> 2013-07-13 17:20 <a href="http://www.cppblog.com/everyday/archive/2013/07/13/201771.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Magic Index</title><link>http://www.cppblog.com/everyday/archive/2013/07/12/201732.html</link><dc:creator>everyday</dc:creator><author>everyday</author><pubDate>Fri, 12 Jul 2013 06:25:00 GMT</pubDate><guid>http://www.cppblog.com/everyday/archive/2013/07/12/201732.html</guid><wfw:comment>http://www.cppblog.com/everyday/comments/201732.html</wfw:comment><comments>http://www.cppblog.com/everyday/archive/2013/07/12/201732.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/everyday/comments/commentRss/201732.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/everyday/services/trackbacks/201732.html</trackback:ping><description><![CDATA[<div><a href="http://huati.weibo.com/k/%E9%9D%A2%E8%AF%95%E7%BC%96%E7%A8%8B%E9%A2%98?from=501">#面试编程题#</a>给定一个数组A，其中有一个位置被称为Magic Index，含义是：如果i是Magic Index，则A[i] = i。假设A中的元素递增有序、且不重复，请给出方法，找到这个Magic Index。当A中允许有重复的元素，该怎么办呢？</div><br />第一个，不重复，很简单，用二分查找就OK了。对吧<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;find_magic_index2(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">list,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;count)&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;low&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;high&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;count&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(high&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;low)&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;idx&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(high&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;low)&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(idx&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;list[idx])<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;idx;<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(list[idx]&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;idx)&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;high&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;idx&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;low&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;idx&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">}</span></div><br />第二个，可重复的，该怎么办?从头到尾走一边，总归是可以的嘛。:)。我的想法是，如果a[i]等于i的话，找到了；如果大于i的话，让i=a[i]，不然i++继续找。这样最差的情况才是O(n)<br />至于为什么可以让i=a[i]，原因由于数列是递增的，所以数组元素在{i, a[i]}的区间中，肯定不可能存在magic index。这样看上去是不是跳跃着前进啊。:)<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;find_magic_index&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">list,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;count)&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(i</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">count)&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(list[i]&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;i)<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;i;<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(list[i]&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;i)<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;list[i];<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000;">}</span></div><img src ="http://www.cppblog.com/everyday/aggbug/201732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/everyday/" target="_blank">everyday</a> 2013-07-12 14:25 <a href="http://www.cppblog.com/everyday/archive/2013/07/12/201732.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单链表的快速排序</title><link>http://www.cppblog.com/everyday/archive/2013/07/12/201727.html</link><dc:creator>everyday</dc:creator><author>everyday</author><pubDate>Fri, 12 Jul 2013 05:41:00 GMT</pubDate><guid>http://www.cppblog.com/everyday/archive/2013/07/12/201727.html</guid><wfw:comment>http://www.cppblog.com/everyday/comments/201727.html</wfw:comment><comments>http://www.cppblog.com/everyday/archive/2013/07/12/201727.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/everyday/comments/commentRss/201727.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/everyday/services/trackbacks/201727.html</trackback:ping><description><![CDATA[单链表的快速排序<br />单链表的快速排序跟数组的排序原理上一致，有一个分区（区分）的函数在一个区间中针对某个标杆值进行区分，比它大的放它后面，比它小的放它前面，并返回它的地址，好对它前面的以及它后面的递归。<br /><br />单链表的快速排序跟数组有个明显的区别，就是指示起始和终止的元素，在一轮之后它们在链表中的位子会发生改变，所以需要返回一个新的起始的位置（终止的位置）<br />我的算法中总是拿后一个的节点作为终止位置，所以它在链表中的位子其实是不改变的，所以我只修改了起始位置指向新的起始位置即可。<br /><br />我的算法是，用2个链表，一个放比它大的一个放比它小的，最后接起来，它的位置就是mid，而其实位置就是当初起始的前一个节点在新链表中的next。有点拗口，就是说a-&gt;start-&gt;...-&gt;nullptr，这一轮传进来的是start，那么经过这轮的分区之后，start的位置肯定改变了，对吧？但是a-&gt;next的地址没有改变，即&amp;(a-&gt;next)，因为start之前的都会原封不动的放在那里。我觉得用指针的地址来处理是这里的关键之处吧。<br /><br /><img src="http://www.cppblog.com/images/cppblog_com/everyday/QuickSort.png" alt="" height="469" border="0" width="812" /><br />这是一轮partition之前和之后的图示，之后就对于(begin, mid)和（mid-&gt;next, end)进行快速排序即可。<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Problem:&nbsp;sort&nbsp;a&nbsp;singly&nbsp;link&nbsp;list&nbsp;by&nbsp;Quick&nbsp;Sort</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">node&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">partition(list&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">l,&nbsp;node&nbsp;</span><span style="color: #000000; ">*&amp;</span><span style="color: #000000; ">begin,&nbsp;node&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">end&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;nullptr)&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;if&nbsp;end&nbsp;is&nbsp;the&nbsp;next&nbsp;node,&nbsp;that&nbsp;means&nbsp;it's&nbsp;only&nbsp;one&nbsp;node&nbsp;to&nbsp;sort</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(begin&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;nullptr&nbsp;</span><span style="color: #000000; ">||</span><span style="color: #000000; ">&nbsp;end&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;begin</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">next)&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;nullptr;<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;small_list,&nbsp;big_list;<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">current&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;l.root;<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">pivot&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;begin;<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">pbegin;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;points&nbsp;to&nbsp;the&nbsp;address&nbsp;of&nbsp;begin</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">s_current&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">small_list.root,&nbsp;</span><span style="color: #000000; ">**</span><span style="color: #000000; ">b_current&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">big_list.root;<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;move&nbsp;previous&nbsp;nodes&nbsp;before&nbsp;'begin'&nbsp;to&nbsp;small&nbsp;list</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(current&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;begin)&nbsp;{<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">s_current&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;current;<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s_current&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">s_current)</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">next;<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;current</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">next;<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;pbegin&nbsp;presents&nbsp;the&nbsp;location(address)&nbsp;of&nbsp;begin&nbsp;item,&nbsp;e.g.&nbsp;if&nbsp;(a-&gt;next&nbsp;==&nbsp;begin)&nbsp;then&nbsp;pbegin&nbsp;=&nbsp;&amp;a-&gt;next;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;pbegin&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;s_current;<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(begin&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;end)&nbsp;{<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(begin</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">data&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;pivot</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">data)&nbsp;{<br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">s_current&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;begin;<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s_current&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">s_current)</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">next;<br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">b_current&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;begin;<br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b_current&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">b_current)</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">next;<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;begin</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">next;<br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;pass&nbsp;begin&nbsp;back&nbsp;to&nbsp;quick_sort&nbsp;for&nbsp;next&nbsp;sort&nbsp;action</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;begin&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">pbegin;<br /></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">b_current</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;end;<br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">s_current&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;big_list.root;<br /></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;l&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;small_list;<br /></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;l.print();<br /></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;current&nbsp;pivot&nbsp;would&nbsp;be&nbsp;the&nbsp;end&nbsp;node&nbsp;for&nbsp;smaller&nbsp;set&nbsp;sorting</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;big_list.root;<br /></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;quick_sort(list&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">l,&nbsp;node&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">begin,&nbsp;node&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">end&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;nullptr)&nbsp;{<br /></span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(begin&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;end)&nbsp;{<br /></span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">53</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;mid&nbsp;represents&nbsp;the&nbsp;pivot&nbsp;node&nbsp;which&nbsp;is&nbsp;the&nbsp;next&nbsp;node&nbsp;of&nbsp;the&nbsp;end&nbsp;of&nbsp;the&nbsp;small&nbsp;list</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">54</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">mid&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;partition(l,&nbsp;begin,&nbsp;end);<br /></span><span style="color: #008080; ">55</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">56</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(mid&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;nullptr){<br /></span><span style="color: #008080; ">57</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;quick_sort(l,&nbsp;begin,&nbsp;mid);<br /></span><span style="color: #008080; ">58</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">59</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">60</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(mid&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;nullptr&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">61</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mid</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">next&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;nullptr)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">62</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;quick_sort(l,&nbsp;mid</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">next,&nbsp;end);<br /></span><span style="color: #008080; ">63</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">64</span>&nbsp;<span style="color: #000000; ">}</span></div><br /><a href="https://interview.codeplex.com/SourceControl/latest#quick_sort_list.cpp">代码</a> <img src ="http://www.cppblog.com/everyday/aggbug/201727.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/everyday/" target="_blank">everyday</a> 2013-07-12 13:41 <a href="http://www.cppblog.com/everyday/archive/2013/07/12/201727.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>蓄水池抽样</title><link>http://www.cppblog.com/everyday/archive/2013/07/03/201484.html</link><dc:creator>everyday</dc:creator><author>everyday</author><pubDate>Wed, 03 Jul 2013 01:29:00 GMT</pubDate><guid>http://www.cppblog.com/everyday/archive/2013/07/03/201484.html</guid><wfw:comment>http://www.cppblog.com/everyday/comments/201484.html</wfw:comment><comments>http://www.cppblog.com/everyday/archive/2013/07/03/201484.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/everyday/comments/commentRss/201484.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/everyday/services/trackbacks/201484.html</trackback:ping><description><![CDATA[yeah. 首先要恭喜下自己，昨天的<a href="http://www.cppblog.com/everyday/archive/2013/07/02/201473.html">算法</a>蒙对了，请看<a href="http://www.weibo.com/lirenchen">@陈利人</a> 的<a href="http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5ODIzNDQ3Mw==&amp;appmsgid=10000029&amp;itemidx=1&amp;sign=710efaef26476a48b2e4876cf7ef2883">帖子</a>。 【鼓掌】【鼓掌】:)<br /><div><h1>经典面试题：蓄水池抽样</h1></div><div><p>要求从N个元素中随机的抽取k个元素，其中N无法确定。</p><p>这种应用的场景一般是数据流的情况下，由于数据只能被读取一次，而且数据量很大，并不能全部保存，因此数据量N是无法在抽样开始时确定的；但又要保持随机性，于是有了这个问题。所以搜索网站有时候会问这样的问题。</p><p>这里的核心问题就是&#8220;随机&#8221;，怎么才能是随机的抽取元素呢？我们设想，买彩票的时候，由于所有彩票的中奖概率都是一样的，所以我们才是&#8220;随机的&#8221;买彩票。那么要使抽取数据也随机，必须使每一个数据被抽样出来的概率都一样。</p><p><br /></p><p>哎呀妈呀，这题目一天比一天难啊。目测搞不定啊。</p><p>在班车上简单分析了下，N的值要到最后才知道，从N个里面抽k个元素，要是概率知识没有都还给老师的话，每个元素被抽中的概率是C<sub>N</sub><sup>k</sup>，对不？唔，既然在N知道之前，就要一样概率的抽取k个元素，那我能不能猜想最后的算法其实是跟N无关的呢？不管怎么样先挖个坑再说，目测这个坑不一定能填上。:D<br /></p></div><img src ="http://www.cppblog.com/everyday/aggbug/201484.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/everyday/" target="_blank">everyday</a> 2013-07-03 09:29 <a href="http://www.cppblog.com/everyday/archive/2013/07/03/201484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>找出最流行搜索词</title><link>http://www.cppblog.com/everyday/archive/2013/07/02/201473.html</link><dc:creator>everyday</dc:creator><author>everyday</author><pubDate>Tue, 02 Jul 2013 13:10:00 GMT</pubDate><guid>http://www.cppblog.com/everyday/archive/2013/07/02/201473.html</guid><wfw:comment>http://www.cppblog.com/everyday/comments/201473.html</wfw:comment><comments>http://www.cppblog.com/everyday/archive/2013/07/02/201473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/everyday/comments/commentRss/201473.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/everyday/services/trackbacks/201473.html</trackback:ping><description><![CDATA[本题目出自<a node-type="feed_list_originNick"  s_func3"="" href="http://weibo.com/lirenchen" title="陈利人" usercard="id=1915548291" nick-name="陈利人" style="text-decoration: none; color: #49976b; font-size: 12px; font-weight: bold; line-height: 19px; font-family: Arial, Helvetica, sans-serif; background-color: #f2f2f2;">@陈利人</a><br /><br /><span style="font-size: 18pt;">问题：<br /></span><a class="a_topic" href="http://huati.weibo.com/k/Google%E9%9D%A2%E8%AF%95%E9%A2%98?from=501" style="color: #49976b; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 19px; background-color: #f2f2f2;">#Google面试题#</a><span style="color: #33463f; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 19px; background-color: #f2f2f2;">给你一天的Google搜索日志，你怎么设计算法找出是否有一个搜索词，它出现的频率占所有搜索的一半以上？如果肯定有一个搜索词占大多数，你能怎么提高你的算法找到它？再假定搜索日志就是内存中的一个数组，能否有O(1)空间，O(n)时间的算法？<br /><br /></span>刚看到这个题目的时间吓坏了，好难啊，无从下手啊，为自己的之上捉急啊。。下班的班车上开始想这个问题，开始分析，其实这个搜索日志就是一个搜索词的集合嘛，甭管它有多大，总可以分成若干堆吧。既然这个搜索词超过一半，那么在这若干堆中分别找出来最流行的词中，也应该占一半吧。（这个应该没有理解错吧。）<br /><br />这个时候我想可以把问题转换成一个整数数组，其中有个整数出现的次数超过一半，找出这个整数就OK了吧。要找出这个数组中出现次数超一半的值，本身这个算法应该很简单，但是O(1)空间和O(n)的时间复杂度，还是有点伤脑筋的。。:(，内存又不贵，为啥O(1)啊。。<br /><br />因为那个数字出现的次数超过一半，我们可以想象一下，把那个数字标成1，其它的都是-1，把所有的数字加起来肯定大于0，对吧？因为超过一半嘛。。这个时候灵光乍现，用一个标杆来标志潜在的那个搜索词，一个整数count表示它出现的次数（准确的说不是它的次数，后面会解释），遍历整个数组<br />1) &nbsp; 如果当前的跟标杆一样，count++<br />2) &nbsp; 如果不相等，--count，若此时count为0，则把当前值置为标杆，count为1<br />重复1), 2)即可，最后那个标杆即为最流行搜索词。<br /><br />代码简单的我不能相信，以至于我觉得我肯定理解错误题目的意思了，不管怎么样上下<a href="https://interview.codeplex.com/SourceControl/latest#get_most_popular_keyword.cpp">代码</a>：<span style="font-size: 13px; color: #008080;">&nbsp;<br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Get&nbsp;the&nbsp;most&nbsp;popular&nbsp;searching&nbsp;keyword&nbsp;in&nbsp;Google.&nbsp;:)</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; "></span>template&lt;typename&nbsp;T&gt;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;T&nbsp;get_most_popular_keyword(<span style="color: #0000FF; ">const</span>&nbsp;T&nbsp;*list,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;size)&nbsp;{<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;result&nbsp;=&nbsp;list[0];<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;count&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i=0;&nbsp;i&lt;size;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(list[i]&nbsp;==&nbsp;result)<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count++;<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(--count&nbsp;==&nbsp;0)&nbsp;{<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;=&nbsp;1;<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;list[i];<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">17</span>&nbsp;<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br /><span style="color: #008080; ">19</span>&nbsp;}</div><img src ="http://www.cppblog.com/everyday/aggbug/201473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/everyday/" target="_blank">everyday</a> 2013-07-02 21:10 <a href="http://www.cppblog.com/everyday/archive/2013/07/02/201473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[失败的挑战]: 求两个单链表的和 </title><link>http://www.cppblog.com/everyday/archive/2013/07/02/201450.html</link><dc:creator>everyday</dc:creator><author>everyday</author><pubDate>Tue, 02 Jul 2013 01:51:00 GMT</pubDate><guid>http://www.cppblog.com/everyday/archive/2013/07/02/201450.html</guid><wfw:comment>http://www.cppblog.com/everyday/comments/201450.html</wfw:comment><comments>http://www.cppblog.com/everyday/archive/2013/07/02/201450.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/everyday/comments/commentRss/201450.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/everyday/services/trackbacks/201450.html</trackback:ping><description><![CDATA[本文描述的是我自己的一个失败的挑战经历。<br />
<br />
<strong style="color: #000000; font-size: 18pt;">题目</strong><br style="color: #000000; font-size: 18pt;" />
<div>两个单链表（singly linked list），每一个节点里面一个0-9的数字， 输入就相当于两个大数了。然后返回这两个数的和（一个新list）。这两个输入的list 长度相等。 要求是：1. 不用递归。2. 要求算法在最好的情况下，只遍历两个list一次， 最差的情况下两遍。</div>
<br />
我的算法是： 2次遍历是肯定能的，第一次相加并以倒序存，第二次进位并倒序。一次/两次的算法，用2个指针，一个指钱一个，另一个指向再前一个，另一个flag标志是否走第二轮。只有前前位有进位flag置true跑第二次。 <br />
<br />
为啥当时会有这样的想法呢？因为所有数字都是0～9，所以我假设了第一轮的相加和进位能把大部分该进位的都进了，所以如果存在需要第二轮的话，找出那个条件就好了。当时就沿着这个思路走了。当然大部分情况下这个算法是可行的，但是这里有个很明显的漏洞，当时被胜利冲昏头脑的我怎么会想的到呢？就是一开始没有出现进位，后来连续进位的情况，如<a href="http://www.weibo.com/2bit">@赵小罡</a>这位朋友设计的用例 1000001+9999999。一并感谢其他指出错误的网友。<br />
<br />
如果有人想怀着鄙视的心态看下我错误的代码，请点击&#8220;<a target="null"></a><a href="https://interview.codeplex.com/SourceControl/latest#CppPrimer.cpp"></a><a href="https://interview.codeplex.com/SourceControl/latest#CppPrimer.cpp">源码</a>"，不过放在心里就好了，不要打击我脆弱的心灵哦。:)<br />
<br />
另外有个高手做了一个算法，总是只要一次就能搞定的。@hawstein详情见&#8220;<a href="http://hawstein.com/posts/add-singly-linked-list.html">求两个单链表的和&#8221;</a> 尼害的不得了。他的网站上还有不少好东西呢。对于他的算法，我有个改进的建议就是，以他的算法完全没有必要单独考虑第一个节点的情况，在遍历结束后，判断下第一个节点是否大于9就OK了，如果大于9，最前面插入一个节点。<img src ="http://www.cppblog.com/everyday/aggbug/201450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/everyday/" target="_blank">everyday</a> 2013-07-02 09:51 <a href="http://www.cppblog.com/everyday/archive/2013/07/02/201450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>