《剑指offer》——扑克牌顺子

来源:互联网 发布:安全炒股软件 编辑:程序博客网 时间:2024/06/14 08:59

T:

题目描述
LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…..LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。 现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何。为了方便起见,你可以认为大小王是0。

思路不难,就是给定5个元素,判断是不是顺子。

  • 首先对元素排序,如果有相同元素出现,肯定不是对子;
  • 在一个顺子中,最大元素和最小元素的差值一定是4,比如:4,5,6,7,8。现在由于大小王的存在,差值要小于等于4.
  • 换一种方式,后一个元素减前一个元素再减一,其差值为0,依次减下去,并将差值相加,应该还是零。如果不是零,那这里就存在跳跃,中间漏掉的元素,就用0补上。

eg: 0,4,5,7,8 差值之和肯定为1,代表中间漏掉了1个元素,若差值之和为k,那么代表漏掉了k个元素。如果k的值大于前面0的值,那就没法补了,即不是顺子。

code:

    /**     * T: 扑克牌顺子     *      * 题目描述     * LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...     * 他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!     * “红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,     * 他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。     * 上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。      * 现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何。为了方便起见,你可以认为大小王是0。     *      * date: 2015.11.24  19:03     * @author SSS     *     */    public class Solution {        /**         * 先排序,在看非零元素之间的差值之和,是否能构成顺子         * @param numbers         * @return         */        public boolean isContinuous(int [] numbers) {            boolean flag = false;            if (numbers == null || numbers.length != 5) {                return false;            }            int []temp = new int[numbers.length];            for (int i = 0; i < numbers.length; i++) {                temp[i] = numbers[i];             }            // 先对数组排序            for (int i = 0; i < temp.length; i++) {                int min = temp[i];                int index = i;                for (int j = i + 1; j < temp.length; j++) {                    if (temp[j] < min) {                        min = temp[j];                        index = j;                    }                }                temp[index] = temp[i];                temp[i] = min;             }            int zeroIndex = 0;            // 找出有多少个0,即有多少个大/小王            for (zeroIndex = 0; zeroIndex < temp.length && temp[zeroIndex] == 0; zeroIndex++);            int count = 0;            // 从非零处往后遍历,后者减前者,统计这个差的和是多少            for (int i = zeroIndex; i < temp.length - 1; i++) {                if (temp[i] == temp[i + 1]) {   //如果有相同的元素存在,也不是顺子                    return flag;                }                count += temp[i + 1] - temp[i] - 1;            }            if (count <= zeroIndex) {                flag = true;            }            return flag;        }    }
0 0
原创粉丝点击