字符串中包含数字、'+'、'-'、'\'、'*', 输出int结果
思路:
将String转成ascii码(效率高),来解析字符串中的算数公式
private static final Map map = new HashMap<>();
static {
//预先缓存好ascii码对应的数字和运算符
map.put((byte) 48, 0);
map.put((byte) 49, 1);
map.put((byte) 50, 2);
map.put((byte) 51, 3);
map.put((byte) 52, 4);
map.put((byte) 53, 5);
map.put((byte) 54, 6);
map.put((byte) 55, 7);
map.put((byte) 56, 8);
map.put((byte) 57, 9);
map.put((byte) 43, 43);
map.put((byte) 45, 45);
map.put((byte) 47, 47);
map.put((byte) 42, 42);
}
public static void main(String[] args) {
System.out.println(calculate("121-17+41/2*3"));
}
private static int calculate(String formula) {
final byte[] data = formula.getBytes();
int result = 0;//结果
int temp = 0;//字符串中每个数字
int sign = 43;//字符串中每个运算符
for (byte b : data) {
final Integer n = map.get(b);//b为每个字符的ascii码
if (n == 43) {
result = getFinalNumber(sign, temp ,result);
sign = 43;
temp = 0;
} else if (n == 45) {
result = getFinalNumber(sign, temp ,result);
sign = 45;
temp = 0;
} else if (n == 47) {
result = getFinalNumber(sign, temp ,result);
sign = 47;
temp = 0;
} else if (n == 42) {
result = getFinalNumber(sign, temp ,result);
sign = 42;
temp = 0;
} else {
temp *= 10;
temp += n;
}
}
return getFinalNumber(sign, temp ,result);
}
//根据运算符来累计计算结果
private static int getFinalNumber(int sign, int temp, int result) {
if (sign == 43) {
return result + temp;
} else if (sign == 45) {
return result - temp;
} else if (sign == 47) {
return result / temp;
} else if (sign == 42) {
return result * temp;
}
return 0;
}
列出集合中所有子集
思路:
从第一个元素开始,列出所有包含第一个元素的子集,
再从第二个元素开始,列出所有包含第二元素但不包含前面元素的子集
...
以此类推
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
loop(new ArrayList<>(), list, 0);
}
/**
* 列出所有包含head集合的子集,然后给head添加后继元素,并递归调用
*
* head:已经列出的元素集合
* source:源集合
* index:需要开始遍历的下标
*/
private static void loop(List head, List source, int index) {
loopChild(head, source, index);
for (int i = index; i < source.size(); i++) {
List second = new ArrayList<>(head);
second.add(source.get(i));
loop(second, source, i + 1);
}
}
//列出所有包含head集合的子集
private static void loopChild(List head, List source, int index) {
for (int i = index; i < source.size(); i++) {
final String e = source.get(i);
head.add(e);
System.out.println(head);
head.remove(e);
}
}