JZ45 扑克牌顺子

原题链接


描述

现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。
有如下规则:

现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。
有如下规则:

  1. A为1,J为11,Q为12,K为13,A不能视为14
  2. 大、小王为 0,0可以看作任意牌
  3. 如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。

示例

输入:[6,0,2,0,4]
返回值:true

思路一

快排,统计出 0 的个数。然后从数组中 0 以后的元素检测最大点数差是不是大于等于5,如果是,那就不可能组成顺子,ret false;如果不是,检测是不是有相同的值,如果是,ret false;都不是的话,ret true。


解答

public class Solution {
    public void qSort(int[] arr, int low, int high) {
        if (low > high) return;
        int i = low, j = high, tmp = arr[low];
        while (i < j) {
            while (i < j && arr[j] >= tmp) j--;
            while (i < j && arr[i] <= tmp) i++;

            if (i < j) {
                int a = arr[i];
                arr[i] = arr[j];
                arr[j] = a;
            }
        }
        arr[low] = arr[i];
        arr[i] = tmp;

        qSort(arr, low, i - 1);
        qSort(arr, i + 1, high);
    }

    public boolean IsContinuous(int[] numbers) {
        qSort(numbers, 0, numbers.length - 1);
                int len = numbers.length;

        int sum = 0;//统计0的个数
        // 有n个零,牌的点数的最大差就是n
        for (int a : numbers) {
            if (a != 0) break;
            else ++sum;
        }
        if (numbers[len - 1] - numbers[sum] >= 5) return false;
        for (int i = sum; i < len - 1; i++) {
            if (numbers[i] == numbers[i + 1]) return false;
        }
        return true;
    }
}

精简

// 同样的思路,大佬的代码很简洁
import java.util.Arrays;

public class Solution {

    public boolean IsContinuous(int[] numbers) {
        Arrays.sort(numbers);

        int cnt = 0;//统计0的个数
        for (int i = 0; i < 4; i++) {
            if (numbers[i] == 0) cnt++;
            else if (numbers[i] == numbers[i + 1]) return false;
        }

        return numbers[4] - numbers[cnt] <5;
    }

}

思路二

主要就是判重以及确定最大值最小值差是不是小于5。判重可以通过 HashSet 来实现,在判重的过程中如果重复ret false,并且随时更新最大值、最小值,最后判断 max 和 min 的差。时间复杂度是 O(n),低于思路一O(nlogn),不过数组长度规定是5,所以区别不大。

JZ45 扑克牌顺子

上一篇:UI自动化框架遇到的一些question(持续更新)


下一篇:redis内置的地理信息运算