You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++实现扑克牌红黑交替排列算法:寻求更简化解决方案

C++实现红黑交替排列扑克牌的简化方案

针对未排序的牌组,不需要先分离红黑牌再合并,直接通过一次遍历+双指针就能完成交替排列,逻辑更简洁,空间开销也更小。

核心思路

一副标准扑克牌红黑各26张,数量相等。我们可以直接在结果数组中给红黑牌分配固定的位置:

  • 红牌放在偶数索引(0、2、4...),黑牌放在奇数索引(1、3、5...)(反之亦然,取决于你想要的起始颜色)
  • 遍历原未排序牌组,用两个指针分别跟踪红黑牌的下一个目标位置,通过if判断牌的颜色,直接放入结果数组对应位置,之后指针步进2。

代码实现

#include <vector>
#include <iostream>

// 定义花色枚举
enum class Suit { Heart, Diamond, Club, Spade };
// 扑克牌结构体
struct Card {
    Suit suit;
    int rank; // 牌面大小,1-Ace,11-Jack,12-Queen,13-King
};

// 判断是否为红牌(红桃、方块为红)
bool isRed(const Card& card) {
    return card.suit == Suit::Heart || card.suit == Suit::Diamond;
}

// 红黑交替排列函数:红牌起始,偶数位放红,奇数位放黑
void alternateRedBlack(std::vector<Card>& result, const std::vector<Card>& original) {
    result.resize(original.size());
    int redPos = 0;   // 红牌的下一个目标位置
    int blackPos = 1; // 黑牌的下一个目标位置

    for (const auto& card : original) {
        if (isRed(card)) {
            result[redPos] = card;
            redPos += 2;
        } else {
            result[blackPos] = card;
            blackPos += 2;
        }
    }
}

// 测试示例
int main() {
    // 构造一副乱序的测试牌组
    std::vector<Card> originalDeck = {
        {Suit::Club, 5}, {Suit::Heart, 10}, {Suit::Spade, 3},
        {Suit::Diamond, 7}, {Suit::Heart, 1}, {Suit::Spade, 12},
        {Suit::Diamond, 9}, {Suit::Club, 13}
    };

    std::vector<Card> sortedDeck;
    alternateRedBlack(sortedDeck, originalDeck);

    // 输出验证结果
    std::cout << "交替排列后的牌组(红/黑标记):\n";
    for (const auto& card : sortedDeck) {
        std::cout << (isRed(card) ? "[红]" : "[黑]") << " ";
    }
    std::cout << "\n";

    return 0;
}

关键细节

  1. 起始颜色调整:如果想要黑牌开头,只需交换redPos和blackPos的初始值(redPos=1,blackPos=0)。
  2. 未排序牌组适配:不管原牌组顺序如何,只关注每张牌的颜色,直接分配到对应位置,无需提前排序或分类存储。
  3. 空间效率:仅需一个结果数组(大小与原牌组一致),不需要额外存储红黑两个子数组,比原方案节省一半的临时空间。
  4. 时间效率:一次遍历完成操作,时间复杂度为O(n),和原方案相同,但逻辑步骤更少。

内容的提问来源于stack exchange,提问作者angelxdeer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:50:10