shopping计算器

双十一的规则越来越复杂,你的朋友佩奇已经被各种优惠活动折磨的很痛苦,她向朋友圈发起了求助,想找人帮忙写段代码来计算如何花最少的钱。

佩奇的需求是这样的

她给出来了自己的购买规则,一串只包含加减法的算式,怎么在合适的位置加上括号,让这个算式得到最小值,也就是让佩奇花最少的钱。

作为佩奇朋友圈里最聪明的程序员,你肯定不会放过这次表现的机会,那么你该怎么实现这段代码呢?

输入:

仅有一行,佩奇的购物计算表达式

输入约束:

算式最多有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;
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值