??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品午夜一区二区欲梦,日韩久久午夜影院,欧美精品一区二区久久久http://www.aygfsteel.com/sandy/archive/2013/05/22/399605.htmlWed, 22 May 2013 14:25:00 GMThttp://www.aygfsteel.com/sandy/archive/2013/05/22/399605.htmlhttp://www.aygfsteel.com/sandy/comments/399605.htmlhttp://www.aygfsteel.com/sandy/archive/2013/05/22/399605.html#Feedback0http://www.aygfsteel.com/sandy/comments/commentRss/399605.htmlhttp://www.aygfsteel.com/sandy/services/trackbacks/399605.html
Problem

Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively.
Below is one possible representation of s1 = "great":
    great
   /    \
  gr    eat
 / \    /  \
g   r  e   at
           / \
          a   t
To scramble the string, we may choose any non-leaf node and swap its two children.
For example, if we choose the node "gr" and swap its two children, it produces a scrambled string "rgeat".
    rgeat
   /    \
  rg    eat
 / \    /  \
r   g  e   at
           / \
          a   t
We say that "rgeat" is a scrambled string of "great".
Similarly, if we continue to swap the children of nodes "eat" and "at", it produces a scrambled string "rgtae".
    rgtae
   /    \
  rg    tae
 / \    /  \
r   g  ta  e
       / \
      t   a
We say that "rgtae" is a scrambled string of "great".
Given two strings s1 and s2 of the same length, determine if s2 is a scrambled string of s1.

 


分析Q?br />
q个问题是google的面试题。由于一个字W串有很多种二叉表示法,貌似很难判断两个字符串是否可以做q样的变换?br />对付复杂问题的方法是从简单的特例来思考,从而找律?br />先考察单情况:
字符串长度ؓ1Q很明显Q两个字W串必须完全相同才可以?br />字符串长度ؓ2Q当s1="ab", s2只有"ab"或?ba"才可以?br />对于L长度的字W串Q我们可以把字符串s1分ؓa1,b1两个部分Qs2分ؓa2,b2两个部分Q满I(a1~a2) && (b1~b2)Q或?nbsp;Q?a1~b2) && (a1~b2)Q?br />
如此Q我们找C解决问题的思\。首先我们尝试用递归来写?br />

解法一Q递归Q?br />
两个字符串的怼的必备条件是含有相同的字W集。简单的做法是把两个字符串的字符排序后,然后比较是否相同?br />加上q个查就可以大大的减递归ơ数?br />代码如下Q?br />
public boolean isScramble(String s1, String s2) {
        int l1 = s1.length();
        int l2 = s2.length();
        if(l1!=l2){
            return false;
        }
        if(l1==0){
            return true;
        }
        
        char[] c1 = s1.toCharArray();
        char[] c2 = s2.toCharArray();
        if(l1==1){
            return c1[0]==c2[0];
        }
        Arrays.sort(c1);
        Arrays.sort(c2);
        for(int i=0;i<l1;++i){
            if(c1[i]!=c2[i]){
                return false;
            }
        }
        
        boolean result = false;
        for(int i=1;i<l1 && !result;++i){
            String s11 = s1.substring(0,i);
            String s12 = s1.substring(i);
            String s21 = s2.substring(0,i);
            String s22 = s2.substring(i);
            result = isScramble(s11,s21) && isScramble(s12,s22);
            if(!result){
                String s31 = s2.substring(0,l1-i);
                String s32 = s2.substring(l1-i);
                result = isScramble(s11,s32) && isScramble(s12,s31);
            }
        }
        
        return result;
    }

解法二(动态规划)
减少重复计算的方法就是动态规划。动态规划是一U神奇的法技术,不亲自去写,是很隑֮全掌握动态规划的?br />
q里我用了一个三l数lboolean result[len][len][len],其中W一lؓ子串的长度,W二lؓs1的v始烦引,W三lؓs2的v始烦引?br />result[k][i][j]表示s1[i...i+k]是否可以由s2[j...j+k]变化得来?br />
代码如下Q非常简z优:

public class Solution {
    public boolean isScramble(String s1, String s2) {
        int len = s1.length();
        if(len!=s2.length()){
            return false;
        }
        if(len==0){
            return true;
        }
        
        char[] c1 = s1.toCharArray();
        char[] c2 = s2.toCharArray();
        
        boolean[][][] result = new boolean[len][len][len];
        for(int i=0;i<len;++i){
            for(int j=0;j<len;++j){
                result[0][i][j] = (c1[i]==c2[j]);
            }
        }
        
        for(int k=2;k<=len;++k){
            for(int i=len-k;i>=0;--i){
              for(int j=len-k;j>=0;--j){
                  boolean r = false;
                  for(int m=1;m<k && !r;++m){
                      r = (result[m-1][i][j] && result[k-m-1][i+m][j+m]) || (result[m-1][i][j+k-m] && result[k-m-1][i+m][j]);
                  }
                  result[k-1][i][j] = r;
              }
            }
        }
        
        return result[len-1][0][0];
    }
}


2013-05-22 22:25 发表评论
]]>
Subsetshttp://www.aygfsteel.com/sandy/archive/2013/05/21/399521.htmlTue, 21 May 2013 14:50:00 GMThttp://www.aygfsteel.com/sandy/archive/2013/05/21/399521.htmlhttp://www.aygfsteel.com/sandy/comments/399521.htmlhttp://www.aygfsteel.com/sandy/archive/2013/05/21/399521.html#Feedback0http://www.aygfsteel.com/sandy/comments/commentRss/399521.htmlhttp://www.aygfsteel.com/sandy/services/trackbacks/399521.html
Problem

Given a collection of integers that might contain duplicates, S, return all possible subsets.

Note:

  • Elements in a subset must be in non-descending order.
  • The solution set must not contain duplicate subsets.

For example,
If S = [1,2,2], a solution is:

[   [2],   [1],   [1,2,2],   [2,2],   [1,2],   [] ] 

分析Q?br />因ؓ要求l果集是升序排列Q所以首先我们要Ҏ(gu)l进行排序?br />
子集的长度可以从0到整个数l的长度。长度ؓn+1的子集可以由长度为n的子集再加上在之后的一个元素组成?br />
q里我用了三个技?br />1。用了一个index数组来记录每个子集的最大烦引,q样d新元素就很简单?br />2。用了两个变量start和end来记录上一个长度的子集在结果中的v始和l止位置?br />3。去重处理用了一个last变量记录前一ơ的|它的初始D为S[0]-1,q样׃证了和数l的M一个元素不同?br />
代码如下Q?br />
public class Solution {
    public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] S) {
        Arrays.sort(S);
        
        ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
        ArrayList<Integer> indexs = new ArrayList<Integer>();
        result.add(new ArrayList<Integer>());
        indexs.add(-1);
        
        int slen = S.length;
        int start=0,end=0;
        for(int len=1;len<=slen;++len){
            int e = end;
            for(int i=start;i<=end;++i){
                ArrayList<Integer> ss = result.get(i);
                int index = indexs.get(i).intValue();
                int last = S[0]-1;
                for(int j = index+1;j<slen;++j){
                    int v = S[j];
                    if(v!=last){
                        ArrayList<Integer> newss = new ArrayList<Integer>(ss);
                        newss.add(v);
                        result.add(newss);
                        indexs.add(j);
                        ++e;
                        last = v;
                    }
                }
            }
            
            start = end+1;
            end = e;
        }
        return result;
    }
}


2013-05-21 22:50 发表评论
]]>
格雷?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/sandy/archive/2013/05/20/399526.html</guid><wfw:comment>http://www.aygfsteel.com/sandy/comments/399526.html</wfw:comment><comments>http://www.aygfsteel.com/sandy/archive/2013/05/20/399526.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/sandy/comments/commentRss/399526.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/sandy/services/trackbacks/399526.html</trackback:ping><description><![CDATA[<div><fieldset><legend>问题</legend>格雷码是一个二q制的编码系l,盔R的两个数只有一位是不同的?br />l定一个非负的整数nQ代表了格雷码的位的L。输出格L(fng)的序列,q个序列必须?开始?br /><br />比如Q给定n=2,输出Q?Q?Q?Q?Q,格雷码是<br />0 Q?00<br />1 Q?01<br />3 Q?11<br />2 Q?10<br /><br />注:格雷码的序列q不是唯一Q比如n=2ӞQ?Q?Q?Q?Q也满条g?br /></fieldset><br /><br />分析Q?br />格雷码的序列中应包含2^n个数。这个问题初看v来不Ҏ(gu)Q我们要惛_一个生成方法?br /><br />对于n=2,序列是:<br />00Q?1Q?1Q?0<br />那对于n=3,如何利用n=2的序列呢Q一个方法是Q先在n=2的四个序列前?Q这其实是保持不变)Q然后再考虑把最高位变成1Q只需要把方向反过来就可以?br />000Q?01Q?11Q?10<br />100Q?01Q?11Q?10Q?gt; 110,111,101,100<br />把这两行合v来就可以得到新的序列?br /><br />想通了Q写代码很Ҏ(gu)了?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> <span style="color: #0000FF; ">class</span> Solution {<br />    <span style="color: #0000FF; ">public</span> ArrayList<Integer> grayCode(<span style="color: #0000FF; ">int</span> n) {<br />        ArrayList<Integer> result = <span style="color: #0000FF; ">new</span> ArrayList<Integer>();<br />        result.add(0);<br />        <span style="color: #0000FF; ">if</span>(n>0){<br />            result.add(1);<br />        }<br />        <br />        <span style="color: #0000FF; ">int</span> mask = 1;<br />        <span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span> i=2;i<=n;++i){<br />            mask *= 2;<br />            <span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span> j=result.size()-1;j>=0;--j){<br />                <span style="color: #0000FF; ">int</span> v = result.get(j).intValue();<br />                v |= mask;<br />                result.add(v);<br />            }<br />        }<br />        <span style="color: #0000FF; ">return</span> result;<br />    }<br />}</div></div><img src ="http://www.aygfsteel.com/sandy/aggbug/399526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/sandy/" target="_blank">明</a> 2013-05-20 21:09 <a href="http://www.aygfsteel.com/sandy/archive/2013/05/20/399526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>交叉字符?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/sandy/archive/2013/05/10/398754.html</guid><wfw:comment>http://www.aygfsteel.com/sandy/comments/398754.html</wfw:comment><comments>http://www.aygfsteel.com/sandy/archive/2013/05/10/398754.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.aygfsteel.com/sandy/comments/commentRss/398754.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/sandy/services/trackbacks/398754.html</trackback:ping><description><![CDATA[<div><fieldset><legend>问题</legend>l定字符串s1,s2,s3,判断s3是否可以由s1和s2交叉l成得到?br /><br />例如Q?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> = <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> = <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 <em style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; ">s3</em> = <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 <em style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; ">s3</em> = <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 />解法一Q(递归Q?br /><br />一个简单的xQ是遍历s3的每个字W,q个字符必须{于s1和s2的某个字W。如果都不相{,则返回false<br />我们使用3个变量i,j,k分别记录当前s1,s2,s3的字W位|?br />如果s3[k] = s1[i], i向后Ud一位。如果s3[k]=s2[j],j向后Ud一位?br />q个题目主要隑֜如果s1和s2的字W出现重复的时候,有两种情况Qi,j都可以向后一位?br />下面的算法在q种情况使用了递归Q很单的做法。但是效率非常差Q是指数复杂度的?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> <span style="color: #0000FF; ">class</span> Solution {<br />    <span style="color: #0000FF; ">public</span> <span style="color: #0000FF; ">boolean</span> isInterleave(String s1, String s2, String s3) {<br />        <span style="color: #0000FF; ">int</span> l1 = s1.length();<br />        <span style="color: #0000FF; ">int</span> l2 = s2.length();<br />        <span style="color: #0000FF; ">int</span> l3 = s3.length();<br />        <br />        <span style="color: #0000FF; ">if</span>(l1+l2!=l3){<br />            <span style="color: #0000FF; ">return</span> <span style="color: #0000FF; ">false</span>;<br />        }<br />        <br />        <span style="color: #0000FF; ">char</span>[] c1 = s1.toCharArray();<br />        <span style="color: #0000FF; ">char</span>[] c2 = s2.toCharArray();<br />        <span style="color: #0000FF; ">char</span>[] c3 = s3.toCharArray();<br />        <br />        <span style="color: #0000FF; ">int</span> i=0,j=0;<br />        <span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span> k=0;k<l3;++k){<br />            <span style="color: #0000FF; ">char</span> c = c3[k];<br />            <span style="color: #0000FF; ">boolean</span> m1 = i<l1 && c==c1[i];<br />            <span style="color: #0000FF; ">boolean</span> m2 = j<l2 && c==c2[j];<br />            <span style="color: #0000FF; ">if</span>(!m1 && !m2){<br />                <span style="color: #0000FF; ">return</span> <span style="color: #0000FF; ">false</span>;<br />            }<br />            <span style="color: #0000FF; ">else</span> <span style="color: #0000FF; ">if</span>(m1 && m2){<br />                String news3 =  s3.substring(k+1);<br />                <span style="color: #0000FF; ">return</span> isInterleave(s1.substring(i+1),s2.substring(j),news3)<br />                                || isInterleave(s1.substring(i),s2.substring(j+1),news3);<br />            }<br />            <span style="color: #0000FF; ">else</span> <span style="color: #0000FF; ">if</span>(m1){<br />                ++i;<br />            }<br />            <span style="color: #0000FF; ">else</span>{<br />                ++j;<br />            }<br />        }<br />        <br />        <span style="color: #0000FF; ">return</span> <span style="color: #0000FF; ">true</span>;        <br />    }<br />}</div><br /><br />解法二:Q动态规划)<br />Z减少重复计算Q就要用动态规划来记录中间l果?br /><br />q里我用了一个二l数lresult[i][j]来表Cs1的前i个字W和s2的前j个字W是否能和s3的前i+j个字W匹配?br /><br />状态{ULE如下:<br />result[i,j] = (result[i-1,j] && s1[i] = s3[i+j])  || (result[i,j-1] && s2[j] = s3[i+j]);<br />其中0≤i≤len(s1) ,0≤j≤len(s2)</div><div><br />q样法复杂度就会下降到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> <span style="color: #0000FF; ">class</span> Solution {<br />   <br /><span style="color: #0000FF; ">public</span> <span style="color: #0000FF; ">boolean</span> isInterleave(String s1, String s2, String s3) {<br />        <span style="color: #0000FF; ">int</span> l1 = s1.length();<br />        <span style="color: #0000FF; ">int</span> l2 = s2.length();<br />        <span style="color: #0000FF; ">int</span> l3 = s3.length();<br />       <br />        <span style="color: #0000FF; ">if</span>(l1+l2!=l3){<br />            <span style="color: #0000FF; ">return</span> <span style="color: #0000FF; ">false</span>;<br />        }<br />        <br />        <span style="color: #0000FF; ">char</span>[] c1 = s1.toCharArray();<br />        <span style="color: #0000FF; ">char</span>[] c2 = s2.toCharArray();<br />        <span style="color: #0000FF; ">char</span>[] c3 = s3.toCharArray();<br />        <br />        <span style="color: #0000FF; ">boolean</span>[][] result = <span style="color: #0000FF; ">new</span> <span style="color: #0000FF; ">boolean</span>[l1+1][l2+1];<br />        result[0][0] = <span style="color: #0000FF; ">true</span>;<br />        <br />        <span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span> i=0;i<l1;++i){<br />            <span style="color: #0000FF; ">if</span>(c1[i]==c3[i]){<br />                result[i+1][0] = <span style="color: #0000FF; ">true</span>;<br />            }<br />            <span style="color: #0000FF; ">else</span>{<br />                <span style="color: #0000FF; ">break</span>;<br />            }<br />        }<br />        <br />        <span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span> j=0;j<l2;++j){<br />            <span style="color: #0000FF; ">if</span>(c2[j]==c3[j]){<br />                result[0][j+1] = <span style="color: #0000FF; ">true</span>;<br />            }<br />            <span style="color: #0000FF; ">else</span>{<br />                <span style="color: #0000FF; ">break</span>;<br />            }<br />        }<br />        <br />        <br />        <span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span> i=1;i<=l1;++i){<br />            <span style="color: #0000FF; ">char</span> ci = c1[i-1];<br />            <span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span> j=1;j<=l2;++j){<br />                <span style="color: #0000FF; ">char</span> cj = c2[j-1];<br />                <span style="color: #0000FF; ">char</span> ck = c3[i+j-1];<br />                   result[i][j] = (result[i][j-1] && cj==ck) || (result[i-1][j] && ci==ck);<br />            }<br />        }<br />        <br />        <span style="color: #0000FF; ">return</span> result[l1][l2];<br />   }<br />}</div></div><img src ="http://www.aygfsteel.com/sandy/aggbug/398754.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/sandy/" target="_blank">明</a> 2013-05-10 20:47 <a href="http://www.aygfsteel.com/sandy/archive/2013/05/10/398754.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>三个C?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/sandy/archive/2013/05/01/398604.html</guid><wfw:comment>http://www.aygfsteel.com/sandy/comments/398604.html</wfw:comment><comments>http://www.aygfsteel.com/sandy/archive/2013/05/01/398604.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/sandy/comments/commentRss/398604.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/sandy/services/trackbacks/398604.html</trackback:ping><description><![CDATA[     摘要: l定一个由n个整数组成的数组SQ是否存在S中的三个数a,b,c使得 a+b+c=0?扑և所有的不重复的和ؓ0的三元组?<br> <br>注意Q?<br>1.三元l的整数按照升序排列 a<b<c <br>2.l出的结果中不能含有相同的三元组  <a href='http://www.aygfsteel.com/sandy/archive/2013/05/01/398604.html'>阅读全文</a><img src ="http://www.aygfsteel.com/sandy/aggbug/398604.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/sandy/" target="_blank">明</a> 2013-05-01 23:13 <a href="http://www.aygfsteel.com/sandy/archive/2013/05/01/398604.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>子序列计?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/sandy/archive/2013/04/26/398467.html</guid><wfw:comment>http://www.aygfsteel.com/sandy/comments/398467.html</wfw:comment><comments>http://www.aygfsteel.com/sandy/archive/2013/04/26/398467.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/sandy/comments/commentRss/398467.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/sandy/services/trackbacks/398467.html</trackback:ping><description><![CDATA[     摘要: l定两个字符串S和TQ计S的子序列为T的个数?<br> <br>q里的字W串的子序列指的是删除字W串的几个字W(也可以不删)而得到的新的字符Ԍ但是不能改变字符的相对位|?<br> <br>比如“ACE”是“ABCDE”的子序列,但是“AEC”就不是?<br> <br>如果SQ“rabbbit?TQ“rabit”,?U不同的子序列ؓT的构成方法,那么l果应该q回3?nbsp; <a href='http://www.aygfsteel.com/sandy/archive/2013/04/26/398467.html'>阅读全文</a><img src ="http://www.aygfsteel.com/sandy/aggbug/398467.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/sandy/" target="_blank">明</a> 2013-04-26 23:33 <a href="http://www.aygfsteel.com/sandy/archive/2013/04/26/398467.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>讄二叉?wi)的next节点http://www.aygfsteel.com/sandy/archive/2013/04/26/398413.htmlFri, 26 Apr 2013 03:23:00 GMThttp://www.aygfsteel.com/sandy/archive/2013/04/26/398413.htmlhttp://www.aygfsteel.com/sandy/comments/398413.htmlhttp://www.aygfsteel.com/sandy/archive/2013/04/26/398413.html#Feedback0http://www.aygfsteel.com/sandy/comments/commentRss/398413.htmlhttp://www.aygfsteel.com/sandy/services/trackbacks/398413.html
问题l定一颗二叉树(wi)Q?br />
class TreeLinkNode {
  TreeLinkNode left;
  TreeLinkNode right;
  TreeLinkNode next;
}
要求把所有节点的next节点讄成它双的节点,如果没有双点,讄成空。初始状态,所有的next的指针均为null.

要求:你只能用常数的I间?br />
比如Q?br />
         1
       /  \
      2    3
     / \    \
    4   5    7
应该输出Q?br />
1 -> NULL
       /  \
      2 -> 3 -> NULL
     / \    \
    4-> 5 -> 7 -> NULL

分析Q?br />题目不难Q但是在面试Ӟ在有限的旉内,没有bug写出Q还是很考验功力的?br />
解决q个问题的思\是逐层扫描Q上一层设|好下一层的next关系Q在处理I指针的时候要格外心?br />代码如下Q有注释Q应该很Ҏ(gu)看懂Q?br />使用了三个指针:
node:当前节点
firstChild:下一层的W一个非I子节点
lastChild:下一层的最后一个待处理Q未讄next)的子节点

    public void connect(TreeLinkNode root) {
        TreeLinkNode node = root;
        TreeLinkNode firstChild = null;
        TreeLinkNode lastChild = null;
        
        while(node!=null){
            if(firstChild == null){ //记录W一个非I子节点
                firstChild = node.left!=null?node.left:node.right;
            }
            //讄子节点的next关系Q?U情?/span>
            if(node.left!=null && node.right!=null){ 
                if(lastChild!=null){
                    lastChild.next = node.left;
                }
                node.left.next = node.right;
                lastChild = node.right;
            }
            else if(node.left!=null){
                if(lastChild!=null){
                    lastChild.next = node.left;
                }
                lastChild = node.left;
            }
            else if(node.right!=null){
                if(lastChild!=null){
                    lastChild.next = node.right;
                }
                lastChild = node.right;
            }
            //讄下一个节点,如果本层已经遍历完毕Q移C一层的W一个子节点
            if(node.next!=null){
                node = node.next;
            }
            else{
                node = firstChild;
                firstChild = null;
                lastChild = null;
            }
        }
    }


2013-04-26 11:23 发表评论
]]>
最佳的股票买卖旉IIIhttp://www.aygfsteel.com/sandy/archive/2013/04/25/398406.htmlThu, 25 Apr 2013 14:22:00 GMThttp://www.aygfsteel.com/sandy/archive/2013/04/25/398406.htmlhttp://www.aygfsteel.com/sandy/comments/398406.htmlhttp://www.aygfsteel.com/sandy/archive/2013/04/25/398406.html#Feedback0http://www.aygfsteel.com/sandy/comments/commentRss/398406.htmlhttp://www.aygfsteel.com/sandy/services/trackbacks/398406.html问题假设你有一个数l包含了每天的股h(hun)|它的Wi个元素就是第i天的股票h?nbsp;

设计一个算法寻找最大的收益。你可以最多进行两ơ交易?br />注意Q你不能同时q行多次交易Q也是说你买股之前,必须卖掉手中股票?/span>

分析Q?br />q道题相比之前的两道题,隑ֺ提高了不?br />
因ؓ限制了只能交易两ơ,所以我们可以把n天分ZD,分别计算q两D늚最大收益,可以得C个最大收益。穷举所有这L(fng)分法Q就可以得到全局的最大收益?br />
Z提高效率Q这里用动态规划,x中间状态记录下来。用了两个数组profitsQnprofits分别记录?..i和i..n的最大收益?br />
代码如下Q?br />
public int maxProfit(int[] prices) {
        int days = prices.length;
        if(days<2){
            return 0;
        }
        int[] profits = new int[days];
        int min = prices[0];
        int max = min;
        for(int i=1;i<days;++i){
            int p = prices[i];
            if(min>p){
                max = min = p;
            }
            else if(max<p){
                max = p;
            }
            int profit = max - min;
            profits[i] = (profits[i-1]>profit)?profits[i-1]:profit;
        }
        
        int[] nprofits = new int[days];
        nprofits[days-1] = 0;
        max = min = prices[days-1];
        for(int i=days-2;i>=0;--i){
            int p = prices[i];
            if(min>p){
                min =p;
            }
            else if(max<p){
                max = min = p;
            }
            int profit = max - min;
            nprofits[i] = (nprofits[i+1]>profit)?nprofits[i+1]:profit;
        }
        
        int maxprofit = 0;
        
        for(int i=0;i<days;++i){
            int profit = profits[i]+nprofits[i];
            if(maxprofit<profit){
                maxprofit = profit;
            }
        }
        
        return maxprofit;        
    }


2013-04-25 22:22 发表评论
]]>
最佳的股票买卖旉IIhttp://www.aygfsteel.com/sandy/archive/2013/04/19/398104.htmlFri, 19 Apr 2013 13:50:00 GMThttp://www.aygfsteel.com/sandy/archive/2013/04/19/398104.htmlhttp://www.aygfsteel.com/sandy/comments/398104.htmlhttp://www.aygfsteel.com/sandy/archive/2013/04/19/398104.html#Feedback0http://www.aygfsteel.com/sandy/comments/commentRss/398104.htmlhttp://www.aygfsteel.com/sandy/services/trackbacks/398104.html
问题假设你有一个数l包含了每天的股h(hun)|它的Wi个元素就是第i天的股票h?br />
设计一个算法寻找最大的收益。你可以q行L多次交易。但是,你不能同时进行多ơ交易,也就是说你买股票之前Q必d掉手中股?/fieldset>
分析Qؓ了得到最大收益,必须在所有上升的曲线D늚开始点买入Q在最高点卖出。而在下降阶段不出手?br />


实现代码如下Q?br />
public class Solution {
    public int maxProfit(int[] prices) {
        int len = prices.length;
        if(len<2){
            return 0;
        }
        
        int min=0;
        int result = 0;
        boolean inBuy = false;
        for(int i=0;i<len-1;++i){
            int p = prices[i];
            int q = prices[i+1];
            if(!inBuy){
                if(q>p){
                    inBuy = true;
                    min=p ;
                }
            }
            else{
                if(q<p){
                    result += (p-min);
                    inBuy = false;
                }
            }
        }
        if(inBuy){
            result += ((prices[len-1])-min);
        }
        return result;
    }
}


2013-04-19 21:50 发表评论
]]>最佳的股票买卖旉http://www.aygfsteel.com/sandy/archive/2013/04/19/398087.htmlFri, 19 Apr 2013 07:03:00 GMThttp://www.aygfsteel.com/sandy/archive/2013/04/19/398087.htmlhttp://www.aygfsteel.com/sandy/comments/398087.htmlhttp://www.aygfsteel.com/sandy/archive/2013/04/19/398087.html#Feedback0http://www.aygfsteel.com/sandy/comments/commentRss/398087.htmlhttp://www.aygfsteel.com/sandy/services/trackbacks/398087.html
你只能进行一ơ交易(一ơ买q和一ơ卖出)Q设计一个算法求出最大的收益?nbsp; 阅读全文

2013-04-19 15:03 发表评论
]]>
二叉?wi)最大的路径?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/sandy/archive/2013/04/18/398054.html</guid><wfw:comment>http://www.aygfsteel.com/sandy/comments/398054.html</wfw:comment><comments>http://www.aygfsteel.com/sandy/archive/2013/04/18/398054.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/sandy/comments/commentRss/398054.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/sandy/services/trackbacks/398054.html</trackback:ping><description><![CDATA[     摘要: l定一个二叉树(wi)Q寻找最大的路径? <br>路径可以从Q意节点开始到L节点l束。(也可以是单个节点Q?<br> <br>比如Q对于二叉树(wi) <br> 1 <br> / \ <br>2 3 <br>和最大的路径?->1->3Q结果ؓ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> */  <a href='http://www.aygfsteel.com/sandy/archive/2013/04/18/398054.html'>阅读全文</a><img src ="http://www.aygfsteel.com/sandy/aggbug/398054.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/sandy/" target="_blank">明</a> 2013-04-18 21:31 <a href="http://www.aygfsteel.com/sandy/archive/2013/04/18/398054.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字梯游戏IIhttp://www.aygfsteel.com/sandy/archive/2013/04/18/398045.htmlThu, 18 Apr 2013 09:32:00 GMThttp://www.aygfsteel.com/sandy/archive/2013/04/18/398045.htmlhttp://www.aygfsteel.com/sandy/comments/398045.htmlhttp://www.aygfsteel.com/sandy/archive/2013/04/18/398045.html#Feedback0http://www.aygfsteel.com/sandy/comments/commentRss/398045.htmlhttp://www.aygfsteel.com/sandy/services/trackbacks/398045.html
1.每次只能变换一个字?
2.所有的中间单词必须存在于字怸

比如Q?
输入Q?
start = "hit"
end = "cog"
dict = ["hot","dot","dog","lot","log"]

那么最短的变化序列有两?
["hit","hot","dot","dog","cog"],
["hit","hot","lot","log","cog"]?
注意Q?
1. 所有单词的长度都是相同?
2. 所有单词都只含有小写的字母?nbsp; 阅读全文

2013-04-18 17:32 发表评论
]]>
合ƈ排序好的数组http://www.aygfsteel.com/sandy/archive/2013/04/18/398017.htmlThu, 18 Apr 2013 05:44:00 GMThttp://www.aygfsteel.com/sandy/archive/2013/04/18/398017.htmlhttp://www.aygfsteel.com/sandy/comments/398017.htmlhttp://www.aygfsteel.com/sandy/archive/2013/04/18/398017.html#Feedback0http://www.aygfsteel.com/sandy/comments/commentRss/398017.htmlhttp://www.aygfsteel.com/sandy/services/trackbacks/398017.html
public class Solution {
public void merge(int A[], int m, int B[], int n) {
//write your code here }
}

注意Q?
假定A有够的额外的容量储存B的内容,m和n分别为A和B的初始化元素的个数。要求算法复杂度在O(m+n)?nbsp; 阅读全文

2013-04-18 13:44 发表评论
]]>
字梯游戏http://www.aygfsteel.com/sandy/archive/2013/04/18/398014.htmlThu, 18 Apr 2013 04:46:00 GMThttp://www.aygfsteel.com/sandy/archive/2013/04/18/398014.htmlhttp://www.aygfsteel.com/sandy/comments/398014.htmlhttp://www.aygfsteel.com/sandy/archive/2013/04/18/398014.html#Feedback0http://www.aygfsteel.com/sandy/comments/commentRss/398014.htmlhttp://www.aygfsteel.com/sandy/services/trackbacks/398014.html
1.每次只能变换一个字?
2.所有的中间单词必须存在于字怸

比如Q?
输入Q?
start = "hit"
end = "cog"
dict = ["hot","dot","dog","lot","log"]

那么最短的变化序列?hit" -> "hot" -> "dot" -> "dog" -> "cog"Q所以返回长度是5?
注意Q?
1. 如果找不到这L(fng)序列Q返?
2. 所有单词的长度都是相同?
3. 所有单词都只含有小写的字母?nbsp; 阅读全文

2013-04-18 12:46 发表评论
]]>
二叉?wi)求和问?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/sandy/archive/2013/04/16/397901.html</guid><wfw:comment>http://www.aygfsteel.com/sandy/comments/397901.html</wfw:comment><comments>http://www.aygfsteel.com/sandy/archive/2013/04/16/397901.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/sandy/comments/commentRss/397901.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/sandy/services/trackbacks/397901.html</trackback:ping><description><![CDATA[     摘要: l定一个二叉树(wi)Q每个节点的值是一个数字(0-9Q,每个从根节点到叶节点均能l成一个数字?<br>比如如果从根节点到叶节点的\径是1-2-3Q那么这代表?23q个数字?<br>求出所有这样从根节点到叶节点的数字之和?<br> <br>比如Q对于二叉树(wi) <br> 1 <br> / \ <br>2 3 <br> <br>一共有两条路径1->2?->3Q那么求和的l果是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  <a href='http://www.aygfsteel.com/sandy/archive/2013/04/16/397901.html'>阅读全文</a><img src ="http://www.aygfsteel.com/sandy/aggbug/397901.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/sandy/" target="_blank">明</a> 2013-04-16 11:37 <a href="http://www.aygfsteel.com/sandy/archive/2013/04/16/397901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>包围的区?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/sandy/archive/2013/04/15/397875.html</guid><wfw:comment>http://www.aygfsteel.com/sandy/comments/397875.html</wfw:comment><comments>http://www.aygfsteel.com/sandy/archive/2013/04/15/397875.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.aygfsteel.com/sandy/comments/commentRss/397875.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/sandy/services/trackbacks/397875.html</trackback:ping><description><![CDATA[     摘要: l定一?D的棋盘,含有‘X'和’O'Q找到所有被‘X'包围的’O'Q然后把该区域的‘O’都变成'X'?<br> <br>例子-输入Q?<br>X X X X <br>X O O X <br>X X O X <br>X O X X <br> <br>应该输出Q?<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>}  <a href='http://www.aygfsteel.com/sandy/archive/2013/04/15/397875.html'>阅读全文</a><img src ="http://www.aygfsteel.com/sandy/aggbug/397875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/sandy/" target="_blank">明</a> 2013-04-15 18:17 <a href="http://www.aygfsteel.com/sandy/archive/2013/04/15/397875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>回文字符串的切割问题2http://www.aygfsteel.com/sandy/archive/2013/04/15/397847.htmlMon, 15 Apr 2013 05:52:00 GMThttp://www.aygfsteel.com/sandy/archive/2013/04/15/397847.htmlhttp://www.aygfsteel.com/sandy/comments/397847.htmlhttp://www.aygfsteel.com/sandy/archive/2013/04/15/397847.html#Feedback0http://www.aygfsteel.com/sandy/comments/commentRss/397847.htmlhttp://www.aygfsteel.com/sandy/services/trackbacks/397847.html要求q回所有可能的分割?

比如Q对于字W串s="aab",
q回:

[
["aa","b"],
["a","a","b"]
]
  阅读全文

2013-04-15 13:52 发表评论
]]>
+1http://www.aygfsteel.com/sandy/archive/2013/04/15/397841.htmlMon, 15 Apr 2013 03:22:00 GMThttp://www.aygfsteel.com/sandy/archive/2013/04/15/397841.htmlhttp://www.aygfsteel.com/sandy/comments/397841.htmlhttp://www.aygfsteel.com/sandy/archive/2013/04/15/397841.html#Feedback3http://www.aygfsteel.com/sandy/comments/commentRss/397841.htmlhttp://www.aygfsteel.com/sandy/services/trackbacks/397841.htmlpublic class Solution {
public int[] plusOne(int[] digits) {
}
}  阅读全文

2013-04-15 11:22 发表评论
]]>
快速开qxhttp://www.aygfsteel.com/sandy/archive/2013/04/15/397836.htmlMon, 15 Apr 2013 02:19:00 GMThttp://www.aygfsteel.com/sandy/archive/2013/04/15/397836.htmlhttp://www.aygfsteel.com/sandy/comments/397836.htmlhttp://www.aygfsteel.com/sandy/archive/2013/04/15/397836.html#Feedback0http://www.aygfsteel.com/sandy/comments/commentRss/397836.htmlhttp://www.aygfsteel.com/sandy/services/trackbacks/397836.html计算和返回x的^Ҏ(gu)?nbsp; 阅读全文

2013-04-15 10:19 发表评论
]]>
最长连l序列问?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/sandy/archive/2013/04/12/397751.html</guid><wfw:comment>http://www.aygfsteel.com/sandy/comments/397751.html</wfw:comment><comments>http://www.aygfsteel.com/sandy/archive/2013/04/12/397751.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.aygfsteel.com/sandy/comments/commentRss/397751.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/sandy/services/trackbacks/397751.html</trackback:ping><description><![CDATA[     摘要: l定一个未排序的整数数l,求最长的q箋序列的长度。要求算法的旉复杂度在O(n) <br>比如对于数组[100, 4, 200, 1, 3, 2]Q其中最长序列ؓ[1,2,3,4]Q所以应该返? <br> <br>public class Solution { <br> public int longestConsecutive(int[] num) { <br> //write your code here <br> } <br>}  <a href='http://www.aygfsteel.com/sandy/archive/2013/04/12/397751.html'>阅读全文</a><img src ="http://www.aygfsteel.com/sandy/aggbug/397751.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/sandy/" target="_blank">明</a> 2013-04-12 15:58 <a href="http://www.aygfsteel.com/sandy/archive/2013/04/12/397751.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>回文字符串的切割问题http://www.aygfsteel.com/sandy/archive/2013/04/11/397689.htmlThu, 11 Apr 2013 03:24:00 GMThttp://www.aygfsteel.com/sandy/archive/2013/04/11/397689.htmlhttp://www.aygfsteel.com/sandy/comments/397689.htmlhttp://www.aygfsteel.com/sandy/archive/2013/04/11/397689.html#Feedback1http://www.aygfsteel.com/sandy/comments/commentRss/397689.htmlhttp://www.aygfsteel.com/sandy/services/trackbacks/397689.html求最的分割ơ数?nbsp; 阅读全文

2013-04-11 11:24 发表评论
]]>
TopCoder MatchMaker解法http://www.aygfsteel.com/sandy/archive/2013/04/02/397286.htmlTue, 02 Apr 2013 06:04:00 GMThttp://www.aygfsteel.com/sandy/archive/2013/04/02/397286.htmlhttp://www.aygfsteel.com/sandy/comments/397286.htmlhttp://www.aygfsteel.com/sandy/archive/2013/04/02/397286.html#Feedback0http://www.aygfsteel.com/sandy/comments/commentRss/397286.htmlhttp://www.aygfsteel.com/sandy/services/trackbacks/397286.html问题描述Q?/div>
Problem Statement
THIS PROBLEM WAS TAKEN FROM THE SEMIFINALS OF THE TOPCODER INVITATIONAL
TOURNAMENT
DEFINITION
Class Name: MatchMaker
Method Name: getBestMatches
Paramaters: String[], String, int
Returns: String[]
Method signature (be sure your method is public):  String[]
getBestMatches(String[] members, String currentUser, int sf);
PROBLEM STATEMENT
A new online match making company needs some software to help find the "perfect
couples".  People who sign up answer a series of multiple-choice questions.
Then, when a member makes a "Get Best Mates" request, the software returns a
list of users whose gender matches the requested gender and whose answers to
the questions were equal to or greater than a similarity factor when compared
to the user's answers.
Implement a class MatchMaker, which contains a method getBestMatches.  The
method takes as parameters a String[] members, String currentUser, and an int
sf:
- members contains information about all the members.  Elements of members are
of the form "NAME G D X X X X X X X X X X" 
   * NAME represents the member's name
   * G represents the gender of the current user. 
   * D represents the requested gender of the potential mate. 
* Each X indicates the member's answer to one of the multiple-choice
questions.  The first X is the answer to the first question, the second is the
answer to the second question, et cetera. 
- currentUser is the name of the user who made the "Get Best Mates" request.  
- sf is an integer representing the similarity factor.
The method returns a String[] consisting of members' names who have at least sf
identical answers to currentUser and are of the requested gender.  The names
should be returned in order from most identical answers to least.  If two
members have the same number of identical answers as the currentUser, the names
should be returned in the same relative order they were inputted.
TopCoder will ensure the validity of the inputs.  Inputs are valid if all of
the following criteria are met:
- members will have between 1 and 50 elements, inclusive.
- Each element of members will have a length between 7 and 44, inclusive.
- NAME will have a length between 1 and 20, inclusive, and only contain
uppercase letters A-Z.
- G can be either an uppercase M or an uppercase F.
- D can be either an uppercase M or an uppercase F.
- Each X is a capital letter (A-D).
- The number of Xs in each element of the members is equal.  The number of Xs
will be between 1 and 10, inclusive. 
- No two elements will have the same NAME.
- Names are case sensitive.
- currentUser consists of between 1 and 20, inclusive, uppercase letters, A-Z,
and must be a member.
- sf is an int between 1 and 10, inclusive.
- sf must be less than or equal to the number of answers (Xs) of the members.
NOTES
The currentUser should not be included in the returned list of potential mates.
EXAMPLES
For the following examples, assume members =
{"BETTY F M A A C C",
 "TOM M F A D C A",
 "SUE F M D D D D",
 "ELLEN F M A A C A",
 "JOE M F A A C A",
 "ED M F A D D A",
 "SALLY F M C D A B",
 "MARGE F M A A C C"}
If currentUser="BETTY" and sf=2, BETTY and TOM have two identical answers and
BETTY and JOE have three identical answers, so the method should return
{"JOE","TOM"}.
If currentUser="JOE" and sf=1, the method should return
{"ELLEN","BETTY","MARGE"}.
If currentUser="MARGE" and sf=4, the method should return [].
Definition
Class:
MatchMaker
Method:
getBestMatches
Parameters:
String[], String, int
Returns:
String[]
Method signature:
String[] getBestMatches(String[] param0, String param1, int param2)
(be sure your method is public)


================================================================我的代码=============

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class MatchMaker {
    enum GENDER{MALE,FEMALE};
    
    //"NAME G D X X X X X X X X X X" 
    private static class Member{
        String name;
        GENDER gender;
        GENDER mate;
        String[] answers;
        int index;
        int matched = 0;
    }
    
    String[] getBestMatches(String[] members, String currentUser, int sf){
        List<Member> allMembers = new ArrayList<Member>();
        Member cu = null;
        for(int i=0;i<members.length;++i){
            String m = members[i];
            String[] c = m.split(" ");
            Member mem = new Member();
            mem.name= c[0];
            mem.gender = c[1].equals("M")?GENDER.MALE:GENDER.FEMALE;
            mem.mate = c[2].equals("M")?GENDER.MALE:GENDER.FEMALE;
            mem.index = i;
            mem.matched = 0;
            String[] answers = mem.answers = new String[c.length-3];
            for(int j=3;j<c.length;++j){
                answers[j-3] = c[j];
            }
            allMembers.add(mem);
            if(c[0].equals(currentUser)){
                cu = mem;
            }
        }
        List<Member> matched = new ArrayList<Member>();
        if(cu!=null){
            for(Member mem:allMembers){
                if(mem!=cu && mem.gender==cu.mate){
                    for(int i=0;i<mem.answers.length;++i){
                        if(mem.answers[i].equals(cu.answers[i])){
                            ++mem.matched;
                        }
                    }
                    if(mem.matched>=sf){
                        matched.add(mem);
                    }
                }
            }
            
            Collections.sort(matched, new Comparator<Member>(){
                public int compare(Member ma, Member mb) {
                    if(ma.matched!=mb.matched){
                        return mb.matched - ma.matched;
                    }
                    return ma.index-mb.index;
                }
            });
            
            String[] result = new String[matched.size()];
            for(int i=0;i<result.length;++i){
                result[i] = matched.get(i).name;
            }
            return result;
        }
        return new String[0];
    }
}




2013-04-02 14:04 发表评论
]]>
TopCoder Prerequisites解法http://www.aygfsteel.com/sandy/archive/2011/10/25/361989.htmlTue, 25 Oct 2011 05:28:00 GMThttp://www.aygfsteel.com/sandy/archive/2011/10/25/361989.htmlhttp://www.aygfsteel.com/sandy/comments/361989.htmlhttp://www.aygfsteel.com/sandy/archive/2011/10/25/361989.html#Feedback3http://www.aygfsteel.com/sandy/comments/commentRss/361989.htmlhttp://www.aygfsteel.com/sandy/services/trackbacks/361989.htmlhttp://community.topcoder.com/stat?c=problem_statement&pm=164&rd=50

Class Name: Prerequisites

Mathod Name: orderClasses

Parameters: String[]

Returns: String[]

 

You are a student at a college with the most unbelievably complex prerequisite

structure ever. To help you schedule your classes, you decided to put together

a program that returns the order in which the classes should be taken. 

 

Implement a class Prerequisites which contains a method orderClasses. The

method takes a String[] that contains the classes you must take and returns a

String[] of classes in the order the classes should be taken so that all

prerequisites are met.

 

String[] elements will be of the form (and TopCoder will ensure this):

"CLASS: PRE1 PRE2 ..." where PRE1 and PRE2 are prerequisites of CLASS. CLASS,

PRE1, PRE2, ... consist of a department name (3 or 4 capital letters, A-Z

inclusive) followed by a class number (an integer between 100 and 999,

inclusive). The department name should be immediately followed by the class

number with no additional characters, numbers or spaces (i.e. MATH217). It is

not necessary for a class to have prerequisites. In such a case, the colon is

the last character in the String. 

 

You can only take one class at a time, therefore, use the following rules to

determine which class to take :

1) Any prerequisite class(es) listed for a class must be taken before the class

can be taken.

2) If multiple classes can be taken at the same time, you take the one with the

lowest number first, regardless of department.

3) If multiple classes with the same number can be taken at the same time, you

take the department name which comes first in alphabetical order. 

4) If the inputted course schedule has errors, return a String[] of length 0.

There is an error if it is impossible to return the classes in an order such

that all prerequisites are met, or if a prerequisite is a course that does not

have its own entry in the inputted String[].

 

Examples of valid input Strings are:

"CSE111: CSE110 MATH101"

"CSE110:"

 

Examples of invalid input Strings are:

"CS117:" (department name must consist of 3 - 4 capital letters, inclusive)

"cs117:" (department name must consist of 3 - 4 capital letters, inclusive)

"CS9E11:" (department name must be letters only)

"CSE110: " (no trailing spaces allowed)

"CSE110: CSE101 " (no trailing spaces allowed)

"MATH211: MAM2222" (class number to large)

"MATH211: MAM22" (class number to small)

"ENGIN517: MATH211" (department name to large)

 

Here is the method signature (be sure your method is public):

String[] orderClasses(String[] classSchedule);

 

TopCoder will make sure classSchedule contains between 1 and 20 Strings,

inclusive, all of the form above. The Strings will have between 1 and 50

characters, inclusive. TopCoder will check that the syntax of the Strings are

correct: The Strings will contain a valid class name, followed by a colon,

possibly followed by a series of unique prerequisite classes separated by

single spaces. Also, TopCoder will ensure that each class has at most one

entry in the String[].

 

Examples:

If classSchedule={

"CSE121: CSE110",

"CSE110:",

"MATH122:",

}

The method should return: {"CSE110","CSE121","MATH122"}

 

If classSchedule={

"ENGL111: ENGL110",

"ENGL110: ENGL111"

}

The method should return: {}

 

If classSchedule=[

"ENGL111: ENGL110"

}

The method should return: {}

 

If classSchedule={

"CSE258: CSE244 CSE243 INTR100"

"CSE221: CSE254 INTR100"

"CSE254: CSE111 MATH210 INTR100"

"CSE244: CSE243 MATH210 INTR100"

"MATH210: INTR100"

"CSE101: INTR100"

"CSE111: INTR100"

"ECE201: CSE111 INTR100"

"ECE111: INTR100"

"CSE243: CSE254"

"INTR100:"

}

The method should return:

{"INTR100","CSE101","CSE111","ECE111","ECE201","MATH210","CSE254","CSE221","CSE2

43","CSE244","CSE258"}

 

 

Definition

          

Class:      Prerequisites

Method:   orderClasses

Parameters:     String[]

Returns: String[]

Method signature:   String[] orderClasses(String[] param0)

(be sure your method is public)


------------------------------------------------------------我的解法如下----------------------------------------

x很简单,q道题本质上是一道排序问题,我们只需要定义好排序的逻辑Q然后应用快排就可以了?br />


import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Prerequisites {
    
private static final String[] EMPTY = {};
    Map
<String,Klass> classes = new HashMap<String,Klass>();
    
    
static class Klass implements Comparable<Klass>{
        String name;
        
int number;
        String dept;
        List
<Klass> pres = new ArrayList<Klass>();
        
boolean exist = false;
        
        Klass(String name){
            
this.name = name;
            
int len = name.length();
            
this.number = Integer.parseInt(name.substring(len-3));
            
this.dept =name.substring(0,len-3);
        }
        
        
private boolean isPre(Klass k){
            
if(k==thisreturn false;
            
            
for(Klass p:this.pres){
                
if(k == p || p.isPre(k)) return true;
            }
            
return false;
        }

        @Override
        
public int compareTo(Klass that) {
            
boolean pre = this.isPre(that);
            
boolean sub = that.isPre(this);
            
            
if(pre && sub){
                
throw new RuntimeException("circle detected");
            }
            
else if(pre){
                
return 1;
            }
            
else if(sub){
                
return -1;
            }
            
if(this.number!=that.number) return this.number-that.number;
            
return this.dept.compareTo(that.dept);
        }
    }
    
    
private Klass getClass(String name){
        Klass k 
= classes.get(name);
        
if(k==null){
            k 
= new Klass(name);
            classes.put(name, k);
        }
        
return k;
    }
    
    
public String[] orderClasses(String[] classSchedule){
        classes.clear();
        //parse the input
        
for(String s:classSchedule){
            
int idx = s.indexOf(":");
            String name 
= s.substring(0,idx);
            Klass k 
= getClass(name);
            k.exist 
= true;
            
if(idx!=s.length()-1){
                String[] pres 
= s.substring(idx+1).split(" ");
                
for(String pre:pres){
                    
if(pre.length()>0){
                        Klass p 
= getClass(pre);
                        k.pres.add(p);
                    }
                }
            }
        }
        
        Klass [] sortedClasses 
=  (Klass[]) classes.values().toArray(new Klass[0]);
        
for(Klass k:sortedClasses){
            
if(!k.exist){
                
return EMPTY;
            }
        }
        
try {
            Arrays.sort(sortedClasses);
        } 
catch (Exception e) {
            
return EMPTY;
        }
        String[] result 
= new String[sortedClasses.length];
        
int c = 0;
        
for(Klass k:sortedClasses){
            result[c
++= k.name;
        }
        
return result;
    }
}




2011-10-25 13:28 发表评论
]]>
վ֩ģ壺 | ŷ| ɽ| ٷ| | С| ɳ| | | ũ| | Ͽ| | | | ũ| | | ̨| ī񹤿| | | | ԣ| | | ˳| | ˫| | ¬| | | | Ϫ| | ;| | | ɳ| |