美文网首页
问题的拆分

问题的拆分

作者: Wilbur_ | 来源:发表于2020-11-14 00:40 被阅读0次

今天早上做Twitch的在线笔试,还是经验不够丰富,这道题其实可以把问题拆分开来。这样就会让思路清晰很多。这道题有三个input, int min_cheermote_amount, String[] valid_cheermotes, String messages。 min_cheermote_amount 就是一个最小值,只要一个messages里面有个string 根valid_cheermotes里面的一个string一样,并且尾端数字大于等于这个min_cheermote_amount 就可以计入输出。输出值就是从大到小排好序的cheermote string[]。没有match的就输出“NO_CHEERS”
下面是例子和testcase

        输入:1, cheer, roo100 big1000
        输出:NO_CHEERS

        1, [cheer], "this is just a normal message and also cheer100 cheer100"
        cheer200

        1, [cheer], "this is just a normal message,look at me"
        NO_CHEERS

        1, [cheer,party,rainbow], "cheer1 cheer2, cheer4, party100 cheer1"
        party100,cheer8

        1, [cheer,party], "cheer1 cheer2, cheer4,party100 cheer1"
        party100,cheer8

        1, [cheer], "cheer10000 cheer10000 cheer10000 cheer10000 cheer10000 cheer10000 cheer10000 cheer10000 cheer10000 cheer10000 cheer1, cheer4"
        cheer4

        1, [cheer], "cheer10000 cheer10000 cheer10000 cheer10000 cheer10000 cheer10000 cheer10000 cheer10000 cheer10000 cheer10000, cheer4"
        cheer100004

        1, [cheer], "cheer1 cheer10001, cheer4"
        cheer4

        1, [cheer], "cheer1 cheer10000, cheer4"
        cheer10005

        3, [cheer], "cheer1 cheer2,cheer4"
        cheer4
        
        1, [party], "cheer1"
        NO_CHEERS
        
        1, [cheer], "cheer1 cheer2,cheer4"
        cheer7

其实我思路是没问题的,但是中间写代码的时候就因为一层层for loop的嵌套导致自己思路不清晰,然后把自己绕进去了。因为你把整个messages通过逗号分成一个String array的时候就应该新建一个hashmap counter,但是你却放进了第二个for loop里面(应该在第二个for loop外面的)这样实际上你break之后还是把一些invalid的情况算进了结果里面,所以有很多testcase过不了。
其实最好的解决办法就是问题的拆分,你一开始实际上就是拆分开来做的,只不过你只是检查了是否valid,实际上返回一个map就可以了,map如果是空就不计入结果里面。这样就不用写三层嵌套了。把第二个和第三个for loop分别拆分成两个函数就可以了。
下面是做完之后自己debug之后的代码:

    public static String[] solution(int min_cheermote_amount, String[] valid_cheermotes, String messages) {
        // Please write your code here.
        Map<String, Integer> totalCount = new HashMap<>();
        String[] split = messages.split(",");
        for (int i = 0; i < split.length; i++) {
            String[] curStrings = split[i].split("\\s+");
            // int[] count = new int[valid_cheermotes.length];
            Map<String, Integer> currentCount = new HashMap<>();
            for (int j = 0; j < curStrings.length; j++) {

                String curStr = curStrings[j];
                // increase the current message cheers count, return empty tree if there is a invalid cheermote amount
                for (int k = 0; k < valid_cheermotes.length; k++) {
                    String cheerStr = valid_cheermotes[k];
                    if (curStr.length() <= cheerStr.length()) {
                        continue;
                    }
                    String str = curStr.substring(0, cheerStr.length());
                    // System.out.println(str);
                    // System.out.println(curStr.substring(cheerStr.length(), curStr.length()));
                    int cheermote = -1;
                    try {
                         cheermote = Integer.parseInt(curStr.substring(cheerStr.length(), curStr.length()));
                    } catch (NumberFormatException e) {

                    }
                    // System.out.println(cheermote);
                    if (str.equals(cheerStr) && cheermote >= min_cheermote_amount && cheermote <= 100000) {
                        currentCount.put(str, currentCount.getOrDefault(str, 0) + cheermote);
                        // check if it is greater than 100,000
                        if (cheermote < min_cheermote_amount || currentCount.get(str) > 100000) {
                            currentCount = null;
                            break;
                        }
                    }
                }
                if (currentCount == null) {
                    break;
                }
            }
            // update total count
            if (currentCount != null) {
                for (Map.Entry<String, Integer> pair: currentCount.entrySet()) {
                    totalCount.put(pair.getKey(), totalCount.getOrDefault(pair.getKey(), 0) + pair.getValue());
                    System.out.println(totalCount.get(pair.getKey()));
                }
            }
        }

        // maxHeap to keep the most number of bits used
        Queue<Map.Entry<String, Integer>> pq = new PriorityQueue<>((a, b) -> b.getValue() - a.getValue());
        pq.addAll(totalCount.entrySet());
        List<String> res = new ArrayList<>();
        while (!pq.isEmpty()) {
            Map.Entry<String, Integer> pair = pq.poll();
            res.add(pair.getKey() + pair.getValue());
        }
        String[] result = new String[res.size()];
        if (res.size() == 0) {
            return new String[] {"NO_CHEERS"};
        } else {
            for (int i = 0; i < res.size(); i++) {
                result[i] = res.get(i);
            }
            return result;
        }
    }

下面是拆分之后的代码,可以明显看到拆分之后的思路更加清晰并且易懂:

public static String[] solution(int min_cheermote_amount, String[] valid_cheermotes, String messages) {
        // Please write your code here.
        Map<String, Integer> totalCount = new HashMap<>();
        String[] split = messages.split(",");
        for (int i = 0; i < split.length; i++) {
            String[] curStrings = split[i].split("\\s+");
            // int[] count = new int[valid_cheermotes.length];
            Map<String, Integer> currentCount = new HashMap<>();
            currentCount = currentMessageCount(min_cheermote_amount, valid_cheermotes, curStrings, new HashMap<String, Integer>());
            // update total count
            if (currentCount != null) {
                for (Map.Entry<String, Integer> pair: currentCount.entrySet()) {
                    totalCount.put(pair.getKey(), totalCount.getOrDefault(pair.getKey(), 0) + pair.getValue());
                    System.out.println(totalCount.get(pair.getKey()));
                }
            }
        }

        // maxHeap to keep the most number of bits used
        Queue<Map.Entry<String, Integer>> pq = new PriorityQueue<>((a, b) -> b.getValue() - a.getValue());
        pq.addAll(totalCount.entrySet());
        List<String> res = new ArrayList<>();
        while (!pq.isEmpty()) {
            Map.Entry<String, Integer> pair = pq.poll();
            res.add(pair.getKey() + pair.getValue());
        }
        String[] result = new String[res.size()];
        if (res.size() == 0) {
            return new String[] {"NO_CHEERS"};
        } else {
            for (int i = 0; i < res.size(); i++) {
                result[i] = res.get(i);
            }
            return result;
        }
    }
    private static Map<String, Integer> currentMessageCount(int min_cheermote_amount, String[] valid_cheermotes, String[] curStrings, Map<String, Integer> currentCount) {
        for (int j = 0; j < curStrings.length; j++) {

            String curStr = curStrings[j];
            // increase the current message cheers count, return empty tree if there is a invalid cheermote amount
            for (int k = 0; k < valid_cheermotes.length; k++) {
                String cheerStr = valid_cheermotes[k];
                if (curStr.length() <= cheerStr.length()) {
                    continue;
                }
                String str = curStr.substring(0, cheerStr.length());
                // System.out.println(str);
                // System.out.println(curStr.substring(cheerStr.length(), curStr.length()));
                int cheermote = -1;
                try {
                    cheermote = Integer.parseInt(curStr.substring(cheerStr.length(), curStr.length()));
                } catch (NumberFormatException e) {

                }
                // System.out.println(cheermote);
                if (str.equals(cheerStr) && cheermote >= min_cheermote_amount && cheermote <= 100000) {
                    currentCount.put(str, currentCount.getOrDefault(str, 0) + cheermote);
                    // check if it is greater than 100,000
                    if (cheermote < min_cheermote_amount || currentCount.get(str) > 100000) {
                        currentCount = null;
                        break;
                    }
                }
            }
            if (currentCount == null) {
                break;
            }
        }
        return currentCount;
    }

相关文章

  • 问题的拆分

    今天早上做Twitch的在线笔试,还是经验不够丰富,这道题其实可以把问题拆分开来。这样就会让思路清晰很多。这道题有...

  • 《从点子到产品经理》摘4(完结)

    学会拆分问题:如何成为优秀的xxx,当你解决不了一个复杂的问题时,就要试着拆分这个问题,不断拆分,直到你觉得每个小...

  • 学着拆分问题

    每天的工作和生活中,我们会遇到各种各样的问题。有些问题是我们轻易就可以解决的,而有些问题会让我们感觉到手足无措。 ...

  • 「拆」的能力取决于什么?

    结构化拆分是指自上而下分析问题时,把问题逐层分解成更细节的部分,每次拆分都遵循“MECE”原则。结构化拆分的最终呈...

  • 快速排序法

    定义 快速排序是一种高效的排序算法,采用《分而治之》的思想,把大的问题拆分成小的问题,小的问题再拆分成更小的问题 ...

  • Storyboard References cannot be

    问题描述 当我拆分storyboard的时候

  • 拆分的代价

    从我们很小的时候,我们接受的教育就是如何拆分问题,如何拆分这个世界。 其实这样可以让我们把复杂的问题...

  • 成为解决问题的高手(2)拆分问题

    列举几个生活中最常见的例子,来聊聊为什么要拆分问题以及如何拆分问题。 常见问题一:怎样才能减肥? 常见问题二:如何...

  • 编剧,是如何制造悬念的

    拆分问题 编剧建立悬念的第一步,对问题进行拆分,用问题统领故事。 首先,每个故事都有一个核心悬念,比如:主人公最终...

  • 拼多多标题

    标题问题 拆分标题 词根(不能拆分 ) 每一个词根都有机会展示 调整没有流量的词根 拆分标题 1复制标题 2加字 ...

网友评论

      本文标题:问题的拆分

      本文链接:https://www.haomeiwen.com/subject/valibktx.html