簡體   English   中英

我的 HackerRank 解決方案正面臨超時

[英]I am facing timeout for my solution for a HackerRank

我正在解決關於 hackerrank Hacker Rank ICPC Team Problem的問題

我創建了以下代碼作為問題的解決方案。

import java.math.BigInteger;
import java.util.Scanner;

public class ACMICPCTeam {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt(),count=0,maxCount=0,teams=0;
        sc.nextLine();
        String subjectArray[]=new String[n];
        for(int i=0;i<n;i++){
            subjectArray[i]=sc.nextLine();
        }
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                String temp=""+(new BigInteger(subjectArray[i]).add(new BigInteger(subjectArray[j])));
                //System.out.println(temp);
                count=temp.replace("0","").length();
                if(count>maxCount)
                {
                    maxCount=count;
                    teams=1;
                }
                else if(count==maxCount)
                {
                    teams++;
                }
            }
        }
        System.out.println(maxCount);
        System.out.println(teams);
        sc.close();
    }

}

所以我想做的是添加兩個團隊的主題,並計算結果字符串的非零值。 最高計數是受試者的數量,最高計數的出現是知道最大受試者數量的團隊。 即使花了很多時間我也無法找到比這個更好的解決方案,但我仍然面臨超時,因為它效率不高。

我已經瀏覽了這個問題的論壇,但沒有幫助。

不要為此使用字符串邏輯。

將字符串解析為BitSet ,然后再進入您的循環,即在您閱讀它們時。

然后使用方法or(BitSet set)cardinality()

我剛剛完成挑戰。 沒有超時。

您的解決方案不是最佳的,您應該嘗試更好的方法。

您可以使用 BigInteger 方法或 BitSet 類來簡化操作。

要組建團隊,您必須使用按位或

以下是解決方案——

   // 1st approach
    static int[] acmTeam(String[] topic) {

        int n = topic.length;
        BigInteger[] bi = new BigInteger[n];

        for (int i = 0; i < n; i++)
            bi[i] = new BigInteger(topic[i], 2);

        int maxTopic = 0;
        int teamCount = 0;

        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                BigInteger iuj = bi[i].or(bi[j]);
                int bitCount = iuj.bitCount();
                if (bitCount > maxTopic) {
                    maxTopic = bitCount;
                    teamCount = 1;
                } else if (bitCount == maxTopic) {
                    teamCount++;
                }
            }
        }

        int result[] = { maxTopic, teamCount };
        return result;
    }



// 2nd approach--using java BitSet class
    static int[] acmTeamUsingBitSet(String[] topic) {
        int teamCount = 0, maxTopic = 0;
        int size = topic.length;

        BitSet[] bitset = new BitSet[size];
        for (int i = 0; i < size; i++) {
            BigInteger b1 = new BigInteger(topic[i], 2);
            bitset[i] = BitSet.valueOf(b1.toByteArray());
        }
        for (int i = 0; i < size - 1; i++) {
            BitSet bitset1 = bitset[i];
            for (int j = i + 1; j < size; j++) {
                BitSet bitset2 = bitset[j];
                BitSet tmpset = new BitSet();
                tmpset.or(bitset1);
                tmpset.or(bitset2);
                if (tmpset.cardinality() > maxTopic) {
                    maxTopic = tmpset.cardinality();
                    teamCount = 1;
                } else if (maxTopic == tmpset.cardinality()) {
                    teamCount++;
                }
            }

        }
        int result[] = { maxTopic, teamCount };
        return result;

    }

您可以參考此鏈接以獲得詳細的視頻說明

我使用 Java 8 得到了很好的結果。

static int[] acmTeam(String[] topic) {

    List<List<Integer>> res = IntStream.range(0, topic.length)
            .mapToObj(s -> IntStream.range(0, topic[s].length()).boxed()
            .collect(Collectors.groupingBy(i -> topic[s].charAt(i))))
            .map(m -> m.get('1'))
            .collect(toList());
    
    long maxTopic = 0;
    int teamCount = 0;
    
    for (int i = 0; i < res.size(); i++) {
        for (int j = i + 1; j < res.size(); j++) {
            long topics = Stream.concat(res.get(i).stream(), res.get(j).stream()).distinct().count();
            if (topics >  maxTopic) {
                maxTopic = topics;
                teamCount = 1;
            } else if (topics == maxTopic) {
                teamCount++;
            }
        }
    }

    return new int[]{(int) maxTopic, teamCount};
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM