华为2014第三题

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.security.auth.kerberos.KerberosKey;
public class Main{
    int N=8;
    int [] step=new int[N];
    String ope[]={"+","-",""};
    ScriptEngineManager manager=new ScriptEngineManager();
    ScriptEngine engine=manager.getEngineByName("js");
    private void step()
    {
        step[N-1]++;
        for(int i=N-1;i>=0;i--)
        {
            if(step[i]>2)
            {
                step[i]=step[i]%3;
                if(i!=0)
                    step[i-1]++;
            }
            else {
                break;
            }
        }
    }
    public int search() throws ScriptException
    {
          int K=(int)Math.pow(3, N);
        int count=0;
          for(int i=0;i<K;i++)
          {
              String operation="1"+ope[step[0]]+"2"+ope[step[1]]+"3"+ope[step[2]]+
                      "4"+ope[step[3]]+"5"+ope[step[4]]+"6"+ope[step[5]]+
                      "7"+ope[step[6]]+"8"+ope[step[7]]+"9";
                //Object result=engine.eval(operation);
              //double d=((Double)result).doubleValue();
                String result=sizeyunsuan(operation);
                double d=Double.parseDouble(result);
                if((int)d==5)
                {
                    count++;
                }
                step();
          }
          return count;
    }
    private static String addBigDecimal(String a,String b)
    {
        double a1=Double.parseDouble(a);
        double b1=Double.parseDouble(b);
        BigDecimal a2=BigDecimal.valueOf(a1);
        BigDecimal b2=BigDecimal.valueOf(b1);
        BigDecimal s=a2.add(b2);
        return s.toString();
    }
    private static String substractBigDecimal(String a,String b)
    {
        double a1=Double.parseDouble(a);
        double b1=Double.parseDouble(b);
        BigDecimal a2=BigDecimal.valueOf(a1);
        BigDecimal b2=BigDecimal.valueOf(b1);
        BigDecimal s=a2.subtract(b2);
        return s.toString();
    }
    private static String sizeyunsuan(String s)
    {
        //1、先将  +-*/找出来
        int p=0;//the count of (+-*/)
        for(int i=0;i<s.length();i++)
        {
            if(s.charAt(i)==‘+‘ || s.charAt(i)==‘-‘)
                p++;
        }
        //将字符串按照运算符进行切割总共有  2*p+1个段   example:p=5
        String[] piece=new String[2*p+1];// save pieces divided by operator   11 pieces
        int start=0,index=0;//
        for(int i=0;i<s.length();i++)
        {
            if(s.charAt(i)==‘+‘ || s.charAt(i)==‘-‘)
            {
                piece[index]=s.substring(start,i);//index=0  i=1  p[0]="9"
                index++;
                piece[index]=""+s.charAt(i);    //index=1  i=1  p[1]="+"
                index++;
                start=i+1;   //start=2
            }
        }
        // last piece;
        piece[index]=s.substring(start,s.length());
        ///
        int count=p;
        while(count>0)
        {
            //then calculate +-
            for(int i=0;i<piece.length;i++)
            {
                if(piece[i].equals("+") || piece[i].equals("-"))
                {
                    //find strs in piece has not calculated
                    //find strs left not equals "p"
                    int l=0;
                    for(l=i-1;l>-1;l--)
                    {
                        if(!piece[l].equals("p"))
                            break;
                    }
                    //find strs right not equals "p"
                    int r=0;
                    for(r=i+1;r<piece.length;r++)
                    {
                        if(!piece[r].equals("p"))
                            break;
                    }
                    if(piece[i].equals("+"))
                    {
                        piece[i]=addBigDecimal(piece[l], piece[r]);
                        piece[l]="p";
                        piece[r]="p";
                        count--;
                    }
                    else
                    {
                        piece[i]=substractBigDecimal(piece[l], piece[r]);
                        piece[l]="p";
                        piece[r]="p";
                        count--;
                    }
                    //break;
                }
            }
        }
        String r="";
        //find the string not equals "p"
        for(int i=0;i<piece.length;i++)
        {
            if(!piece[i].equals("p"))
            {
                r=piece[i];
                break;
            }
        }
        return r;
    }
      public static void main(String[] args) throws ScriptException{
          Main main=new Main();
          long begin=System.currentTimeMillis();
          int c=main.search();
          long end=System.currentTimeMillis();
          System.out.println(c);
          System.out.println("共花费"+(end-begin)+"ms");
      }

}

使用ScriptEngineManager

21

共花费637ms

使用自定义算法

21

共花费80ms

时间: 2024-10-13 23:39:54

华为2014第三题的相关文章

USACO翻译:USACO 2014 JAN三题(2)

USACO 2014 JAN 一.题目概览 中文题目名称 队伍平衡 滑雪录像 滑雪场建设 英文题目名称 bteams recording skicourse 可执行文件名 bteams recording skicourse 输入文件名 bteams.in recording.in skicourse.in 输出文件名 bteams.out recording.out skicourse.out 每个测试点时限 1秒 1秒 1秒 测试点数目 10 10 10 每个测试点分值 10 10 10 比

2014马哥Linux0217中对0214三题的解答

前几天在做2014马哥Linux0214的作业的时候,发现其实这三题在0217中有解答,当然觉得马哥比自己写得好太多,所以忍不住要把马哥的答案贴出来,以供自己学习. 第一题:写一个脚本,用for循环实现显示/etc/init.d/functions./etc/rc.d/rc.sysinit./etc/fstab有多少行 #!/bin/bash for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab;do line

2014百度之星资格赛第三题

Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total Submission(s): 7837    Accepted Submission(s): 3350 Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Z

2014 百度之星第三题

Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total Submission(s): 0    Accepted Submission(s): 0 Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包括了N个正整数,随后 Prometheus 将向 Zeus 发起

2014百度之星第三题Xor Sum

Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total Submission(s): 4445    Accepted Submission(s): 652 Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Ze

2014年百度之星资格赛第三题Xor Sum

Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包括了N个正整数,随后 Prometheus 将向 Zeus 发起M次询问,每次询问中包括一个正整数 S ,之后 Zeus 须要在集合其中找出一个正整数 K ,使得 K 与 S 的异或结果最大.Prometheus 为了让 Zeus 看到人类的伟大,随即允许 Zeus 能够向人类求助.你能证明人类的智慧么? Input 输入包括若干组測试数据,每组測试数据

[华为机试真题][2014]63.等式变换

题目 输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立. 1 2 3 4 5 6 7 8 9 = X 比如: 12-34+5-67+89 = 5 1+23+4-5+6-7-8-9 = 5 请编写程序,统计满足输入整数的所有整数个数. 输入: 正整数,等式右边的数字 输出: 使该等式成立的个数 样例输入:5 样例输出:21 代码 /*--------------------------------------- * 日期:2015-07-06 * 作者:SJF0115 *

[华为机试真题][2014]64.实现两个合法时间相加

题目 描述: 给定两个合法的时间(格式固定:hh:mm:ss,时间合法,不用考虑其它情况),输入两个时间相加后的结果:注意,相加后的结果也必需是一个合法的时间: 附合法时间定义:小时在[00-23]之间,分钟和秒分别是在[00-59]之间: 运行时间限制: 无限制 内存限制: 无限制 输入: 时分秒格式的时间字符串,如00:00:00 输出: 时分秒格式的时间字符串,如00:00:00 样例输入: 00:00:00 00:00:01 样例输出: 00:00:01 答案提示: 建议将时间转换为秒数

华为2014机试题(一)

过几天就要进行华为的机试了,今儿临时抱抱佛脚,在网上找到2014届华为校招的机试题,琢磨了一会儿,贴出来记录下. 首先感谢一下Hackbuteer提供的题目:http://blog.csdn.net/hackbuteer1/article/details/11132567 对于第一题,字符过滤.最简单也是最直接的就是HASH.题目规定了输入序列只能为小写字符'a~z'.因此直接开辟一个大小为26的数组用于记录当前字符是否已经出现即可. 需要注意的问题: 1. hash数组记得初始化 2. pOu