在5张牌游戏中找到四种

时间:2016-10-08 17:33:46

标签: java string poker

我试图在5个扑克手中找到四种。我不知道我哪里出错,但JUnit报告错了。

public boolean hasFourOfaKind(String hand) {
    int counter = 0;
    char x = 0;

    for (int i = 0; i < hand.length(); i++) {
        for (int j = 0; j < hand.length(); j++) {
            if (i == 0) {
                x = hand.charAt(0);
                counter++;
            } else if (x == hand.charAt(i)) {
                counter++;

            }
        }
    }
    if (counter >= 4) {
        return true;
    } else {
        return false;
    }
}

3 个答案:

答案 0 :(得分:0)

这是一个真正的快速,因为你想测试你的手假设它的字符串和下面的代码在javascript中重写,因为我也看到问题的JS标签......

function hasFourOfaKind(hand) {
    var counter = 0;
    var set_of_four = [];

    for (i = 0; i < hand.length; i++) {
        if (i == 0) {
            x = hand.charAt(0);
            set_of_four.push(x);
            counter++;
        } else {
            x = hand.charAt(i);
            if(set_of_four.indexOf(x) != '-1'){
                counter++;
            } else {
                set_of_four = set_of_four.splice(-1,1);
                set_of_four.push(x);
                counter = 0;
            }
        }
    }
    return (counter >= 3);
}

var poker_hand = 'BAAAAA';
var result = hasFourOfaKind(poker_hand);
console.log(result);

@Dmitry:谢谢你早些时候的纠正......那时我太急了......

答案 1 :(得分:0)

我认为您的hand表示为&#34; ABCDE&#34;。你的代码错了。让我们来看看内循环体:

for (int i = 0; i < hand.length(); i++) {
    for (int j = 0; j < hand.length(); j++) {
        if (i == 0) {  // take a look at this line
            x = hand.charAt(0);
            counter++;
        } else if (x == hand.charAt(i)) {
            counter++;

        }
    }
}

我评论了你应该看的那条线。 i在第一次外循环迭代时始终为0,因此您将增加计数器hand.length()次(内部循环将执行多少次i == 0 )。如果您的手牌长度为4或更长,则您的方法将始终返回true。此外,即使您要修复此部分,它也不会有帮助,因为您总是将字符与字符串的第一个字符进行比较。

作为建议,您可以从字符串中获取一个char数组,对其进行排序,然后逐个查看相同数量的字符:

private boolean hasFourOfaKind(String hand) {
    if (hand == null || hand.length() == 0) {
        return false;
    }
    char[] chars = hand.toCharArray();
    Arrays.sort(chars);
    char current = chars[0];
    int count = 1;
    for (int i = 1; i < chars.length; i++) {
        char next = chars[i];
        if (current != next) {
            current = next;
            count = 1;
        } else {
            count++;
            if (count == 4) {
                return true;
            }
        }
    }
    return false;
}

答案 2 :(得分:0)

您的循环逻辑错误。它再次为同一张卡递增计数器。这就是它失败的原因。在下面提到的代码中,我只考虑卡一次。

public static boolean hasFourOfaKind(String hand) {
    int counter = 0;
    for (int i = 0; i < hand.length(); i++) {
        counter = 0;
        for (int j = 0; j < hand.length(); j++) {
            if (hand.charAt(j) == hand.charAt(i)) {
                counter++;
            }
        }
        if (counter >= 4) {
            return true;
        }
    }
    return false;
}