华为2014第三题
2015-06-15 15:34
274 查看
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 ; 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
相关文章推荐
- 浅谈协方差矩阵
- 对hive和hbase的理解 基于【浅谈Hive vs. HBase】
- 第三章 动态规划
- erlang http linux curl 返回空的问题
- Android开源项目—Zxing的使用
- Linux内存分配函数5
- django设置当浏览器关闭时,session失效
- Android学习笔记——Bundle
- js中屏蔽a标签右键中在新窗口打开功能
- rsync远程同步
- [LeetCode] Basic Calculator
- 交换两个整型数的方法
- sicily 1071(搜索)
- Android ViewPager 引导页的一种效果
- v4l2报错------uvcvideo: Non-zero status (-71) in video completion handler.
- 三年后
- 在MacOS上搭建Git 服务器
- 重踏学习Java路上_Day04(java 基础上,选择结构,循环结构,转跳)
- PHP检测用户语言的方法
- Android自定义View—NumberPicker的使用