寒冬数据结构题目思路解析

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbTBfNjE5NDg1NDc=,size_20,color_FFFFFF,t_70,g_se,x_16

 代码自取 排版自排

一二题采用递归将字符串分成最小先后序串和最小中序串,确定其父节点,建立二叉树。

3.4.5题就不用说了吧。

第六题奈何有点菜,目前只能想出暴力解法,最多加几个条件优化一下。

24点public class TwnTree {    ElementType data;    TwnTree lchild;    TwnTree rchild;    public TwnTree()    {        data=new ElementType();        lchild=rchild=null;    }}

public class ElementType {double data;char ch;}

public class Twentyfour

{    public static int cy=0;    public static ArrayList<String> str=new ArrayList();    public static ArrayList<String> newstr=new ArrayList();    public static int count=0;//    public static int count1=0;//    public static int count2=0;//array is too big    public static ArrayList<String> st1=new ArrayList();//char    public static ArrayList<String> st2=new ArrayList();//math     public static void BTdata()    {        String[] a= {"1","2","3","4","5","6","7","8","9"};        for(int i=0;i<a.length;i++)        {            for(int j=0;j<a.length;j++)            {                for(int k=0;k<a.length;k++)                {                    for(int l=0;l<a.length;l++)                    {                        String s=a[i]+a[j]+a[k]+a[l];                        st2.add(s);                    }                }            }        }    }public static ArrayList<String> createstring(){    //four calculate word   BTstring();   BTdata();   for(String s:st1)   {       for(String s1:st2)       {           str.add(s+s1);       }   }    return str;}private static void BTstring() {    // TODO Auto-generated method stub    String[] a1={"+","-","*"};    String[] a2={"+","-","/"};    String[] a3={"+","*","/"};    String[] a4={"-","*","/"};    for(int i=0;i<a1.length;i++)    {        for(int j=0;j<a1.length;j++)        {            for(int k=0;k<a1.length;k++)            {                st1.add(a1[i]+a1[j]+a1[k]);            }        }    }    for(int i=0;i<a2.length;i++)    {        for(int j=0;j<a2.length;j++)        {            for(int k=0;k<a2.length;k++)            {                st1.add(a2[i]+a2[j]+a2[k]);            }        }    }    for(int i=0;i<a3.length;i++)    {        for(int j=0;j<a3.length;j++)        {            for(int k=0;k<a3.length;k++)            {                st1.add(a3[i]+a3[j]+a3[k]);            }        }    }    for(int i=0;i<a4.length;i++)    {        for(int j=0;j<a4.length;j++)        {            for(int k=0;k<a4.length;k++)            {                st1.add(a4[i]+a4[j]+a4[k]);            }        }    }}public static TwnTree CreateTree(TwnTree root,char[] s){    if(count==s.length) return root;    if(s[count]=='#')        {        count++;        root=null;        return root;        }    else    {        root=new TwnTree();        if(s[count]=='+'||s[count]=='-'||s[count]=='*'||s[count]=='/')            root.data.ch=s[count];        else        {            root.data.data=(double)s[count]-'0';        }        count++;        root.lchild=CreateTree(root.lchild,s);        root.rchild=CreateTree(root.rchild,s);    }    return root;}public static double Calculate(TwnTree root){    double val=0.0;    if(root.lchild==null && root.rchild==null)    {        val=root.data.data;    }    else    {        double sum1=Calculate(root.lchild);        double sum2=Calculate(root.rchild);        switch(root.data.ch)    {    case '+':val=sum1+sum2; break;    case '-':val=sum1-sum2; break;    case '*':val=sum1*sum2; break;    case '/':val=sum1/sum2; break;    }    }    return val;}public static double Travel(TwnTree T){    double value=0.0;    if(T.lchild==null&& T.rchild==null)    {        double n=T.data.data;        System.out.print((int)n);        value=T.data.data;    }    else    {        System.out.print("(");        double num1=Travel(T.lchild);        System.out.print(T.data.ch);        double num2=Travel(T.rchild);        System.out.print(")");        switch(T.data.ch)        {        case '+':value=num1+num2;        case '-':value=num1-num2;        case '*':value=num1*num2;        case '/':value=num1/num2;        }    }    return value;}public static void solve(){    str=createstring();    Iterator<String> it=str.iterator();    while(it.hasNext())    {        String str=it.next();        //tree01        String str1="";        str+=(String)str.subSequence(0, 3);        for(int i=3;i<str.length();i++)        {            str1+=(String)str.subSequence(i, i+1)+"##";        }        newstr.add(str1);        //tree02        String t1=(String) str.subSequence(0,2);        t1+=str.charAt(3)+"##";//++x##        String t2=str.charAt(4)+"##";//x##        String t3=(String)str.subSequence(2, 3);            t3+=str.charAt(5)+"##"+str.charAt(6)+"##";//+x##x##        String str2=t1+t2+t3;        newstr.add(str2);    }}public static void main(String[] args){    TwnTree T;//    Scanner sc=new Scanner(System.in);    solve();    Iterator<String> it=newstr.iterator();    while(it.hasNext())    {         String str=it.next();//    String str=sc.next();            char[] ch=str.toCharArray();            double d=0.0;            if(ch[0]=='#')                T=null;            else            {                T=new TwnTree();                if(ch[count]=='+'||ch[count]=='-'||ch[count]=='*'||ch[count]=='/')                    T.data.ch=ch[count];                else                {                    double sum=0.0;                    for(int index=0;index<ch.length;index++)                    {                        sum=sum*10+1.0*(ch[index]-'0');                    }                    T.data.data=sum;                }                count++;                T.lchild=CreateTree(T.lchild,ch);                T.rchild=CreateTree(T.rchild,ch);                d=Calculate(T);            }            if(24-d>=0&&24-d<=0.000001)            {                double data=Travel(T);                System.out.println("=24");            }            else            {                //System.out.println("No");            }            count=0;    }    }}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值