<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>西瓜田 &#187; 算法</title>
	<atom:link href="http://blog.thpiano.com/?feed=rss2&#038;tag=%E7%AE%97%E6%B3%95" rel="self" type="application/rss+xml" />
	<link>http://blog.thpiano.com</link>
	<description>无复洛城东</description>
	<lastBuildDate>Tue, 19 Jan 2021 03:54:37 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>2013重庆腾讯实习生笔试的两道题</title>
		<link>http://blog.thpiano.com/?p=787</link>
		<comments>http://blog.thpiano.com/?p=787#comments</comments>
		<pubDate>Sat, 20 Apr 2013 04:37:25 +0000</pubDate>
		<dc:creator>suika</dc:creator>
				<category><![CDATA[编程]]></category>
		<category><![CDATA[2013]]></category>
		<category><![CDATA[实习]]></category>
		<category><![CDATA[笔试]]></category>
		<category><![CDATA[算法]]></category>
		<category><![CDATA[腾讯]]></category>
		<category><![CDATA[腾讯实习生]]></category>
		<category><![CDATA[重庆]]></category>

		<guid isPermaLink="false">http://blog.thpiano.com/?p=787</guid>
		<description><![CDATA[（今天连bluehost好慢 刚刚被虐回来，稍微总结一下 题的范围很广，从TCPIP协议、数据库、算法与数据结构、计算机系统到语言细节，都有涉及 另外今年的笔试题里有10道选择题、5道填空和加分题的第一题都与去年的题目一模一样 OTL…… 没看去年的题亏死了 挑两道印象比较深的题记录下： （都是去年的题，网上都有公开，应该不算是私自公布试卷了吧） 两人猜数字，范围为[1,100]， 甲写一个数字，让乙猜。 如果乙猜的偏小，甲会说偏小，但是如果某一次甲猜的偏大，乙之后都只会说对或不对。 问： 乙最少可以在多少次内保证猜对？在这种策略下，第一个猜的数字是什么？ 看到这道题，首先可以推导出这两问的答案一定是同一数字。若第一次猜X且偏大，则之后需猜X-1次方能保证猜中，即最少需猜X次。 于是递推一下，设最少猜X次才能保证猜对，则第一次必定猜X 第二次要猜多少呢？第二次猜的时候，要保证在猜偏大的情况下，后面再猜X-2次就能保证猜中，所以第二次要猜X+X-1 同理，第三次若猜偏大，后面要再猜X-3次，所以第三次猜的数为X+X-1+X-2……直至猜了N次之后，猜的数>=100 这就是一个初项为X，公差为-1，项数为N的等差数列求和，即约束方程下求X的最小值 ，时有极值，X约为14 答案就是14 14 两个数组a[N]，b[N]，其中A[N]的各个元素值已知 现给b[i]赋值，b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i]； 要求： 1.不准用除法运算 2.除了循环计数值，a[N],b[N]外，不准再用其他任何变量（包括局部变量，全局变量等） 3.满足时间复杂度O（n），空间复杂度O（1） 在编程之美上出现过类似的 这个题不准用其他变量，那只能在a和b上下手了 我的思路是，对于b[i]来说，可以拆成a[0]*a[1]*...*a[i-1]和a[i+1]*a[i+2]*...*a[N-1]两部分，这两部分用O(n)分别求出来，最后再乘起来就行了 代码见下： 12345678910111213141516171819202122232425262728#include &#60;stdio.h&#62; void foo&#40;int a&#91;&#93;, int b&#91;&#93;, int N&#41;&#123; &#160; &#160; b&#91;0&#93; = 1; &#160; &#160; //乘完左边，存在b[i]里。 此时b[i]表示从a[0] * ... *a[i-1]的积 &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>（今天连bluehost好慢<br />
刚刚被虐回来，稍微总结一下<br />
题的范围很广，从TCPIP协议、数据库、算法与数据结构、计算机系统到语言细节，都有涉及</p>
<p>另外今年的笔试题里有10道选择题、5道填空和加分题的第一题都与去年的题目一模一样 OTL……<br />
没看去年的题亏死了</p>
<p>挑两道印象比较深的题记录下：<span id="more-787"></span><br />
（都是去年的题，网上都有公开，应该不算是私自公布试卷了吧）</p>
<pre>两人猜数字，范围为[1,100]， 甲写一个数字，让乙猜。
如果乙猜的偏小，甲会说偏小，但是如果某一次甲猜的偏大，乙之后都只会说对或不对。
问： 乙最少可以在多少次内保证猜对？在这种策略下，第一个猜的数字是什么？</pre>
<p>看到这道题，首先可以推导出这两问的答案一定是同一数字。若第一次猜X且偏大，则之后需猜X-1次方能保证猜中，即最少需猜X次。<br />
于是递推一下，设最少猜X次才能保证猜对，则第一次必定猜X<br />
第二次要猜多少呢？第二次猜的时候，要保证在猜偏大的情况下，后面再猜X-2次就能保证猜中，所以第二次要猜X+X-1<br />
同理，第三次若猜偏大，后面要再猜X-3次，所以第三次猜的数为X+X-1+X-2……直至猜了N次之后，猜的数>=100<br />
这就是一个初项为X，公差为-1，项数为N的等差数列求和，即约束方程<span class='MathJax_Preview'><img src='http://blog.thpiano.com/wp-content/plugins/latex/cache/tex_dad7241a13d5f241260d69fdf52505ce.gif' style='vertical-align: middle; border: none; ' class='tex' alt="X*N-\frac{N*(N-1)}{2}=100 " /></span><script type='math/tex'>X*N-\frac{N*(N-1)}{2}=100 </script>下求X的最小值<br />
<span class='MathJax_Preview'><img src='http://blog.thpiano.com/wp-content/plugins/latex/cache/tex_b9238db689b9d651daf3a1bdeff77822.gif' style='vertical-align: middle; border: none; ' class='tex' alt="X=\frac{100}{N} + \frac{N}{2} - \frac12 " /></span><script type='math/tex'>X=\frac{100}{N} + \frac{N}{2} - \frac12 </script>，<span class='MathJax_Preview'><img src='http://blog.thpiano.com/wp-content/plugins/latex/cache/tex_133a9ec7a667652e009eb5f16f49d45d.gif' style='vertical-align: middle; border: none; ' class='tex' alt="N=\sqrt{200} " /></span><script type='math/tex'>N=\sqrt{200} </script>时有极值，X约为14<br />
答案就是14 14</p>
<hr/>
<br/></p>
<pre>两个数组a[N]，b[N]，其中A[N]的各个元素值已知
现给b[i]赋值，b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i]；
要求：
1.不准用除法运算
2.除了循环计数值，a[N],b[N]外，不准再用其他任何变量（包括局部变量，全局变量等）
3.满足时间复杂度O（n），空间复杂度O（1）</pre>
<p>在编程之美上出现过类似的<br />
这个题不准用其他变量，那只能在a和b上下手了<br />
我的思路是，对于b[i]来说，可以拆成a[0]*a[1]*...*a[i-1]和a[i+1]*a[i+2]*...*a[N-1]两部分，这两部分用O(n)分别求出来，最后再乘起来就行了<br />
代码见下：</p>
<div class="codecolorer-container cpp geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br /></div></td><td><div class="cpp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339900;">#include &lt;stdio.h&gt;</span><br />
<br />
<span style="color: #0000ff;">void</span> foo<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span>, <span style="color: #0000ff;">int</span> b<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span>, <span style="color: #0000ff;">int</span> N<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; b<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; <span style="color: #666666;">//乘完左边，存在b[i]里。 此时b[i]表示从a[0] * ... *a[i-1]的积</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> N<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; b<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> b<span style="color: #008000;">&#91;</span>i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">*</span> a<span style="color: #008000;">&#91;</span>i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #666666;">//乘完右边，存在a[i]里。a[i]表示从a[i] *...*a[N-1]的积</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> N<span style="color: #000040;">-</span><span style="color: #0000dd;">2</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> <span style="color: #000040;">--</span>i<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; a<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">*</span><span style="color: #000080;">=</span> a<span style="color: #008000;">&#91;</span>i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #666666;">//两边乘起来</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> N <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; b<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">*</span><span style="color: #000080;">=</span> a<span style="color: #008000;">&#91;</span>i <span style="color: #000040;">+</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
<span style="color: #008000;">&#125;</span><br />
<br />
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">int</span> a<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #0000dd;">1</span>,<span style="color: #0000dd;">2</span>,<span style="color: #0000dd;">3</span>,<span style="color: #0000dd;">4</span>,<span style="color: #0000dd;">5</span>,<span style="color: #0000dd;">6</span>,<span style="color: #0000dd;">7</span>,<span style="color: #0000dd;">8</span>,<span style="color: #0000dd;">9</span>,<span style="color: #0000dd;">10</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">int</span> b<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; foo<span style="color: #008000;">&#40;</span>a,b,<span style="color: #0000dd;">10</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, b<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
<span style="color: #008000;">&#125;</span></div></td></tr></tbody></table></div>
<p>我这种写法的缺点是改变了输入数组a，这个不太好。把好写法贴一份：</p>
<div class="codecolorer-container cpp geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br /></div></td><td><div class="cpp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;<span style="color: #0000ff;">void</span> problem<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #000040;">*</span> a, <span style="color: #0000ff;">long</span> <span style="color: #0000ff;">long</span><span style="color: #000040;">*</span> b, <span style="color: #0000ff;">int</span> N<span style="color: #008000;">&#41;</span><br />
&nbsp;<span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp;b<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> N<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;b<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> b<span style="color: #008000;">&#91;</span>i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">*</span> a<span style="color: #008000;">&#91;</span>i<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// 分水岭的前半段乘积</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #008000;">&#125;</span><br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp;b<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> a<span style="color: #008000;">&#91;</span>N <span style="color: #000040;">-</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> N <span style="color: #000040;">-</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&gt;=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> <span style="color: #000040;">--</span>i<span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;b<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">*</span><span style="color: #000080;">=</span> b<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;b<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">*</span><span style="color: #000080;">=</span> a<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// 分水岭的后半段乘积，是从数组尾部向前循环的</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #008000;">&#125;</span><br />
&nbsp;<span style="color: #008000;">&#125;</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.thpiano.com/?feed=rss2&#038;p=787</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
