我面临着HackerRank解决方案的暂停

时间:2017-07-31 19:07:54

标签: java algorithm

我正在解决hackerrank的问题 [setValue:forKey:]

我已经创建了以下代码作为问题的解决方案。

<UserControl xmlns:models="clr-namespace:MyApp.Models" >
   <DataGrid IsReadOnly="{Binding Path=(models:Global.IsReadOnly)}"  />
</UserControl>

所以我要做的是我正在添加两个团队科目,我正在计算结果字符串的非零。最高计数是受试者数量,最高计数的出现是知道最大受试者数量的团队。即使花了很多时间,我也无法找到比这个更好的解决方案,但我仍面临时间,因为效率不高。

我已经浏览了问题的论坛,但没有任何帮助。

3 个答案:

答案 0 :(得分:1)

不要使用字符串逻辑。

在进入循环之前将字符串解析为BitSet,即在阅读时。

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

我刚刚完成挑战。没有超时。

答案 1 :(得分:0)

您的解决方案不是最佳的,您应该尝试一些更好的方法。

您可以利用BigInteger方法或BitSet类简化操作。

要组建团队,您必须使用按位OR

这是解决方案-

   // 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;

    }

您可以参考此link以获得详细的video explanation

答案 2 :(得分:0)

使用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};
}