题解 | #给表达式添加运算符#

给表达式添加运算符

https://www.nowcoder.com/practice/fdaee292bdaf4a7eb686c8ce72b2f3e1?tpId=117&tqId=39421&rp=1&ru=/exam/oj&qru=/exam/oj&sourceUrl=%2Fexam%2Foj%3Ftab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D117&difficulty=undefined&judgeStatus=undefined&tags=&title=

import java.util.*;


public class Solution {
    
    public class ComparaInteger implements Comparator<Integer> {
        @Override
        public int compare(Integer num1, Integer num2) {
            return num1 - num2;
        }
    }

    HashSet<ArrayList<Integer>> hashSet = new HashSet<>();
    ArrayList<String> arrayList = new ArrayList<>();

    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * @param num    string字符串
     * @param target int整型
     * @return string字符串一维数组
     */
    public String[] addOpt(String num, int target) {
        // write code here
        ArrayList<Integer> currentNumber = new ArrayList<>();
        splitString(currentNumber, num, 0);
        for (ArrayList<Integer> tmpArr : hashSet) {
            isEqualTarget(new StringBuffer(String.valueOf(tmpArr.get(0))), tmpArr, 1, target, tmpArr.get(0));
        }
        String[] ans = new String[arrayList.size()];
        for (int i = 0; i < arrayList.size(); i++) {
            ans[i] = arrayList.get(i);
        }
        return ans;
    }

    public void splitString(ArrayList<Integer> currentNumber, String num, int index) {
        if (index >= num.length()) {
            ArrayList<Integer> copyArr = new ArrayList<>(currentNumber);
            copyArr.sort(new ComparaInteger());
            hashSet.add(copyArr);
            return;
        }
        if (num.charAt(index) == '0') {
            currentNumber.add(Integer.valueOf(0));
            splitString(currentNumber, num, index + 1);
            return;
        }
        for (int splitIndex = index + 1; splitIndex <= num.length(); splitIndex++) {
            currentNumber.add(Integer.valueOf(num.substring(index, splitIndex)));
            splitString(currentNumber, num, splitIndex);
            currentNumber.remove(currentNumber.size() - 1);
        }
    }

    public void isEqualTarget(StringBuffer currentString, ArrayList<Integer> currentNumber, int index, int target, int previousNum) {
        if (index >= currentNumber.size()) {
            if (previousNum == target) {
                arrayList.add(new String(currentString));
            }
            return;
        }
        StringBuffer copySB1 = new StringBuffer(new String(currentString));
        StringBuffer copySB2 = new StringBuffer(new String(currentString));
        // 加
        currentString.append("+" + currentNumber.get(index));
        isEqualTarget(currentString, currentNumber, index + 1, target, previousNum + currentNumber.get(index));
        // 减
        copySB1.append("-" + currentNumber.get(index));
        isEqualTarget(copySB1, currentNumber, index + 1, target, previousNum - currentNumber.get(index));
        // 乘
        copySB2.append("*" + currentNumber.get(index));
        isEqualTarget(copySB2, currentNumber, index + 1, target, previousNum * currentNumber.get(index));
    }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-10 14:00
林子大了什么鸟都有啊,我觉得我说的已经很客气了,阴阳谁呢
牛客62656195...:应该不是阴阳吧?你第一次注册的时候boss就说你是牛人
点赞 评论 收藏
分享
这算盘打的
程序员小白条:都这样的,都是潜规则,你自己说可以实习一年就行了,实习可以随便跑路的
点赞 评论 收藏
分享
06-28 22:48
已编辑
广东金融学院 Java
小浪_Coding:学院本+这俩项目不是buff叠满了嘛
点赞 评论 收藏
分享
风中翠竹:真的真的真的没有kpi。。。面试官是没有任何kpi的,捞是真的想试试看这个行不行,碰碰运气,或者是面试官比较闲现在,没事捞个人看看。kpi算HR那边,但是只有你入职了,kpi才作数,面试是没有的。
双非有机会进大厂吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务