﻿<?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-小明思考-随笔分类-数据结构和算法</title><link>http://www.blogjava.net/sandy/category/51015.html</link><description>Just a software engineer</description><language>zh-cn</language><lastBuildDate>Tue, 04 Jun 2013 11:50:33 GMT</lastBuildDate><pubDate>Tue, 04 Jun 2013 11:50:33 GMT</pubDate><ttl>60</ttl><item><title>Scramble String</title><link>http://www.blogjava.net/sandy/archive/2013/05/22/399605.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Wed, 22 May 2013 14:25:00 GMT</pubDate><guid>http://www.blogjava.net/sandy/archive/2013/05/22/399605.html</guid><wfw:comment>http://www.blogjava.net/sandy/comments/399605.html</wfw:comment><comments>http://www.blogjava.net/sandy/archive/2013/05/22/399605.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sandy/comments/commentRss/399605.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sandy/services/trackbacks/399605.html</trackback:ping><description><![CDATA[<div></div><div><fieldset><legend>Problem</legend><p style="margin: 0px 0px 20px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; "></p><div>Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively.</div><div></div><div>Below is one possible representation of s1 = "great":</div><div></div><div>&nbsp; &nbsp; great</div><div>&nbsp; &nbsp;/ &nbsp; &nbsp;\</div><div>&nbsp; gr &nbsp; &nbsp;eat</div><div>&nbsp;/ \ &nbsp; &nbsp;/ &nbsp;\</div><div>g &nbsp; r &nbsp;e &nbsp; at</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/ \</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a &nbsp; t</div><div>To scramble the string, we may choose any non-leaf node and swap its two children.</div><div></div><div>For example, if we choose the node "gr" and swap its two children, it produces a scrambled string "rgeat".</div><div></div><div>&nbsp; &nbsp; rgeat</div><div>&nbsp; &nbsp;/ &nbsp; &nbsp;\</div><div>&nbsp; rg &nbsp; &nbsp;eat</div><div>&nbsp;/ \ &nbsp; &nbsp;/ &nbsp;\</div><div>r &nbsp; g &nbsp;e &nbsp; at</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/ \</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a &nbsp; t</div><div>We say that "rgeat" is a scrambled string of "great".</div><div></div><div>Similarly, if we continue to swap the children of nodes "eat" and "at", it produces a scrambled string "rgtae".</div><div></div><div>&nbsp; &nbsp; rgtae</div><div>&nbsp; &nbsp;/ &nbsp; &nbsp;\</div><div>&nbsp; rg &nbsp; &nbsp;tae</div><div>&nbsp;/ \ &nbsp; &nbsp;/ &nbsp;\</div><div>r &nbsp; g &nbsp;ta &nbsp;e</div><div>&nbsp; &nbsp; &nbsp; &nbsp;/ \</div><div>&nbsp; &nbsp; &nbsp; t &nbsp; a</div><div>We say that "rgtae" is a scrambled string of "great".</div><div></div><div>Given two strings s1 and s2 of the same length, determine if s2 is a scrambled string of s1.</div><p>&nbsp;</p></fieldset><br />分析：<br /><br />这个问题是google的面试题。由于一个字符串有很多种二叉表示法，貌似很难判断两个字符串是否可以做这样的变换。<br />对付复杂问题的方法是从简单的特例来思考，从而找出规律。<br />先考察简单情况：<br />字符串长度为1：很明显，两个字符串必须完全相同才可以。<br />字符串长度为2：当s1="ab", s2只有"ab"或者"ba"才可以。<br />对于任意长度的字符串，我们可以把字符串s1分为a1,b1两个部分，s2分为a2,b2两个部分，满足（(a1~a2) &amp;&amp; (b1~b2)）或者&nbsp;（(a1~b2) &amp;&amp; (a1~b2)）<br /><br />如此，我们找到了解决问题的思路。首先我们尝试用递归来写。<br /><br /><br />解法一（递归）<br /><br />两个字符串的相似的必备条件是含有相同的字符集。简单的做法是把两个字符串的字符排序后，然后比较是否相同。<br />加上这个检查就可以大大的减少递归次数。<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: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;isScramble(String&nbsp;s1,&nbsp;String&nbsp;s2)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;l1&nbsp;=&nbsp;s1.length();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;l2&nbsp;=&nbsp;s2.length();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(l1!=l2){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(l1==0){<br />&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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>[]&nbsp;c1&nbsp;=&nbsp;s1.toCharArray();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>[]&nbsp;c2&nbsp;=&nbsp;s2.toCharArray();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(l1==1){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;c1[0]==c2[0];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Arrays.sort(c1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Arrays.sort(c2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;l1;++i){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(c1[i]!=c2[i]){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;result&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=1;i&lt;l1&nbsp;&amp;&amp;&nbsp;!result;++i){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s11&nbsp;=&nbsp;s1.substring(0,i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s12&nbsp;=&nbsp;s1.substring(i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s21&nbsp;=&nbsp;s2.substring(0,i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s22&nbsp;=&nbsp;s2.substring(i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;isScramble(s11,s21)&nbsp;&amp;&amp;&nbsp;isScramble(s12,s22);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!result){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s31&nbsp;=&nbsp;s2.substring(0,l1-i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s32&nbsp;=&nbsp;s2.substring(l1-i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;isScramble(s11,s32)&nbsp;&amp;&amp;&nbsp;isScramble(s12,s31);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div></div><div><br />解法二（动态规划）<br />减少重复计算的方法就是动态规划。动态规划是一种神奇的算法技术，不亲自去写，是很难完全掌握动态规划的。<br /><br />这里我使用了一个三维数组boolean result[len][len][len],其中第一维为子串的长度，第二维为s1的起始索引，第三维为s2的起始索引。<br />result[k][i][j]表示s1[i...i+k]是否可以由s2[j...j+k]变化得来。<br /><br />代码如下，非常简洁优美：<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: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Solution&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;isScramble(String&nbsp;s1,&nbsp;String&nbsp;s2)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;len&nbsp;=&nbsp;s1.length();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(len!=s2.length()){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(len==0){<br />&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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>[]&nbsp;c1&nbsp;=&nbsp;s1.toCharArray();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>[]&nbsp;c2&nbsp;=&nbsp;s2.toCharArray();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>[][][]&nbsp;result&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">boolean</span>[len][len][len];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;len;++i){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j=0;j&lt;len;++j){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result[0][i][j]&nbsp;=&nbsp;(c1[i]==c2[j]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;k=2;k&lt;=len;++k){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=len-k;i&gt;=0;--i){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j=len-k;j&gt;=0;--j){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;r&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;m=1;m&lt;k&nbsp;&amp;&amp;&nbsp;!r;++m){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;=&nbsp;(result[m-1][i][j]&nbsp;&amp;&amp;&nbsp;result[k-m-1][i+m][j+m])&nbsp;||&nbsp;(result[m-1][i][j+k-m]&nbsp;&amp;&amp;&nbsp;result[k-m-1][i+m][j]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result[k-1][i][j]&nbsp;=&nbsp;r;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result[len-1][0][0];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div></div><img src ="http://www.blogjava.net/sandy/aggbug/399605.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sandy/" target="_blank">小明</a> 2013-05-22 22:25 <a href="http://www.blogjava.net/sandy/archive/2013/05/22/399605.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Subsets</title><link>http://www.blogjava.net/sandy/archive/2013/05/21/399521.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Tue, 21 May 2013 14:50:00 GMT</pubDate><guid>http://www.blogjava.net/sandy/archive/2013/05/21/399521.html</guid><wfw:comment>http://www.blogjava.net/sandy/comments/399521.html</wfw:comment><comments>http://www.blogjava.net/sandy/archive/2013/05/21/399521.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sandy/comments/commentRss/399521.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sandy/services/trackbacks/399521.html</trackback:ping><description><![CDATA[<div></div><div><fieldset><legend>Problem</legend><p style="margin: 0px 0px 20px; padding: 0px; border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline; color: #222222; font-family: 'Helvetica Neue', arial, sans-serif; ">Given a collection of integers that might contain duplicates,&nbsp;<em style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; ">S</em>, return all possible subsets.</p><p style="margin: 0px 0px 20px; padding: 0px; border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline; color: #222222; font-family: 'Helvetica Neue', arial, sans-serif; "><strong style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; ">Note:</strong><br style="margin: 0px; " /></p><ul style="margin: 0px 0px 18px 40px; padding: 0px; border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline; list-style-position: initial; list-style-image: initial; color: #222222; font-family: 'Helvetica Neue', arial, sans-serif; "><li style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; ">Elements in a subset must be in non-descending order.</li><li style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; ">The solution set must not contain duplicate subsets.</li></ul><p style="margin: 0px 0px 20px; padding: 0px; border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline; color: #222222; font-family: 'Helvetica Neue', arial, sans-serif; "></p><p style="margin: 0px 0px 20px; padding: 0px; border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline; color: #222222; font-family: 'Helvetica Neue', arial, sans-serif; ">For example,<br style="margin: 0px; " />If&nbsp;<strong style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; "><em style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; ">S</em></strong>&nbsp;=&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; outline: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">[1,2,2]</code>, a solution is:</p><pre style="margin-top: 0px; margin-bottom: 24px; padding: 10px; border: 1px solid #cccccc; outline: 0px; font-size: 13px; vertical-align: baseline; background-image: none; background-attachment: scroll; background-color: #fff7f0; overflow: auto; color: #222222; background-position: 0px 0px; background-repeat: repeat repeat; ">[   [2],   [1],   [1,2,2],   [2,2],   [1,2],   [] ] </pre><a href="http://leetcode.com/onlinejudge#" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline; text-decoration: none; color: #0000ff; font-family: 'Helvetica Neue', arial, sans-serif; "></a></fieldset><br />分析：<br />因为要求结果集是升序排列，所以首先我们要对数组进行排序。<br /><br />子集的长度可以从0到整个数组的长度。长度为n+1的子集可以由长度为n的子集再加上在之后的一个元素组成。<br /><br />这里我使用了三个技巧<br />1。使用了一个index数组来记录每个子集的最大索引，这样添加新元素就很简单。<br />2。使用了两个变量start和end来记录上一个长度的子集在结果中的起始和终止位置。<br />3。去重处理使用了一个last变量记录前一次的值，它的初始值设为S[0]-1,这样就保证了和数组的任何一个元素不同。<br /><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: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Solution&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;ArrayList&lt;ArrayList&lt;Integer&gt;&gt;&nbsp;subsetsWithDup(<span style="color: #0000FF; ">int</span>[]&nbsp;S)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Arrays.sort(S);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrayList&lt;ArrayList&lt;Integer&gt;&gt;&nbsp;result&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ArrayList&lt;ArrayList&lt;Integer&gt;&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrayList&lt;Integer&gt;&nbsp;indexs&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ArrayList&lt;Integer&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.add(<span style="color: #0000FF; ">new</span>&nbsp;ArrayList&lt;Integer&gt;());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indexs.add(-1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;slen&nbsp;=&nbsp;S.length;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;start=0,end=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;len=1;len&lt;=slen;++len){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;e&nbsp;=&nbsp;end;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=start;i&lt;=end;++i){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrayList&lt;Integer&gt;&nbsp;ss&nbsp;=&nbsp;result.get(i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;index&nbsp;=&nbsp;indexs.get(i).intValue();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;last&nbsp;=&nbsp;S[0]-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;index+1;j&lt;slen;++j){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v&nbsp;=&nbsp;S[j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(v!=last){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrayList&lt;Integer&gt;&nbsp;newss&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ArrayList&lt;Integer&gt;(ss);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newss.add(v);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.add(newss);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indexs.add(j);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last&nbsp;=&nbsp;v;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start&nbsp;=&nbsp;end+1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;=&nbsp;e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div></div><div></div><img src ="http://www.blogjava.net/sandy/aggbug/399521.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sandy/" target="_blank">小明</a> 2013-05-21 22:50 <a href="http://www.blogjava.net/sandy/archive/2013/05/21/399521.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>格雷码</title><link>http://www.blogjava.net/sandy/archive/2013/05/20/399526.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Mon, 20 May 2013 13:09:00 GMT</pubDate><guid>http://www.blogjava.net/sandy/archive/2013/05/20/399526.html</guid><wfw:comment>http://www.blogjava.net/sandy/comments/399526.html</wfw:comment><comments>http://www.blogjava.net/sandy/archive/2013/05/20/399526.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sandy/comments/commentRss/399526.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sandy/services/trackbacks/399526.html</trackback:ping><description><![CDATA[<div><fieldset><legend>问题</legend>格雷码是一个二进制的编码系统，相邻的两个数只有一位是不同的。<br />给定一个非负的整数n，代表了格雷码的位的总数。输出格雷码的序列，这个序列必须以0开始。<br /><br />比如，给定n=2,输出［0，1，3，2］，格雷码是<br />0 ＝ 00<br />1 ＝ 01<br />3 ＝ 11<br />2 ＝ 10<br /><br />注：格雷码的序列并不是唯一，比如n=2时，［0，2，3，1］也满足条件。<br /></fieldset><br /><br />分析：<br />格雷码的序列中应包含2^n个数。这个问题初看起来不容易，我们要想出一个生成方法。<br /><br />对于n=2,序列是：<br />00，01，11，10<br />那对于n=3,如何利用n=2的序列呢？一个方法是，先在n=2的四个序列前加0（这其实是保持不变），然后再考虑把最高位变成1，只需要把方向反过来就可以了<br />000，001，011，010<br />100，101，111，110－&gt; 110,111,101,100<br />把这两行合起来就可以得到新的序列。<br /><br />想通了，写代码就很容易了。<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: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Solution&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;ArrayList&lt;Integer&gt;&nbsp;grayCode(<span style="color: #0000FF; ">int</span>&nbsp;n)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrayList&lt;Integer&gt;&nbsp;result&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ArrayList&lt;Integer&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.add(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(n&gt;0){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.add(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;mask&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=2;i&lt;=n;++i){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mask&nbsp;*=&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j=result.size()-1;j&gt;=0;--j){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v&nbsp;=&nbsp;result.get(j).intValue();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v&nbsp;|=&nbsp;mask;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.add(v);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div></div><img src ="http://www.blogjava.net/sandy/aggbug/399526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sandy/" target="_blank">小明</a> 2013-05-20 21:09 <a href="http://www.blogjava.net/sandy/archive/2013/05/20/399526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>交叉字符串</title><link>http://www.blogjava.net/sandy/archive/2013/05/10/398754.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Fri, 10 May 2013 12:47:00 GMT</pubDate><guid>http://www.blogjava.net/sandy/archive/2013/05/10/398754.html</guid><wfw:comment>http://www.blogjava.net/sandy/comments/398754.html</wfw:comment><comments>http://www.blogjava.net/sandy/archive/2013/05/10/398754.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/sandy/comments/commentRss/398754.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sandy/services/trackbacks/398754.html</trackback:ping><description><![CDATA[<div><fieldset><legend>问题</legend>给定字符串s1,s2,s3,判断s3是否可以由s1和s2交叉组成得到。<br /><br />例如：<br /><br /><p style="margin: 0px 0px 20px; padding: 0px; border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline; color: #222222; font-family: 'Helvetica Neue', arial, sans-serif; "><em style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; ">s1</em>&nbsp;=&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; outline: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">"aabcc"</code>,<br style="margin: 0px; " /><em style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; ">s2</em>&nbsp;=&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; outline: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">"dbbca"</code>,</p><p style="margin: 0px 0px 20px; padding: 0px; border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline; color: #222222; font-family: 'Helvetica Neue', arial, sans-serif; ">When&nbsp;<em style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; ">s3</em>&nbsp;=&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; outline: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">"aadbbcbcac"</code>, return true.<br style="margin: 0px; " />When&nbsp;<em style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; ">s3</em>&nbsp;=&nbsp;<code style="margin: 0px; padding: 1px 5px; border: 0px; outline: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">"aadbbbaccc"</code>, return false.</p></fieldset><br />解法一：（递归）<br /><br />一个简单的想法，是遍历s3的每个字符，这个字符必须等于s1和s2的某个字符。如果都不相等，则返回false<br />我们使用3个变量i,j,k分别记录当前s1,s2,s3的字符位置。<br />如果s3[k] = s1[i], i向后移动一位。如果s3[k]=s2[j],j向后移动一位。<br />这个题目主要难在如果s1和s2的字符出现重复的时候，就有两种情况，i,j都可以向后一位。<br />下面的算法在这种情况使用了递归，很简单的做法。但是效率非常差，是指数复杂度的。<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: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Solution&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;isInterleave(String&nbsp;s1,&nbsp;String&nbsp;s2,&nbsp;String&nbsp;s3)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;l1&nbsp;=&nbsp;s1.length();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;l2&nbsp;=&nbsp;s2.length();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;l3&nbsp;=&nbsp;s3.length();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(l1+l2!=l3){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>[]&nbsp;c1&nbsp;=&nbsp;s1.toCharArray();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>[]&nbsp;c2&nbsp;=&nbsp;s2.toCharArray();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>[]&nbsp;c3&nbsp;=&nbsp;s3.toCharArray();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;i=0,j=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;k=0;k&lt;l3;++k){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;c&nbsp;=&nbsp;c3[k];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;m1&nbsp;=&nbsp;i&lt;l1&nbsp;&amp;&amp;&nbsp;c==c1[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;m2&nbsp;=&nbsp;j&lt;l2&nbsp;&amp;&amp;&nbsp;c==c2[j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!m1&nbsp;&amp;&amp;&nbsp;!m2){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&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>(m1&nbsp;&amp;&amp;&nbsp;m2){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;news3&nbsp;=&nbsp;&nbsp;s3.substring(k+1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;isInterleave(s1.substring(i+1),s2.substring(j),news3)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;isInterleave(s1.substring(i),s2.substring(j+1),news3);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&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>(m1){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br /><br />解法二：（动态规划）<br />为了减少重复计算，就要使用动态规划来记录中间结果。<br /><br />这里我使用了一个二维数组result[i][j]来表示s1的前i个字符和s2的前j个字符是否能和s3的前i+j个字符匹配。<br /><br />状态转移方程如下：<br />result[i,j] = (result[i-1,j] &amp;&amp; s1[i] = s3[i+j]) &nbsp;|| (result[i,j-1] &amp;&amp; s2[j] = s3[i+j]);<br />其中0&#8804;i&#8804;len(s1) ,0&#8804;j&#8804;len(s2)</div><div><br />这样算法复杂度就会下降到O(l1*l2)<br /></div><div><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: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Solution&nbsp;{<br />&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;isInterleave(String&nbsp;s1,&nbsp;String&nbsp;s2,&nbsp;String&nbsp;s3)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;l1&nbsp;=&nbsp;s1.length();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;l2&nbsp;=&nbsp;s2.length();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;l3&nbsp;=&nbsp;s3.length();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(l1+l2!=l3){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>[]&nbsp;c1&nbsp;=&nbsp;s1.toCharArray();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>[]&nbsp;c2&nbsp;=&nbsp;s2.toCharArray();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>[]&nbsp;c3&nbsp;=&nbsp;s3.toCharArray();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>[][]&nbsp;result&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">boolean</span>[l1+1][l2+1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result[0][0]&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;l1;++i){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(c1[i]==c3[i]){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result[i+1][0]&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j=0;j&lt;l2;++j){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(c2[j]==c3[j]){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result[0][j+1]&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=1;i&lt;=l1;++i){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;ci&nbsp;=&nbsp;c1[i-1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j=1;j&lt;=l2;++j){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;cj&nbsp;=&nbsp;c2[j-1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;ck&nbsp;=&nbsp;c3[i+j-1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result[i][j]&nbsp;=&nbsp;(result[i][j-1]&nbsp;&amp;&amp;&nbsp;cj==ck)&nbsp;||&nbsp;(result[i-1][j]&nbsp;&amp;&amp;&nbsp;ci==ck);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result[l1][l2];<br />&nbsp;&nbsp;&nbsp;}<br />}</div></div><img src ="http://www.blogjava.net/sandy/aggbug/398754.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sandy/" target="_blank">小明</a> 2013-05-10 20:47 <a href="http://www.blogjava.net/sandy/archive/2013/05/10/398754.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>三个数之和</title><link>http://www.blogjava.net/sandy/archive/2013/05/01/398604.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Wed, 01 May 2013 15:13:00 GMT</pubDate><guid>http://www.blogjava.net/sandy/archive/2013/05/01/398604.html</guid><wfw:comment>http://www.blogjava.net/sandy/comments/398604.html</wfw:comment><comments>http://www.blogjava.net/sandy/archive/2013/05/01/398604.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sandy/comments/commentRss/398604.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sandy/services/trackbacks/398604.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 给定一个由n个整数组成的数组S，是否存在S中的三个数a,b,c使得 a+b+c=0?找出所有的不重复的和为0的三元组。<br><br>注意：<br>1.三元组的整数按照升序排列 a<b<c<br>2.给出的结果中不能含有相同的三元组&nbsp;&nbsp;<a href='http://www.blogjava.net/sandy/archive/2013/05/01/398604.html'>阅读全文</a><img src ="http://www.blogjava.net/sandy/aggbug/398604.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sandy/" target="_blank">小明</a> 2013-05-01 23:13 <a href="http://www.blogjava.net/sandy/archive/2013/05/01/398604.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>子序列计数</title><link>http://www.blogjava.net/sandy/archive/2013/04/26/398467.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Fri, 26 Apr 2013 15:33:00 GMT</pubDate><guid>http://www.blogjava.net/sandy/archive/2013/04/26/398467.html</guid><wfw:comment>http://www.blogjava.net/sandy/comments/398467.html</wfw:comment><comments>http://www.blogjava.net/sandy/archive/2013/04/26/398467.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sandy/comments/commentRss/398467.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sandy/services/trackbacks/398467.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 给定两个字符串S和T，计算S的子序列为T的个数。<br><br>这里的字符串的子序列指的是删除字符串的几个字符（也可以不删）而得到的新的字符串，但是不能改变字符的相对位置。<br><br>比如“ACE”是“ABCDE”的子序列，但是“AEC”就不是。<br><br>如果S＝“rabbbit” T＝“rabit”，有3种不同的子序列为T的构成方法，那么结果应该返回3。&nbsp;&nbsp;<a href='http://www.blogjava.net/sandy/archive/2013/04/26/398467.html'>阅读全文</a><img src ="http://www.blogjava.net/sandy/aggbug/398467.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sandy/" target="_blank">小明</a> 2013-04-26 23:33 <a href="http://www.blogjava.net/sandy/archive/2013/04/26/398467.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设置二叉树的next节点</title><link>http://www.blogjava.net/sandy/archive/2013/04/26/398413.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Fri, 26 Apr 2013 03:23:00 GMT</pubDate><guid>http://www.blogjava.net/sandy/archive/2013/04/26/398413.html</guid><wfw:comment>http://www.blogjava.net/sandy/comments/398413.html</wfw:comment><comments>http://www.blogjava.net/sandy/archive/2013/04/26/398413.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sandy/comments/commentRss/398413.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sandy/services/trackbacks/398413.html</trackback:ping><description><![CDATA[<div></div>
<div><fieldset><legend>问题</legend>给定一颗二叉树：<br />
<div>class TreeLinkNode {</div>
<div>&nbsp; TreeLinkNode left;</div>
<div>&nbsp; TreeLinkNode right;</div>
<div>&nbsp; TreeLinkNode next;</div>
<div>}</div>
要求把所有节点的next节点设置成它右边的节点，如果没有右节点，设置成空。初始状态，所有的next的指针均为null.<br />
<br />
要求:你只能使用常数的空间。<br />
<br />
比如：<br />
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp;/ &nbsp;\</div>
<div>&nbsp; &nbsp; &nbsp; 2 &nbsp; &nbsp;3</div>
<div>&nbsp; &nbsp; &nbsp;/ \ &nbsp; &nbsp;\</div>
<div>&nbsp; &nbsp; 4 &nbsp; 5 &nbsp; &nbsp;7<br />
应该输出：<br />
<br />
<div><span style="white-space:pre">	</span>1 -&gt; NULL</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp;/ &nbsp;\</div>
<div>&nbsp; &nbsp; &nbsp; 2 -&gt; 3 -&gt; NULL</div>
<div>&nbsp; &nbsp; &nbsp;/ \ &nbsp; &nbsp;\</div>
<div>&nbsp; &nbsp; 4-&gt; 5 -&gt; 7 -&gt; NULL</div>
</div>
</fieldset></div>
<div></div><br />分析：<br />题目不难，但是在面试时，在有限的时间内，没有bug写出，还是很考验功力的。<br /><br />解决这个问题的思路是逐层扫描，上一层设置好下一层的next关系，在处理空指针的时候要格外小心。<br />代码如下，有注释，应该很容易看懂：<br />使用了三个指针：<br />node:当前节点<br />firstChild:下一层的第一个非空子节点<br />lastChild:下一层的最后一个待处理（未设置next)的子节点<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 />-->&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;connect(TreeLinkNode&nbsp;root)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TreeLinkNode&nbsp;node&nbsp;=&nbsp;root;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TreeLinkNode&nbsp;firstChild&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TreeLinkNode&nbsp;lastChild&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(node!=<span style="color: #0000FF; ">null</span>){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(firstChild&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>){&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">记录第一个非空子节点</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;firstChild&nbsp;=&nbsp;node.left!=<span style="color: #0000FF; ">null</span>?node.left:node.right;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">设置子节点的next关系，3种情况</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(node.left!=<span style="color: #0000FF; ">null</span>&nbsp;&amp;&amp;&nbsp;node.right!=<span style="color: #0000FF; ">null</span>){&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(lastChild!=<span style="color: #0000FF; ">null</span>){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastChild.next&nbsp;=&nbsp;node.left;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.left.next&nbsp;=&nbsp;node.right;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastChild&nbsp;=&nbsp;node.right;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&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>(node.left!=<span style="color: #0000FF; ">null</span>){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(lastChild!=<span style="color: #0000FF; ">null</span>){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastChild.next&nbsp;=&nbsp;node.left;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastChild&nbsp;=&nbsp;node.left;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&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>(node.right!=<span style="color: #0000FF; ">null</span>){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(lastChild!=<span style="color: #0000FF; ">null</span>){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastChild.next&nbsp;=&nbsp;node.right;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastChild&nbsp;=&nbsp;node.right;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">设置下一个节点，如果本层已经遍历完毕，移到下一层的第一个子节点</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(node.next!=<span style="color: #0000FF; ">null</span>){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;=&nbsp;node.next;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;=&nbsp;firstChild;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;firstChild&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastChild&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><img src ="http://www.blogjava.net/sandy/aggbug/398413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sandy/" target="_blank">小明</a> 2013-04-26 11:23 <a href="http://www.blogjava.net/sandy/archive/2013/04/26/398413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最佳的股票买卖时间III</title><link>http://www.blogjava.net/sandy/archive/2013/04/25/398406.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Thu, 25 Apr 2013 14:22:00 GMT</pubDate><guid>http://www.blogjava.net/sandy/archive/2013/04/25/398406.html</guid><wfw:comment>http://www.blogjava.net/sandy/comments/398406.html</wfw:comment><comments>http://www.blogjava.net/sandy/archive/2013/04/25/398406.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sandy/comments/commentRss/398406.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sandy/services/trackbacks/398406.html</trackback:ping><description><![CDATA[<fieldset><legend>问题</legend><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">假设你有一个数组包含了每天的股票价格，它的第i个元素就是第i天的股票价格。&nbsp;</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; " /><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; " /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">设计一个算法寻找最大的收益。你可以最多进行两次交易。<br />注意：你不能同时进行多次交易，也就是说你买股票之前，必须卖掉手中股票。</span><br /></fieldset><br />分析：<br />这道题相比之前的两道题，难度提高了不少。<br /><br />因为限制了只能交易两次，所以我们可以把n天分为两段，分别计算这两段的最大收益，就可以得到一个最大收益。穷举所有这样的分法，就可以得到全局的最大收益。<br /><br />为了提高效率，这里使用动态规划，即把中间状态记录下来。使用了两个数组profits，nprofits分别记录从0..i和i..n的最大收益。<br /><br />代码如下：<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: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;maxProfit(<span style="color: #0000FF; ">int</span>[]&nbsp;prices)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;days&nbsp;=&nbsp;prices.length;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(days&lt;2){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>[]&nbsp;profits&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">int</span>[days];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;min&nbsp;=&nbsp;prices[0];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;max&nbsp;=&nbsp;min;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=1;i&lt;days;++i){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;p&nbsp;=&nbsp;prices[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(min&gt;p){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max&nbsp;=&nbsp;min&nbsp;=&nbsp;p;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&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>(max&lt;p){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max&nbsp;=&nbsp;p;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;profit&nbsp;=&nbsp;max&nbsp;-&nbsp;min;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;profits[i]&nbsp;=&nbsp;(profits[i-1]&gt;profit)?profits[i-1]:profit;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>[]&nbsp;nprofits&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">int</span>[days];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nprofits[days-1]&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max&nbsp;=&nbsp;min&nbsp;=&nbsp;prices[days-1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=days-2;i&gt;=0;--i){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;p&nbsp;=&nbsp;prices[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(min&gt;p){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min&nbsp;=p;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&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>(max&lt;p){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max&nbsp;=&nbsp;min&nbsp;=&nbsp;p;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;profit&nbsp;=&nbsp;max&nbsp;-&nbsp;min;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nprofits[i]&nbsp;=&nbsp;(nprofits[i+1]&gt;profit)?nprofits[i+1]:profit;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;maxprofit&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;days;++i){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;profit&nbsp;=&nbsp;profits[i]+nprofits[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(maxprofit&lt;profit){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxprofit&nbsp;=&nbsp;profit;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;maxprofit;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><img src ="http://www.blogjava.net/sandy/aggbug/398406.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sandy/" target="_blank">小明</a> 2013-04-25 22:22 <a href="http://www.blogjava.net/sandy/archive/2013/04/25/398406.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最佳的股票买卖时间II</title><link>http://www.blogjava.net/sandy/archive/2013/04/19/398104.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Fri, 19 Apr 2013 13:50:00 GMT</pubDate><guid>http://www.blogjava.net/sandy/archive/2013/04/19/398104.html</guid><wfw:comment>http://www.blogjava.net/sandy/comments/398104.html</wfw:comment><comments>http://www.blogjava.net/sandy/archive/2013/04/19/398104.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sandy/comments/commentRss/398104.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sandy/services/trackbacks/398104.html</trackback:ping><description><![CDATA[<div><fieldset><legend>问题</legend><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">假设你有一个数组包含了每天的股票价格，它的第i个元素就是第i天的股票价格。<br /><br /></span>设计一个算法寻找最大的收益。你可以进行任意多次交易。但是，你不能同时进行多次交易，也就是说你买股票之前，必须卖掉手中股票。</fieldset><br />分析：为了得到最大收益，必须在所有上升的曲线段的开始点买入，在最高点卖出。而在下降阶段不出手。<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/sandy/stock.jpg" border="0" alt="" width="328" height="158" /><br /><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: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Solution&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;maxProfit(<span style="color: #0000FF; ">int</span>[]&nbsp;prices)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;len&nbsp;=&nbsp;prices.length;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(len&lt;2){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;min=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;result&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;inBuy&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;len-1;++i){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;p&nbsp;=&nbsp;prices[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;q&nbsp;=&nbsp;prices[i+1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!inBuy){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(q&gt;p){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inBuy&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min=p&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(q&lt;p){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;+=&nbsp;(p-min);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inBuy&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(inBuy){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;+=&nbsp;((prices[len-1])-min);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div></div><img src ="http://www.blogjava.net/sandy/aggbug/398104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sandy/" target="_blank">小明</a> 2013-04-19 21:50 <a href="http://www.blogjava.net/sandy/archive/2013/04/19/398104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最佳的股票买卖时间</title><link>http://www.blogjava.net/sandy/archive/2013/04/19/398087.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Fri, 19 Apr 2013 07:03:00 GMT</pubDate><guid>http://www.blogjava.net/sandy/archive/2013/04/19/398087.html</guid><wfw:comment>http://www.blogjava.net/sandy/comments/398087.html</wfw:comment><comments>http://www.blogjava.net/sandy/archive/2013/04/19/398087.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sandy/comments/commentRss/398087.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sandy/services/trackbacks/398087.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 假设你有一个数组包含了每天的股票价格，它的第i个元素就是第i天的股票价格。<br><br>你只能进行一次交易（一次买进和一次卖出），设计一个算法求出最大的收益。&nbsp;&nbsp;<a href='http://www.blogjava.net/sandy/archive/2013/04/19/398087.html'>阅读全文</a><img src ="http://www.blogjava.net/sandy/aggbug/398087.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sandy/" target="_blank">小明</a> 2013-04-19 15:03 <a href="http://www.blogjava.net/sandy/archive/2013/04/19/398087.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二叉树最大的路径和</title><link>http://www.blogjava.net/sandy/archive/2013/04/18/398054.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Thu, 18 Apr 2013 13:31:00 GMT</pubDate><guid>http://www.blogjava.net/sandy/archive/2013/04/18/398054.html</guid><wfw:comment>http://www.blogjava.net/sandy/comments/398054.html</wfw:comment><comments>http://www.blogjava.net/sandy/archive/2013/04/18/398054.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sandy/comments/commentRss/398054.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sandy/services/trackbacks/398054.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 给定一个二叉树，寻找最大的路径和.<br>路径可以从任意节点开始到任意节点结束。（也可以是单个节点）<br><br>比如：对于二叉树<br>   1<br>  /  \<br>2    3<br>和最大的路径是2->1->3，结果为6<br>/**<br> * Definition for binary tree<br> * public class TreeNode {<br> *     int val;<br> *     TreeNode left;<br> *     TreeNode right;<br> *     TreeNode(int x) { val = x; }<br> * }<br> */&nbsp;&nbsp;<a href='http://www.blogjava.net/sandy/archive/2013/04/18/398054.html'>阅读全文</a><img src ="http://www.blogjava.net/sandy/aggbug/398054.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sandy/" target="_blank">小明</a> 2013-04-18 21:31 <a href="http://www.blogjava.net/sandy/archive/2013/04/18/398054.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字梯游戏II</title><link>http://www.blogjava.net/sandy/archive/2013/04/18/398045.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Thu, 18 Apr 2013 09:32:00 GMT</pubDate><guid>http://www.blogjava.net/sandy/archive/2013/04/18/398045.html</guid><wfw:comment>http://www.blogjava.net/sandy/comments/398045.html</wfw:comment><comments>http://www.blogjava.net/sandy/archive/2013/04/18/398045.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sandy/comments/commentRss/398045.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sandy/services/trackbacks/398045.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 给定两个单词(一个开始，一个结束）和一个字典，找出所有的最短的从开始单词到结束单词的变换序列的序列（可能不止一个），并满足：<br><br>1.每次只能变换一个字母<br>2.所有的中间单词必须存在于字典中<br><br>比如：<br>输入：<br>start = "hit"<br>end = "cog"<br>dict = ["hot","dot","dog","lot","log"]<br><br>那么最短的变化序列有两个<br>["hit","hot","dot","dog","cog"],<br>["hit","hot","lot","log","cog"]。<br>注意：<br>1. 所有单词的长度都是相同的<br>2. 所有单词都只含有小写的字母。&nbsp;&nbsp;<a href='http://www.blogjava.net/sandy/archive/2013/04/18/398045.html'>阅读全文</a><img src ="http://www.blogjava.net/sandy/aggbug/398045.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sandy/" target="_blank">小明</a> 2013-04-18 17:32 <a href="http://www.blogjava.net/sandy/archive/2013/04/18/398045.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>合并排序好的数组</title><link>http://www.blogjava.net/sandy/archive/2013/04/18/398017.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Thu, 18 Apr 2013 05:44:00 GMT</pubDate><guid>http://www.blogjava.net/sandy/archive/2013/04/18/398017.html</guid><wfw:comment>http://www.blogjava.net/sandy/comments/398017.html</wfw:comment><comments>http://www.blogjava.net/sandy/archive/2013/04/18/398017.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sandy/comments/commentRss/398017.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sandy/services/trackbacks/398017.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 给定两个排序好的数组A和B,把B合并到A并保持排序。<br><br>public class Solution {<br>    public void merge(int A[], int m, int B[], int n) {<br>//write your code here   }<br>}<br><br>注意：<br>假定A有足够的额外的容量储存B的内容，m和n分别为A和B的初始化元素的个数。要求算法复杂度在O(m+n)。&nbsp;&nbsp;<a href='http://www.blogjava.net/sandy/archive/2013/04/18/398017.html'>阅读全文</a><img src ="http://www.blogjava.net/sandy/aggbug/398017.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sandy/" target="_blank">小明</a> 2013-04-18 13:44 <a href="http://www.blogjava.net/sandy/archive/2013/04/18/398017.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字梯游戏</title><link>http://www.blogjava.net/sandy/archive/2013/04/18/398014.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Thu, 18 Apr 2013 04:46:00 GMT</pubDate><guid>http://www.blogjava.net/sandy/archive/2013/04/18/398014.html</guid><wfw:comment>http://www.blogjava.net/sandy/comments/398014.html</wfw:comment><comments>http://www.blogjava.net/sandy/archive/2013/04/18/398014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sandy/comments/commentRss/398014.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sandy/services/trackbacks/398014.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 给定两个单词(一个开始，一个结束）和一个字典，找出最短的从开始单词到结束单词的变换序列的长度，并满足：<br><br>1.每次只能变换一个字母<br>2.所有的中间单词必须存在于字典中<br><br>比如：<br>输入：<br>start = "hit"<br>end = "cog"<br>dict = ["hot","dot","dog","lot","log"]<br><br>那么最短的变化序列是"hit" -> "hot" -> "dot" -> "dog" -> "cog"，所以返回长度是5。<br>注意：<br>1. 如果找不到这样的序列，返回0<br>2. 所有单词的长度都是相同的<br>3. 所有单词都只含有小写的字母。&nbsp;&nbsp;<a href='http://www.blogjava.net/sandy/archive/2013/04/18/398014.html'>阅读全文</a><img src ="http://www.blogjava.net/sandy/aggbug/398014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sandy/" target="_blank">小明</a> 2013-04-18 12:46 <a href="http://www.blogjava.net/sandy/archive/2013/04/18/398014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二叉树求和问题</title><link>http://www.blogjava.net/sandy/archive/2013/04/16/397901.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Tue, 16 Apr 2013 03:37:00 GMT</pubDate><guid>http://www.blogjava.net/sandy/archive/2013/04/16/397901.html</guid><wfw:comment>http://www.blogjava.net/sandy/comments/397901.html</wfw:comment><comments>http://www.blogjava.net/sandy/archive/2013/04/16/397901.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sandy/comments/commentRss/397901.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sandy/services/trackbacks/397901.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 给定一个二叉树，每个节点的值是一个数字（0-9），每个从根节点到叶节点均能组成一个数字。<br>比如如果从根节点到叶节点的路径是1-2-3，那么这代表了123这个数字。<br>求出所有这样从根节点到叶节点的数字之和。<br><br>比如，对于二叉树<br>  1<br> /  \<br>2   3<br><br>一共有两条路径1->2和1->3，那么求和的结果就是12+13=25<br>/**<br> * Definition for binary tree<br> * public class TreeNode {<br> *     int val;<br> *     TreeNode left;<br> *     TreeNode right;<br> *     TreeNode(int x) { val = x; }<br> * }<br> */<br>public class Solution {<br>    public int sumNumbers(TreeNode root) {<br>        //write c&nbsp;&nbsp;<a href='http://www.blogjava.net/sandy/archive/2013/04/16/397901.html'>阅读全文</a><img src ="http://www.blogjava.net/sandy/aggbug/397901.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sandy/" target="_blank">小明</a> 2013-04-16 11:37 <a href="http://www.blogjava.net/sandy/archive/2013/04/16/397901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>包围的区域</title><link>http://www.blogjava.net/sandy/archive/2013/04/15/397875.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Mon, 15 Apr 2013 10:17:00 GMT</pubDate><guid>http://www.blogjava.net/sandy/archive/2013/04/15/397875.html</guid><wfw:comment>http://www.blogjava.net/sandy/comments/397875.html</wfw:comment><comments>http://www.blogjava.net/sandy/archive/2013/04/15/397875.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/sandy/comments/commentRss/397875.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sandy/services/trackbacks/397875.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 给定一个2D的棋盘，含有‘X'和’O'，找到所有被‘X'包围的’O'，然后把该区域的‘O’都变成'X'。<br><br>例子-输入：<br>X X X X<br>X O O X<br>X X O X<br>X O X X<br><br>应该输出：<br><br>X X X X<br>X X X X<br>X X X X<br>X O X X<br><br>public void solve(char[][] board) {<br>}&nbsp;&nbsp;<a href='http://www.blogjava.net/sandy/archive/2013/04/15/397875.html'>阅读全文</a><img src ="http://www.blogjava.net/sandy/aggbug/397875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sandy/" target="_blank">小明</a> 2013-04-15 18:17 <a href="http://www.blogjava.net/sandy/archive/2013/04/15/397875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>回文字符串的切割问题2</title><link>http://www.blogjava.net/sandy/archive/2013/04/15/397847.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Mon, 15 Apr 2013 05:52:00 GMT</pubDate><guid>http://www.blogjava.net/sandy/archive/2013/04/15/397847.html</guid><wfw:comment>http://www.blogjava.net/sandy/comments/397847.html</wfw:comment><comments>http://www.blogjava.net/sandy/archive/2013/04/15/397847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sandy/comments/commentRss/397847.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sandy/services/trackbacks/397847.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 给定一个字符串s，切割字符串使得每个子串都是回文的。（比如aba，对称）<br>要求返回所有可能的分割。<br><br>比如，对于字符串s="aab",<br>返回:<br><br>[<br>   ["aa","b"],<br>   ["a","a","b"]<br>]<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/sandy/archive/2013/04/15/397847.html'>阅读全文</a><img src ="http://www.blogjava.net/sandy/aggbug/397847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sandy/" target="_blank">小明</a> 2013-04-15 13:52 <a href="http://www.blogjava.net/sandy/archive/2013/04/15/397847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>+1</title><link>http://www.blogjava.net/sandy/archive/2013/04/15/397841.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Mon, 15 Apr 2013 03:22:00 GMT</pubDate><guid>http://www.blogjava.net/sandy/archive/2013/04/15/397841.html</guid><wfw:comment>http://www.blogjava.net/sandy/comments/397841.html</wfw:comment><comments>http://www.blogjava.net/sandy/archive/2013/04/15/397841.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/sandy/comments/commentRss/397841.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sandy/services/trackbacks/397841.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 给定一个有由数字构成的数组表示的数，求该数加1的结果。<br>public class Solution {<br>    public int[] plusOne(int[] digits) {<br>    }<br>}&nbsp;&nbsp;<a href='http://www.blogjava.net/sandy/archive/2013/04/15/397841.html'>阅读全文</a><img src ="http://www.blogjava.net/sandy/aggbug/397841.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sandy/" target="_blank">小明</a> 2013-04-15 11:22 <a href="http://www.blogjava.net/sandy/archive/2013/04/15/397841.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>快速开平方</title><link>http://www.blogjava.net/sandy/archive/2013/04/15/397836.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Mon, 15 Apr 2013 02:19:00 GMT</pubDate><guid>http://www.blogjava.net/sandy/archive/2013/04/15/397836.html</guid><wfw:comment>http://www.blogjava.net/sandy/comments/397836.html</wfw:comment><comments>http://www.blogjava.net/sandy/archive/2013/04/15/397836.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sandy/comments/commentRss/397836.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sandy/services/trackbacks/397836.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 实现 int sqrt(int x);<br>计算和返回x的平方根。&nbsp;&nbsp;<a href='http://www.blogjava.net/sandy/archive/2013/04/15/397836.html'>阅读全文</a><img src ="http://www.blogjava.net/sandy/aggbug/397836.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sandy/" target="_blank">小明</a> 2013-04-15 10:19 <a href="http://www.blogjava.net/sandy/archive/2013/04/15/397836.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最长连续序列问题</title><link>http://www.blogjava.net/sandy/archive/2013/04/12/397751.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Fri, 12 Apr 2013 07:58:00 GMT</pubDate><guid>http://www.blogjava.net/sandy/archive/2013/04/12/397751.html</guid><wfw:comment>http://www.blogjava.net/sandy/comments/397751.html</wfw:comment><comments>http://www.blogjava.net/sandy/archive/2013/04/12/397751.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/sandy/comments/commentRss/397751.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sandy/services/trackbacks/397751.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 给定一个未排序的整数数组，求最长的连续序列的长度。要求算法的时间复杂度在O(n)<br>比如对于数组[100, 4, 200, 1, 3, 2]，其中最长序列为[1,2,3,4]，所以应该返回4<br><br>public class Solution {<br>    	public int longestConsecutive(int[] num) {<br>        //write your code here<br>        }<br>}&nbsp;&nbsp;<a href='http://www.blogjava.net/sandy/archive/2013/04/12/397751.html'>阅读全文</a><img src ="http://www.blogjava.net/sandy/aggbug/397751.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sandy/" target="_blank">小明</a> 2013-04-12 15:58 <a href="http://www.blogjava.net/sandy/archive/2013/04/12/397751.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>回文字符串的切割问题</title><link>http://www.blogjava.net/sandy/archive/2013/04/11/397689.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Thu, 11 Apr 2013 03:24:00 GMT</pubDate><guid>http://www.blogjava.net/sandy/archive/2013/04/11/397689.html</guid><wfw:comment>http://www.blogjava.net/sandy/comments/397689.html</wfw:comment><comments>http://www.blogjava.net/sandy/archive/2013/04/11/397689.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sandy/comments/commentRss/397689.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sandy/services/trackbacks/397689.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 给定一个字符串s，分割s使得每个子串都是回文的（即倒过来和原字符串是一样的，如aba）<br>求最少的分割次数。&nbsp;&nbsp;<a href='http://www.blogjava.net/sandy/archive/2013/04/11/397689.html'>阅读全文</a><img src ="http://www.blogjava.net/sandy/aggbug/397689.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sandy/" target="_blank">小明</a> 2013-04-11 11:24 <a href="http://www.blogjava.net/sandy/archive/2013/04/11/397689.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TopCoder MatchMaker解法</title><link>http://www.blogjava.net/sandy/archive/2013/04/02/397286.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Tue, 02 Apr 2013 06:04:00 GMT</pubDate><guid>http://www.blogjava.net/sandy/archive/2013/04/02/397286.html</guid><wfw:comment>http://www.blogjava.net/sandy/comments/397286.html</wfw:comment><comments>http://www.blogjava.net/sandy/archive/2013/04/02/397286.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sandy/comments/commentRss/397286.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sandy/services/trackbacks/397286.html</trackback:ping><description><![CDATA[<div>问题描述：</div><div>Problem Statement</div><div>THIS PROBLEM WAS TAKEN FROM THE SEMIFINALS OF THE TOPCODER INVITATIONAL</div><div>TOURNAMENT</div><div></div><div>DEFINITION</div><div>Class Name: MatchMaker</div><div>Method Name: getBestMatches</div><div>Paramaters: String[], String, int</div><div>Returns: String[]</div><div>Method signature (be sure your method is public): &nbsp;String[]</div><div>getBestMatches(String[] members, String currentUser, int sf);</div><div></div><div>PROBLEM STATEMENT</div><div>A new online match making company needs some software to help find the "perfect</div><div>couples". &nbsp;People who sign up answer a series of multiple-choice questions.</div><div>Then, when a member makes a "Get Best Mates" request, the software returns a</div><div>list of users whose gender matches the requested gender and whose answers to</div><div>the questions were equal to or greater than a similarity factor when compared</div><div>to the user's answers.</div><div></div><div>Implement a class MatchMaker, which contains a method getBestMatches. &nbsp;The</div><div>method takes as parameters a String[] members, String currentUser, and an int</div><div>sf:</div><div>- members contains information about all the members. &nbsp;Elements of members are</div><div>of the form "NAME G D X X X X X X X X X X"&nbsp;</div><div>&nbsp; &nbsp;* NAME represents the member's name</div><div>&nbsp; &nbsp;* G represents the gender of the current user.&nbsp;</div><div>&nbsp; &nbsp;* D represents the requested gender of the potential mate.&nbsp;</div><div>* Each X indicates the member's answer to one of the multiple-choice</div><div>questions. &nbsp;The first X is the answer to the first question, the second is the</div><div>answer to the second question, et cetera.&nbsp;</div><div>- currentUser is the name of the user who made the "Get Best Mates" request. &nbsp;</div><div>- sf is an integer representing the similarity factor.</div><div></div><div>The method returns a String[] consisting of members' names who have at least sf</div><div>identical answers to currentUser and are of the requested gender. &nbsp;The names</div><div>should be returned in order from most identical answers to least. &nbsp;If two</div><div>members have the same number of identical answers as the currentUser, the names</div><div>should be returned in the same relative order they were inputted.</div><div></div><div>TopCoder will ensure the validity of the inputs. &nbsp;Inputs are valid if all of</div><div>the following criteria are met:</div><div>- members will have between 1 and 50 elements, inclusive.</div><div>- Each element of members will have a length between 7 and 44, inclusive.</div><div>- NAME will have a length between 1 and 20, inclusive, and only contain</div><div>uppercase letters A-Z.</div><div>- G can be either an uppercase M or an uppercase F.</div><div>- D can be either an uppercase M or an uppercase F.</div><div>- Each X is a capital letter (A-D).</div><div>- The number of Xs in each element of the members is equal. &nbsp;The number of Xs</div><div>will be between 1 and 10, inclusive.&nbsp;</div><div>- No two elements will have the same NAME.</div><div>- Names are case sensitive.</div><div>- currentUser consists of between 1 and 20, inclusive, uppercase letters, A-Z,</div><div>and must be a member.</div><div>- sf is an int between 1 and 10, inclusive.</div><div>- sf must be less than or equal to the number of answers (Xs) of the members.</div><div></div><div>NOTES</div><div>The currentUser should not be included in the returned list of potential mates.</div><div></div><div></div><div>EXAMPLES</div><div></div><div>For the following examples, assume members =</div><div>{"BETTY F M A A C C",</div><div>&nbsp;"TOM M F A D C A",</div><div>&nbsp;"SUE F M D D D D",</div><div>&nbsp;"ELLEN F M A A C A",</div><div>&nbsp;"JOE M F A A C A",</div><div>&nbsp;"ED M F A D D A",</div><div>&nbsp;"SALLY F M C D A B",</div><div>&nbsp;"MARGE F M A A C C"}</div><div></div><div>If currentUser="BETTY" and sf=2, BETTY and TOM have two identical answers and</div><div>BETTY and JOE have three identical answers, so the method should return</div><div>{"JOE","TOM"}.</div><div></div><div>If currentUser="JOE" and sf=1, the method should return</div><div>{"ELLEN","BETTY","MARGE"}.</div><div></div><div>If currentUser="MARGE" and sf=4, the method should return [].</div><div></div><div>Definition</div><div></div><div>Class:</div><div>MatchMaker</div><div>Method:</div><div>getBestMatches</div><div>Parameters:</div><div>String[], String, int</div><div>Returns:</div><div>String[]</div><div>Method signature:</div><div>String[] getBestMatches(String[] param0, String param1, int param2)</div><div>(be sure your method is public)<br /><br /><br />================================================================我的代码=============<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: #0000FF; ">import</span>&nbsp;java.util.ArrayList;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Collections;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Comparator;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.List;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MatchMaker&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">enum</span>&nbsp;GENDER{MALE,FEMALE};<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">"NAME&nbsp;G&nbsp;D&nbsp;X&nbsp;X&nbsp;X&nbsp;X&nbsp;X&nbsp;X&nbsp;X&nbsp;X&nbsp;X&nbsp;X"&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Member{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GENDER&nbsp;gender;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GENDER&nbsp;mate;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;answers;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;index;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;matched&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;getBestMatches(String[]&nbsp;members,&nbsp;String&nbsp;currentUser,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;sf){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Member&gt;&nbsp;allMembers&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ArrayList&lt;Member&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Member&nbsp;cu&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;members.length;++i){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;m&nbsp;=&nbsp;members[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;c&nbsp;=&nbsp;m.split("&nbsp;");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Member&nbsp;mem&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Member();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mem.name=&nbsp;c[0];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mem.gender&nbsp;=&nbsp;c[1].equals("M")?GENDER.MALE:GENDER.FEMALE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mem.mate&nbsp;=&nbsp;c[2].equals("M")?GENDER.MALE:GENDER.FEMALE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mem.index&nbsp;=&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mem.matched&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;answers&nbsp;=&nbsp;mem.answers&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;String[c.length-3];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j=3;j&lt;c.length;++j){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;answers[j-3]&nbsp;=&nbsp;c[j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allMembers.add(mem);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(c[0].equals(currentUser)){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cu&nbsp;=&nbsp;mem;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Member&gt;&nbsp;matched&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ArrayList&lt;Member&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(cu!=<span style="color: #0000FF; ">null</span>){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(Member&nbsp;mem:allMembers){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(mem!=cu&nbsp;&amp;&amp;&nbsp;mem.gender==cu.mate){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;mem.answers.length;++i){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(mem.answers[i].equals(cu.answers[i])){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++mem.matched;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(mem.matched&gt;=sf){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;matched.add(mem);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Collections.sort(matched,&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Comparator&lt;Member&gt;(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;compare(Member&nbsp;ma,&nbsp;Member&nbsp;mb)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(ma.matched!=mb.matched){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;mb.matched&nbsp;-&nbsp;ma.matched;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;ma.index-mb.index;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;result&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;String[matched.size()];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;result.length;++i){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result[i]&nbsp;=&nbsp;matched.get(i).name;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;String[0];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br /><br /></div><div></div><img src ="http://www.blogjava.net/sandy/aggbug/397286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sandy/" target="_blank">小明</a> 2013-04-02 14:04 <a href="http://www.blogjava.net/sandy/archive/2013/04/02/397286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TopCoder Prerequisites解法</title><link>http://www.blogjava.net/sandy/archive/2011/10/25/361989.html</link><dc:creator>小明</dc:creator><author>小明</author><pubDate>Tue, 25 Oct 2011 05:28:00 GMT</pubDate><guid>http://www.blogjava.net/sandy/archive/2011/10/25/361989.html</guid><wfw:comment>http://www.blogjava.net/sandy/comments/361989.html</wfw:comment><comments>http://www.blogjava.net/sandy/archive/2011/10/25/361989.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/sandy/comments/commentRss/361989.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sandy/services/trackbacks/361989.html</trackback:ping><description><![CDATA[原题：<div>http://community.topcoder.com/stat?c=problem_statement&amp;pm=164&amp;rd=50</div><br /><div>  <p>Class Name: Prerequisites</p>  <p>Mathod Name: orderClasses</p>  <p>Parameters: String[]</p>  <p>Returns: String[]</p>  <p>&nbsp;</p>  <p><span>You are a student at a college with the most unbelievably complex prerequisite</span></p>  <p><span>structure ever. To help you schedule your classes, you decided to put together</span></p>  <p><span>a program that returns the order in which the classes should be taken.&nbsp;</span></p>  <p>&nbsp;</p>  <p><span>Implement a class Prerequisites which contains a method orderClasses.&nbsp;The</span></p>  <p><span>method takes a String[] that contains the classes you must take and returns a</span></p>  <p><span>String[] of classes in the order the classes should be taken so that all</span></p>  <p>prerequisites are met.</p>  <p>&nbsp;</p>  <p><span>String[] elements will be of the form (and TopCoder will ensure this):</span></p>  <p><span>"CLASS: PRE1 PRE2 ..." where PRE1 and PRE2 are prerequisites of CLASS.&nbsp;CLASS,</span></p>  <p><span>PRE1, PRE2, ... consist of a department name (3 or 4 capital letters, A-Z</span></p>  <p><span>inclusive) followed by a class number (an integer between 100 and 999,</span></p>  <p>inclusive).&nbsp;The department name should be immediately followed by the class</p>  <p><span>number with no additional characters, numbers or spaces (i.e. MATH217).&nbsp;It is</span></p>  <p><span>not necessary for a class to have prerequisites.&nbsp;In such a case, the colon is</span></p>  <p>the last character in the String.&nbsp;</p>  <p>&nbsp;</p>  <p><span>You can only take one class at a time, therefore, use the following rules to</span></p>  <p>determine which class to take :</p>  <p><span>1) Any prerequisite class(es) listed for a class must be taken before the class</span></p>  <p>can be taken.</p>  <p><span>2) If multiple classes can be taken at the same time, you take the one with the</span></p>  <p><span>lowest number first, regardless of department.</span></p>  <p><span>3) If multiple classes with the same number can be taken at the same time, you</span></p>  <p><span>take the department name which comes first in alphabetical order.&nbsp;</span></p>  <p><span>4) If the inputted course schedule has errors, return a String[] of length 0.</span></p>  <p><span>There is an error if it is impossible to return the classes in an order such</span></p>  <p><span>that all prerequisites are met, or if a prerequisite is a course that does not</span></p>  <p><span>have its own entry in the inputted String[].</span></p>  <p>&nbsp;</p>  <p>Examples of valid input Strings are:</p>  <p>"CSE111: CSE110 MATH101"</p>  <p>"CSE110:"</p>  <p>&nbsp;</p>  <p>Examples of invalid input Strings are:</p>  <p><span>"CS117:" (department name must consist of 3 - 4 capital letters, inclusive)</span></p>  <p><span>"cs117:" (department name must consist of 3 - 4 capital letters, inclusive)</span></p>  <p><span>"CS9E11:" (department name must be letters only)</span></p>  <p><span>"CSE110: " (no trailing spaces allowed)</span></p>  <p><span>"CSE110: CSE101 " (no trailing spaces allowed)</span></p>  <p><span>"MATH211: MAM2222" (class number to large)</span></p>  <p><span>"MATH211: MAM22" (class number to small)</span></p>  <p><span>"ENGIN517: MATH211" (department name to large)</span></p>  <p>&nbsp;</p>  <p><span>Here is the method signature (be sure your method is public):</span></p>  <p><span>String[] orderClasses(String[] classSchedule);</span></p>  <p>&nbsp;</p>  <p><span>TopCoder will make sure classSchedule contains between 1 and 20 Strings,</span></p>  <p>inclusive, all of the form above.&nbsp;The Strings will have between 1 and 50</p>  <p><span>characters, inclusive.&nbsp;TopCoder will check that the syntax of the Strings are</span></p>  <p><span>correct: The Strings will contain a valid class name, followed by a colon,</span></p>  <p><span>possibly followed by a series of unique prerequisite classes separated by</span></p>  <p><span>single spaces.&nbsp;Also, TopCoder will ensure that each class has at most one</span></p>  <p>entry in the String[]. </p>  <p>&nbsp;</p>  <p>Examples:</p>  <p>If classSchedule={</p>  <p>"CSE121: CSE110",</p>  <p>"CSE110:",</p>  <p>"MATH122:",</p>  <p>}</p>  <p><span>The method should return: {"CSE110","CSE121","MATH122"}</span></p>  <p>&nbsp;</p>  <p>If classSchedule={</p>  <p>"ENGL111: ENGL110",</p>  <p>"ENGL110: ENGL111"</p>  <p>}</p>  <p>The method should return: {}</p>  <p>&nbsp;</p>  <p>If classSchedule=[</p>  <p>"ENGL111: ENGL110"</p>  <p>}</p>  <p>The method should return: {}</p>  <p>&nbsp;</p>  <p>If classSchedule={</p>  <p>"CSE258: CSE244 CSE243 INTR100"</p>  <p>"CSE221: CSE254 INTR100"</p>  <p>"CSE254: CSE111 MATH210 INTR100"</p>  <p>"CSE244: CSE243 MATH210 INTR100"</p>  <p>"MATH210: INTR100"</p>  <p>"CSE101: INTR100"</p>  <p>"CSE111: INTR100"</p>  <p>"ECE201: CSE111 INTR100"</p>  <p>"ECE111: INTR100"</p>  <p>"CSE243: CSE254"</p>  <p>"INTR100:"</p>  <p>}</p>  <p>The method should return:</p>  <p>{"INTR100","CSE101","CSE111","ECE111","ECE201","MATH210","CSE254","CSE221","CSE2</p>  <p>43","CSE244","CSE258"}</p>  <p>&nbsp;</p>  <p>&nbsp;</p>  <p>Definition</p>  <p><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>  <p>Class:<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Prerequisites</span></p>  <p>Method:<span>&nbsp;&nbsp; orderClasses</span></p>  <p>Parameters:<span>&nbsp;&nbsp;&nbsp;&nbsp; String[]</span></p>  <p>Returns:&nbsp;String[]</p>  <p>Method signature:<span>&nbsp;&nbsp; String[] orderClasses(String[] param0)</span></p>  <p>(be sure your method is public)</p><p><br /></p><p>------------------------------------------------------------我的解法如下----------------------------------------</p><p>想法很简单，这道题本质上是一道排序问题，我们只需要定义好排序的逻辑，然后应用快排就可以了。<br /></p><p><br /></p><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: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.ArrayList;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.Arrays;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.HashMap;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.List;<br /></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.util.Map;<br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Prerequisites&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;String[]&nbsp;EMPTY&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{};<br />&nbsp;&nbsp;&nbsp;&nbsp;Map</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,Klass</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;classes&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;HashMap</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,Klass</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Klass&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;Comparable</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Klass</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;number;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;dept;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Klass</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;pres&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ArrayList</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Klass</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; ">&nbsp;exist&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Klass(String&nbsp;name){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.name&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;name;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;name.length();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.number&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Integer.parseInt(name.substring(len</span><span style="color: #000000; ">-</span><span style="color: #000000; ">3</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.dept&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">name.substring(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,len</span><span style="color: #000000; ">-</span><span style="color: #000000; ">3</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; ">&nbsp;isPre(Klass&nbsp;k){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(k</span><span style="color: #000000; ">==</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(Klass&nbsp;p:</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.pres){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(k&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;p&nbsp;</span><span style="color: #000000; ">||</span><span style="color: #000000; ">&nbsp;p.isPre(k))&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;compareTo(Klass&nbsp;that)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; ">&nbsp;pre&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.isPre(that);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; ">&nbsp;sub&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;that.isPre(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(pre&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;sub){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">throw</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;RuntimeException(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">circle&nbsp;detected</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&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; ">(pre){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&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; ">(sub){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.number</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">that.number)&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.number</span><span style="color: #000000; ">-</span><span style="color: #000000; ">that.number;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.dept.compareTo(that.dept);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;Klass&nbsp;getClass(String&nbsp;name){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Klass&nbsp;k&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;classes.get(name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(k</span><span style="color: #000000; ">==</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Klass(name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classes.put(name,&nbsp;k);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;k;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000;">&nbsp;String[]&nbsp;orderClasses(String[]&nbsp;classSchedule){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classes.clear();<br /></span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #000000; ">//parse the input<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(String&nbsp;s:classSchedule){<br />&nbsp;&nbsp;&nbsp;&nbsp;&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;s.indexOf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;s.substring(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,idx);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Klass&nbsp;k&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;getClass(name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k.exist&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(idx</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">s.length()</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;pres&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;s.substring(idx</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">).split(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(String&nbsp;pre:pres){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(pre.length()</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Klass&nbsp;p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;getClass(pre);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k.pres.add(p);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Klass&nbsp;[]&nbsp;sortedClasses&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;&nbsp;(Klass[])&nbsp;classes.values().toArray(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Klass[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(Klass&nbsp;k:sortedClasses){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">k.exist){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;EMPTY;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Arrays.sort(sortedClasses);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;EMPTY;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;result&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;String[sortedClasses.length];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;c&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(Klass&nbsp;k:sortedClasses){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result[c</span><span style="color: #000000; ">++</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;k.name;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;result;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div><p><br /></p>  </div><img src ="http://www.blogjava.net/sandy/aggbug/361989.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sandy/" target="_blank">小明</a> 2011-10-25 13:28 <a href="http://www.blogjava.net/sandy/archive/2011/10/25/361989.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>