﻿<?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++博客-yuanyuelang-随笔分类-编程之美</title><link>http://www.cppblog.com/yuanyuelang/category/11772.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 15 Sep 2009 02:19:37 GMT</lastBuildDate><pubDate>Tue, 15 Sep 2009 02:19:37 GMT</pubDate><ttl>60</ttl><item><title>数组循环移位</title><link>http://www.cppblog.com/yuanyuelang/archive/2009/09/12/96023.html</link><dc:creator>原语饿狼</dc:creator><author>原语饿狼</author><pubDate>Sat, 12 Sep 2009 14:50:00 GMT</pubDate><guid>http://www.cppblog.com/yuanyuelang/archive/2009/09/12/96023.html</guid><wfw:comment>http://www.cppblog.com/yuanyuelang/comments/96023.html</wfw:comment><comments>http://www.cppblog.com/yuanyuelang/archive/2009/09/12/96023.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yuanyuelang/comments/commentRss/96023.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yuanyuelang/services/trackbacks/96023.html</trackback:ping><description><![CDATA[<span style="FONT-FAMILY: 隶书; FONT-SIZE: 14pt">设计一个算法，把一个含有<em>N</em>个元素的数组循环右移<em>K</em>位，要求时间复杂度为<em>O</em>（<em>N</em>），且只允许使用两个附加变量。<br><br>首先我们来看下解法一，一般人都会想到的
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;rightShift(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;arr,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;k)<br>{<br>&nbsp;&nbsp;k</span><span style="COLOR: #000000">%=</span><span style="COLOR: #000000">n;<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(k</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">){<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;t</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">arr[n</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];<br>&nbsp;&nbsp;&nbsp;&nbsp;</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">n</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arr[i]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">arr[i</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];<br>&nbsp;&nbsp;&nbsp;&nbsp;arr[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">t;<br>&nbsp;&nbsp;}<br>}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span></div>
<br>复杂度为O(k*N)，0&lt;k&lt;N有点不符合要求哈哈。。。<br><br>解法二：我们来举个例子看看清楚啊<br>&nbsp; 比如12345abcde，向右移4个位置，则移动后变为bcde12345a,我们看出bcde和12345a顺序都保存不变，<br>&nbsp; 所，我们可以这样处理啊。。。<br>&nbsp; （1）12345a 反转 a54321<br>&nbsp;&nbsp; (2) bcde反转 edcb&nbsp; 此时数组 a54321edcb<br>&nbsp;&nbsp; （3）哈哈。。看出来了吧。。再反转 bcde12345a<br>&nbsp; 复杂度多少呢O(N)<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;reverse(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">arr,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;begin,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;end)<br>{<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(;begin</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">end;begin</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">,end</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;temp</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">arr[begin];<br>&nbsp;&nbsp;&nbsp;arr[begin]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">arr[end];<br>&nbsp;&nbsp;&nbsp;arr[end]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">temp;<br>&nbsp;&nbsp;}<br>}<br><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;rightShift(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;arr,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;k,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n)<br>{<br>&nbsp;&nbsp;k</span><span style="COLOR: #000000">%=</span><span style="COLOR: #000000">n;<br>&nbsp;&nbsp;reverse(arr,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,n</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">k</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;reverse(arr,n</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">k,n</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;reverse(arr,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,n</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br>}</span></div>
</span>
<img src ="http://www.cppblog.com/yuanyuelang/aggbug/96023.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yuanyuelang/" target="_blank">原语饿狼</a> 2009-09-12 22:50 <a href="http://www.cppblog.com/yuanyuelang/archive/2009/09/12/96023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求二进制中1的个数</title><link>http://www.cppblog.com/yuanyuelang/archive/2009/09/12/96015.html</link><dc:creator>原语饿狼</dc:creator><author>原语饿狼</author><pubDate>Sat, 12 Sep 2009 13:33:00 GMT</pubDate><guid>http://www.cppblog.com/yuanyuelang/archive/2009/09/12/96015.html</guid><wfw:comment>http://www.cppblog.com/yuanyuelang/comments/96015.html</wfw:comment><comments>http://www.cppblog.com/yuanyuelang/archive/2009/09/12/96015.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yuanyuelang/comments/commentRss/96015.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yuanyuelang/services/trackbacks/96015.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="FONT-FAMILY: 隶书; FONT-SIZE: 18pt"> 对于一个正整数，用二进制表示，求其中1的个数<br><br>解法一：<br>&nbsp; 思路：我们一般都会想到模2操作，余1则加1<br>&nbsp;
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;count(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;v)<br>{<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;num</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(v){<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(v</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;v</span><span style="COLOR: #000000">/=</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;num;<br>}</span></div>
</span><br><span style="FONT-FAMILY: 隶书; FONT-SIZE: 18pt">解法二：<br>&nbsp; 思路：位操作，0x01和末位1"与"为1，和末位0"与"为0<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;count(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;v)<br>{<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;num</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(v){<br>&nbsp;&nbsp;&nbsp;&nbsp;num</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">v</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">0x01</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;v</span><span style="COLOR: #000000">&gt;&gt;=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;num;<br>}</span></div>
<br>解法三：<br>我们知道，如果一个数v为2的整数次幂，则v&amp;(v-1)=0;<br>受到这个启发，我们可以让每一次减1，则每次会消灭一个1（从低位到高位），复杂度O(m),m为<br>v中1的个数<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;count(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;v)<br><img id=Codehighlighter1_17_87_Open_Image onclick="this.style.display='none'; Codehighlighter1_17_87_Open_Text.style.display='none'; Codehighlighter1_17_87_Closed_Image.style.display='inline'; Codehighlighter1_17_87_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"></span><span id=Codehighlighter1_17_87_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;num</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_42_71_Open_Image onclick="this.style.display='none'; Codehighlighter1_42_71_Open_Text.style.display='none'; Codehighlighter1_42_71_Closed_Image.style.display='inline'; Codehighlighter1_42_71_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(v){</span><span id=Codehighlighter1_42_71_Open_Text><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;v</span><span style="COLOR: #000000">&amp;=</span><span style="COLOR: #000000">(v</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;num</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;num;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<br>解法四：<br>&nbsp; 如果该整数的范围在一定范围内，且该操作十分频繁，则可以先建立一个查找表，即数组，<br>o(1)的复杂度。<br><br><br><br><br><br><br></span>
<img src ="http://www.cppblog.com/yuanyuelang/aggbug/96015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yuanyuelang/" target="_blank">原语饿狼</a> 2009-09-12 21:33 <a href="http://www.cppblog.com/yuanyuelang/archive/2009/09/12/96015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>