前天参加某外包的华为复试碰到的一算法题。
大致为输入一字符串,返回的是改字符串的四则运算结果,
例如 :输入 "1+2-3*4+5-6" 返回的是-10
该字符串必须符合此规则,而且运算符只有"+、-、*",且数字为个位。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;
public class StringTest2 {
public static void main(String[] args) {
String str = "1+2-0-3*4*1+5+5-6";
long start = System.currentTimeMillis();
int result = test(str);
long end = System.currentTimeMillis();
System.out.println(result+"--花时间:"+(end-start));
}
public static int test(String str) {
if (str == null) {
return 0;
}
String regex = "^\\d([\\+\\-\\*]\\d)+$";
if(!Pattern.matches(regex, str)) {
System.out.println("字符串不符.");
return 0;
}
int result = 0;
int length = str.length();
char[] cc = str.toCharArray();
System.out.println(cc);
List<Integer> listInt = new ArrayList<Integer>();
List<Character> listChar = new ArrayList<Character>();
for (int i = 0; i < length; i++) {
if (i % 2 == 0) {
if(cc[i]!='0')
listInt.add(Integer.parseInt(cc[i] + ""));
} else {
if(cc[i+1]!='0')
listChar.add(cc[i]);
}
}
System.out.println("listInt:" + listInt);
System.out.println("listChar:" + listChar);
length = listChar.size();
for (int i = 0; i < length; i++) {
if(listChar.get(i)=='*'){
result = listInt.get(i)*listInt.get(i+1);
listInt.set(i, 0);
listInt.set(i+1, result);
}
}
System.out.println("Change listInt:" + listInt);
System.out.println("Change listChar:" + listChar);
Iterator<Integer> itInt = listInt.iterator();
while(itInt.hasNext()){
if(0==itInt.next())
itInt.remove();
}
Iterator<Character> itChar = listChar.iterator();
while(itChar.hasNext()){
if('*'==itChar.next())
itChar.remove();
}
System.out.println("2Change listInt:" + listInt);
System.out.println("2Change listChar:" + listChar);
length = listChar.size();
for (int i = 0; i < length; i++) {
if(listChar.get(i)=='+'){
result = listInt.get(i)+listInt.get(i+1);
listInt.set(i+1, result);
}else{
result = listInt.get(i)-listInt.get(i+1);
listInt.set(i+1, result);
}
}
return result;
}
}
运行结果:
1+2-0-3*4*1+5+5-6
listInt:[1, 2, 3, 4, 1, 5, 5, 6]
listChar:[+, -, *, *, +, +, -]
Change listInt:[1, 2, 0, 0, 12, 5, 5, 6]
Change listChar:[+, -, *, *, +, +, -]
2Change listInt:[1, 2, 12, 5, 5, 6]
2Change listChar:[+, -, +, +, -]
-5--花时间:14
总结思路为:
1:先将字符串转为字符数组,
2:根据字符数组将数字存一List(listInt),运算符存另一List(listChar),
并在存储过程中对数字0进行处理,当碰到为0时listInt不存储数字0,
当碰到下一个数字为0时listChar不存储该个运算符。
3:先对*法运算符进行处理,将*字符前的数字(listInt对应 该字符index的数字)设为0,
*字符后的数字(listInt对应 该字符index+1的数字)设为相乘所得到的结果。
4:将listInt的0全部remove,将listChar的*全部remove。
5:最后进行+、-操作,+,-字符后的数字(listInt对应 该字符index+1的数字)设为相加或相减所得到的结果。
有更好的想法的,交流交流。