﻿<?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>BlogJava-JustJavaIt的Blog-随笔分类-好玩儿的面试题和算法</title><link>http://www.blogjava.net/jswxgdy/category/49085.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 14 Jul 2011 05:15:37 GMT</lastBuildDate><pubDate>Thu, 14 Jul 2011 05:15:37 GMT</pubDate><ttl>60</ttl><item><title>一道好玩儿的"移火柴"面试题</title><link>http://www.blogjava.net/jswxgdy/archive/2011/07/14/354309.html</link><dc:creator>JustJavaIt</dc:creator><author>JustJavaIt</author><pubDate>Thu, 14 Jul 2011 03:47:00 GMT</pubDate><guid>http://www.blogjava.net/jswxgdy/archive/2011/07/14/354309.html</guid><wfw:comment>http://www.blogjava.net/jswxgdy/comments/354309.html</wfw:comment><comments>http://www.blogjava.net/jswxgdy/archive/2011/07/14/354309.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jswxgdy/comments/commentRss/354309.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jswxgdy/services/trackbacks/354309.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt;">还记得小时候增加或移动一根火柴使等式成立的趣味题吗？嘿嘿，今天就和大家分享一道面试题，和&#8220;火柴题&#8221;很像，因此也更像是趣味题，做起来非常有意思O(&#8745;_&#8745;)O。废话不多说，直接上题：</span><br />&nbsp;&nbsp;&nbsp; <br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; font-size: 10pt;">/*</span><span style="color: #008000;"><br /></span><span style="color: #008000; font-size: 10pt;">&nbsp;&nbsp;下面这段C程序想要输出20个减号，不过，粗心的程序员把代码写错了，你需要把下面的代码修改正确，不过，你只能增加或是修改其中的一个字符，请你给出三种答案。<br />&nbsp;&nbsp;</span><span style="color: #008000; font-size: 10pt;">*/</span><span style="color: #000000; "><br /></span><span style="color: #0000ff; font-size: 10pt;">int</span><span style="color: #000000; font-size: 10pt;">&nbsp;n&nbsp;</span><span style="color: #000000; font-size: 10pt;">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-size: 10pt;">20</span><span style="color: #000000; font-size: 10pt;">;<br /></span><span style="color: #0000ff; font-size: 10pt;">for</span><span style="color: #000000; font-size: 10pt;">(</span><span style="color: #0000ff; font-size: 10pt;">int</span><span style="color: #000000; font-size: 10pt;">&nbsp;i</span><span style="color: #000000; font-size: 10pt;">=</span><span style="color: #000000; font-size: 10pt;">0</span><span style="color: #000000; font-size: 10pt;">;&nbsp;i</span><span style="color: #000000; font-size: 10pt;">&lt;</span><span style="color: #000000; font-size: 10pt;">n;&nbsp;i</span><span style="color: #000000; font-size: 10pt;">--</span><span style="color: #000000; font-size: 10pt;">)<br /></span><span style="color: #000000; font-size: 10pt;">{<br /></span><span style="color: #000000; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; font-size: 10pt;">"</span><span style="color: #000000; font-size: 10pt;">-</span><span style="color: #000000; font-size: 10pt;">"</span><span style="color: #000000; font-size: 10pt;">);<br /></span><span style="color: #000000; font-size: 10pt;">}</span></div>&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp; <br /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; 题目很简单，相信任何一个程序员都是能看懂的，这题不考复杂的专业知识，当趣味题做就行了，注意题目要求&#8220;给出三种答案&#8221;，不好漏解就好。</span><br />&nbsp;&nbsp;&nbsp; <br /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; 下面帖上我的解题思路： &nbsp;&nbsp; </span><br /><br /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; 简单分析一下程序不难看出，&#8220;粗心的程序员&#8221;把i++写成了i--，导致循环不能执行20次。因此，我们的最终目的就是让for循环执行20次。题目的要求是只能增加或修改一个字符，这么一来，可以修改的也只有"int n=20"和"for (int i=0;i&lt;n;i--)"这两行了。简单尝试一下修改n的数值，很快发现行不通，所以</span><strong style="font-size: 10pt;">解题的关键就是在for循环条件里下功夫</strong><span style="font-size: 10pt;">。</span><br style="font-size: 10pt;" /><br style="font-size: 10pt;" /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; 首先我们尝试一下修改"int i=0"中的i值，由于要同时满足i&lt;20和i-20&gt;=20，即40&lt;=i&lt;20，显然不可能。</span><br style="font-size: 10pt;" /><br style="font-size: 10pt;" /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; 接着，尝试修改"i&lt;n"这个条件表达式，稍作思考，我们发现如果给i前面加个符号，变成"-i&lt;n"，也就是"i&gt;-20"，那么每次循环依次是0&gt;-20,-1&gt;-20 ... -19&gt;-20正好能运行20次，符合题意！这样，第一种解法就出来了：</span><br style="font-size: 10pt;" /><br style="font-size: 10pt;" /><div style="background-color: #eeeeee; font-size: 10pt; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">20</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</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;</span><span style="color: red;">-</span><span style="color: red;">i</span><span style="color: red;">&lt;</span><span style="color: red;">n</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000; ">--</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">3</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">5</span>&nbsp;<span style="color: #000000; ">}</span></div><br style="font-size: 10pt;" /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; 再看看修改"i--"有没有希望，改成i++显然是不行了，那改一下变量呢？n--？竟然是可以的！每次循环的条件为0&lt;20,0&lt;19 ... 0&lt;1，同样是20次循环，太神奇了！</span><strong style="font-size: 10pt;">这题告诉我们for(int i=0; i&lt;n; n--)也是能做n次循环的</strong><span style="font-size: 10pt;">，虽然我们平常几乎不这么写，因为n往往是不可变的(比如特定数组的长度，容器的size等)。解法二：</span><br style="font-size: 10pt;" /><br style="font-size: 10pt;" /><div style="background-color: #eeeeee; font-size: 10pt; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">20</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</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>n;</span><span style="color: red;"> n</span><span style="color: red;">--</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">3</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">5</span>&nbsp;<span style="color: #000000; ">}</span></div><br style="font-size: 10pt;" /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; 前两种解法总体上还是挺容易想到的，第三种就要绕一些了，我也是想了半天（笨啊o(&gt;﹏&lt;)o）。回到修改"i&lt;n"上，由于在c语言中非0即true，任何一个int值都是可以当布尔值来使的，因此可以试着把"i&lt;n"换成数值，比如i+n,i-n,i*n等等，而i+n恰好符合题意（很诡异的说~）解法三：</span><br style="font-size: 10pt;" /><br style="font-size: 10pt;" /><div style="background-color: #eeeeee; font-size: 10pt; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">20</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(</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;">;</span><span style="color: red;">&nbsp;i</span><span style="color: red;">+</span><span style="color: red;">n</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000; ">--</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">3</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">5</span>&nbsp;<span style="color: #000000; ">}</span></div><br style="font-size: 10pt;" /><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp; 好了，这题基本做完了，不知道还有木有别的解法，有的话给我留言哈O(&#8745;_&#8745;)O</span><span style="font-size: 10pt;"></span><span style="font-size: 10pt;"><br /></span><img src ="http://www.blogjava.net/jswxgdy/aggbug/354309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jswxgdy/" target="_blank">JustJavaIt</a> 2011-07-14 11:47 <a href="http://www.blogjava.net/jswxgdy/archive/2011/07/14/354309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>