笔试题:扑克牌顺子

题目描述

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。

class Solution {
public:
    bool IsContinuous( vector<int> numbers ) {
        int count = 0;
        int n = numbers.size();
        if(n==0)return false;
        for(int i=0;i<n;i++)
        {
            if(numbers[i]==0)count++;
        }
        for(int i=0;i<n-1;i++)
        {
            for(int j=i+1;j<n;j++)
            {
                if(numbers[i]>numbers[j])
                {
                    int temp = numbers[i];
                    numbers[i]=numbers[j];
                    numbers[j]=temp;
                }
            }
        }
        int flags = 0;
        int i=0;
        for(;i<n;i++)
        {
            if(numbers[i]!=0)break;
        }

        for(i=i+1;i<n;i++)
        {
            flags+=((numbers[i]-numbers[i-1])-1);
            if(numbers[i]==numbers[i-1])return false;
        }
        if(flags<=count)return true;
        else return false;
    }
};
### 华为笔试题 E卷:斗地主之顺子 #### 目描述 在斗地主扑克牌游戏中,扑克牌由小到大的顺序为:3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A, 2。玩家可以出的扑克牌阵型有:单张、对子、顺子、飞机、炸弹等。其中顺子的定义是由至少五张连续递增的扑克牌组成,且不能包含2[^3]。 给定一个包含13张牌的数组,判断是否存在满足规则的顺子。如果存在多个顺子,则需按照顺子的第一张牌从小到大的顺序依次输出每一个顺子。如果没有满足条件的顺子,则输出`No`。 --- #### 解决方案分析 为了实现上述功能,可以通过以下方法解决问: 1. **数据预处理** 将输入的扑克牌映射成数值表示形式,便于后续计算。例如,“3”对应于整数3,“A”对应于14,“2”单独作为特殊值排除在外。 2. **统计频率并验证合法性** 使用哈希表记录每种牌的数量,并确认是否有重复的牌(因为一副标准扑克中不存在两张完全相同的牌)。若有重复则直接返回`No`。 3. **寻找可能的顺子组合** 对于长度大于等于5的情况,尝试从最小的有效起始点开始构建顺子序列。具体来说,对于任意一张有效起点牌X,检查[X,X+1,...,X+4]是否都存在于手牌集合中。如果是,则构成一个新的合法顺子。 4. **结果整理与输出** 收集所有找到的顺子并将它们按首字母升序排列打印出来;若没有任何符合条件的结果,则简单输出字符串"No"结束程序运行过程。 以下是基于以上逻辑编写的Python解决方案代码示例: ```python def find_straight_hands(cards): card_map = {'3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, '10': 10, 'J': 11, 'Q': 12, 'K': 13, 'A': 14} counts = {} min_val = float('inf') max_val = float('-inf') # Convert cards to numbers and count them. for c in cards: if c == '2': continue # Ignore '2' as per rules. val = card_map[c] if val not in counts: counts[val] = 0 counts[val] += 1 if counts[val] > 1: # Duplicate found. return ["No"] min_val = min(min_val, val) max_val = max(max_val, val) straights = [] while True: start_found = False current_start = None for i in range(min_val, max_val - 3): # Look for possible starts of straight sequences. if i in counts.keys(): potential_sequence = list(range(i, i + 5)) valid_seq = all(x in counts for x in potential_sequence) if valid_seq: start_found = True current_start = i break if not start_found or (current_start is None): break new_straight = [] for j in range(current_start, current_start + 5): del counts[j] key_for_card_name = next(key for key,value in card_map.items() if value==j) new_straight.append(str(key_for_card_name)) straights.append(new_straight[:]) result_strings = [' '.join(s) for s in sorted(straights)] if len(result_strings)==0: return ["No"] else: return result_strings if __name__ == "__main__": test_case_1 = ["3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"] results = find_straight_hands(test_case_1) print("\n".join(results)) if isinstance(results,list) else print(results) ``` --- #### 输出样例解释 假设测试用例如下所示: ```plaintext ["3","4","5","6","7","8","9","10","J","Q","K","A","2"] ``` 执行后的预期输出可能是这样的几个顺子之一或者全部(取决于实际算法设计): ```plaintext 3 4 5 6 7 4 5 6 7 8 ... ``` 如果没有发现任何有效的顺子结构,则仅显示“No”。 --- #### 注意事项 - 输入应严格遵循目规定的格式。 - 考虑边界情况比如全是相同数字或含有非法字符等问时的行为表现也非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值