扑克牌中的顺子

1:题目描述

从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bu-ke-pai-zhong-de-shun-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2:题目分析

先排序,然后遍历统计出大小王的个数,然后在遇到不是顺子的情况时,通过用大小王进行弥补,当无法弥补时,返回false即可。

3:代码示例

package JianZhiOffer61;

import java.net.Socket;

/**
 * @author :dazhu
 * @date :Created in 2020/4/23 9:12
 * @description:扑克牌的顺子
 * @modified By:
 * @version: $
 */
public class Main {
    public static void main(String[] args) {
        Solution solution = new Solution();
        int[] arr = new int[]{0,0,8,4,5};
        System.out.println(solution.isStraight(arr));
    }
}

/**
 * 先使用排序,然后再遍历判断。
 */
class Solution {
    public boolean isStraight(int[] nums) {
        //先排序
        QuickSort(nums);
        int numberOfKing = 0;
        //遍历,进行是不是顺子判断
        for(int i=0;i<nums.length-1;i++){
            //如果是0,先统计大小王的个数,
            if(nums[i]==0){
                numberOfKing++;
            }
            else {
                //如果不是0,
                // 如果相邻的值差值大于1,则先尝试用大小王弥补,
                int gap = nums[i + 1] - nums[i];
                //如果相邻差值为0,意味着重复没不可能为顺子
                if(gap ==0){
                    return false;
                }
                if (gap > 1) {
                    numberOfKing = numberOfKing - gap + 1;
                }
                //一旦numberOfKing小于0,意味着当前出现的,
                // 差值是大小王无法弥补的,所以直接return false。
                if (numberOfKing < 0) {
                    return false;
                }
            }
        }
        //如果一切顺子,则return true;
        return true;
    }
    public void QuickSort(int[]array){
        QSort(array,0,array.length-1);
    }
    //快速排序递归算法
    public void QSort(int[]array,int low,int high){
        int pivot;
        if(low<high){
            //算出枢轴值,pivot将array一分为二
            pivot = Partution(array,low,high);
            //对低子表递归排序
            QSort(array,low,pivot-1);
            //对高子表递归排序
            QSort(array,pivot+1,high);
        }
    }
    //交换数组种子表的记录,是枢轴记录到位,并返回其所在位置
    //此时,在之前所有记录都小于该记录位置,
    public int Partution(int[]array,int low,int high){
        //暂定最低位为枢轴值
        int pivotkey = array[low];
        //当low大于等于high时,停止
        while(low<high){
            //从high到low进行判断,找到小于枢轴值时
            //进行high和low交换
            while(low<high&&array[high]>=pivotkey){
                high--;
            }
            swap(array,low,high);
            //从low到high进行判断,找到大于枢轴值时
            //进行high和low交换
            while(low<high&&array[low]<=pivotkey){
                low++;
            }
            swap(array,low,high);
        }
        //经过前面的交换,返回当前枢轴值所在位置。
        return low;
    }
    //由于排序中,最经常使用就是交换操作,对数组进行交换操作
    public void swap(int[]array,int i,int j){
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}
posted @ 2020-04-23 10:01  大朱123  阅读(887)  评论(0)    收藏  举报