算法学习-翻译-火星计算器
1.算法需求
自定义运算符#,$利用下面的计算法则,计算出一个给定的字符串表示的表达式的值,返回整型结果。
* 火星计算器:
* 自定义计算符号 # $,优先级 # $
* x#y=(2*x+y+2)
* x$y=(3*x+y*4)
2.实现思路
定义计算方法,进行字符串截取
3.实现代码
package com.eric; import java.util.Scanner; /** * 火星计算器: * 自定义计算符号 # $,优先级 # $ * x#y=(2*x+y+2) * x$y=(3*x+y*4) *比如:2#3$1 2*2+3+2=9$1=3*9+4=31 */ public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); while (sc.hasNext()){ String inString=sc.nextLine().trim().replace(" ",""); char[] calc_chars ={'#','$'}; for (int i=0;i<calc_chars.length;i++){ while (inString.indexOf(calc_chars[i])!=-1){ inString=compute(inString,calc_chars[i]); } } System.out.println(inString); } } /** * 按照规定的字符进行一次运算 * @param inString 当前的字符串(里面包含了特殊字符,比如 23#4) * @param calc_char 当前发现的特殊字符(#或者$) * @return */ private static String compute(String inString, char calc_char) { // 先把23#4 23 # 4 都提取出来,按照规则计算,然后将计算结果替换为 int bf_index=0,af_index=0; int cal_ind = inString.indexOf(calc_char); for (int i=cal_ind+1;i<inString.length();i++){ if ((inString.charAt(i)!='#')&&(inString.charAt(i)!='$')){ af_index++; }else if ((inString.charAt(i)=='#')||(inString.charAt(i)=='$')){ break; } } for(int i=cal_ind-1;i>=0;i--){ if ((inString.charAt(i)!='#')&&(inString.charAt(i)!='$')){ bf_index++; }else if ((inString.charAt(i)=='#')||(inString.charAt(i)=='$')){ break; } } String bString=inString.substring(cal_ind-bf_index,cal_ind); String afString=inString.substring(cal_ind+1,cal_ind+1+af_index); String swapString=inString.substring(cal_ind-bf_index,cal_ind+1+af_index); int result=0; // 开始判断 switch (calc_char){ case '#': //(2*x+y+2) result=2*Integer.parseInt(bString)+Integer.parseInt(afString)+2; break; case '$': // x$y=(3*x+y*4) result=3*Integer.parseInt(bString)+Integer.parseInt(afString)*4; break; default: break; } inString=inString.replace(swapString,String.valueOf(result)); return inString; } }
We only live once, and time just goes by.