双十一的规则越来越复杂,你的朋友佩奇已经被各种优惠活动折磨的很痛苦,她向朋友圈发起了求助,想找人帮忙写段代码来计算如何花最少的钱。
佩奇的需求是这样的
她给出来了自己的购买规则,一串只包含加减法的算式,怎么在合适的位置加上括号,让这个算式得到最小值,也就是让佩奇花最少的钱。
作为佩奇朋友圈里最聪明的程序员,你肯定不会放过这次表现的机会,那么你该怎么实现这段代码呢?
输入:
仅有一行,佩奇的购物计算表达式
输入约束:
算式最多有50个字符,且其中仅包含0-9和+、-
算式的第一个字符一定是数字
算式中不会连续出现两个运算符
算式中每个整数最多有5位
输出:
一个整数:佩奇最少需要花费的钱数 (可能是负数,佩奇还能赚到钱)
举例1:
输入:
55-50+30
输出:
-25
解释:
通过增加括号,该算式有两种可能的结果:55-50+30=35和55-(50+30)=-25
举例2:
输入:
10+30+40+20
输出:
100
举例3:
输入:
00009-00008
输出:
1
解释:注意算式中的整数前面可能会出现若干个0.
package com.guavaprogram.guava.main;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class U2407p25 {
private static int count;
private static List<LeftAndRight> result = new ArrayList<>();
private static List<Integer> locate = new ArrayList<>();
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String s = sc.next();
List<String> ss = new ArrayList<>();
List<Integer> nums = new ArrayList<>();
char[] chars = s.toCharArray();
int len = 0;
int num = 0;
while(len < chars.length){
if (chars[len] == '+'){
nums.add(num);
ss.add(String.valueOf(num));
ss.add(String.valueOf(chars[len]));
num =0;
} else if (chars[len] == '-'){
nums.add(num);
ss.add(String.valueOf(num));
locate.add(ss.size());
ss.add(String.valueOf(chars[len]));
num=0;
} else {
int temp = Integer.valueOf(String.valueOf(chars[len]));
num = num*10 + temp;
}
len++;
if(len == chars.length){
ss.add(String.valueOf(num));
}
}
getSmaller(ss);
}
private static void getSmaller(List<String> nums){
int smaller = 0;
if(nums.size() == 1){
smaller = Integer.valueOf(nums.get(0));
} else{
for(int i = 0 ; i < locate.size(); i++){
LeftAndRight leftAndRight = new LeftAndRight();
List<String> left = nums.subList(0,locate.get(i));
List<String> right = nums.subList(locate.get(i)+1,nums.size());
for(int j = 0 ; j < left.size(); j++){
switch (left.get(j)){
case "+": {
j++;
leftAndRight.setLeft(leftAndRight.getLeft()+Integer.valueOf(left.get(j)));
break;
}
case "-":{
j++;
leftAndRight.setLeft(leftAndRight.getLeft()-Integer.parseInt(left.get(j)));
break;
}
default:
leftAndRight.setLeft(Integer.valueOf(left.get(j)));
break;
}
}
for(int j = 0 ; j < right.size(); j++){
switch (right.get(j)){
case "+":
case "-": {
j++;
leftAndRight.setRight(leftAndRight.getRight()+Integer.valueOf(right.get(j)));
break;
}
default:
leftAndRight.setRight(Integer.valueOf(right.get(j)));
break;
}
}
result.add(leftAndRight);
int res = leftAndRight.getLeft() - leftAndRight.getRight();
if (i==0){
smaller = res;
}
if(smaller > res){
smaller = res;
}
}
if(locate.size()==0){
for (int j = 0; j< nums.size();j++){
smaller += Integer.valueOf(nums.get(j));
j++;
}
}
}
System.out.println(smaller);
}
static class LeftAndRight{
private int left;
private int right;
public int getLeft() {
return left;
}
public void setLeft(int left) {
this.left = left;
}
public int getRight() {
return right;
}
public void setRight(int right) {
this.right = right;
}
}
}