基础编程题之洗牌

Posted 快乐江湖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础编程题之洗牌相关的知识,希望对你有一定的参考价值。

题目

牛客
在这里插入图片描述

解题思路

题目看似复杂,但是十分简单。关键就在于搞清左手牌和右手牌如何摆放的问题
根据题目的意思,使用数组保存牌,第一次洗牌完成后结果如下
在这里插入图片描述
可以对比洗牌前后,左手牌和右手牌的位置关系为

原数组中位置为i的左手牌放到了新位置为2*i处,比如说原数组中左手牌3,其下标为2,放到了2*2的位置,即4

原数组中位置为i+n的右手牌放到了新位置12*i+1处,比如说原数组中的右手牌5,其下标为4,也就是1+3,放到了2*1+1,即下标为3的位置

根据以上叙述,即可写出代码,需要注意的是输入和输出的格式

代码

#include <iostream>
#include <vector>
using namespace std;

void shuffle(vector<int>& card,int n,int k)
{
    while(k--)
    {
        vector<int> temp(card.begin(),card.end());
        for(int i=0;i<n;i++)
        {
            card[2*i]=temp[i];//左牌
            card[2*i+1]=temp[i+n];//右牌
        }
    }
}

int main()
{
    int group;//有几组数据
    cin>>group;
    while(group--)
    {
        int n;//2*n张牌
        int k;//洗牌多少次
        cin>>n>>k;
        vector<int> card;
        card.resize(2*n,0);
        for(int i=0;i<2*n;i++)//赋值
        {
            cin>>card[i];
        }
        shuffle(card,n,k);
        for(int i=0;i<2*n;i++)
        {
            if(i==2*n-1)
            {
                cout<<card[i]<<endl;
            }
            else
            {
                cout<<card[i]<<" ";
            }
        }
    }

}

在这里插入图片描述

以上是关于基础编程题之洗牌的主要内容,如果未能解决你的问题,请参考以下文章

基础编程题之因数分解

基础编程题之牛客网星际密码

前端面试题之手写promise

基础编程题之不用加减乘除做加法

基础编程题之奇数位(偶数位)都是奇数(偶数)

基础编程题之最近公共祖先