博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
九度 1479:移位和旋转
阅读量:5346 次
发布时间:2019-06-15

本文共 1200 字,大约阅读时间需要 4 分钟。

        对于一副扑克牌,我们有多种不同的洗牌方式。一种方法是从中间某个位置分成两半,然后相交换,我们称之为移位(shift)。比如原来的次序是123456,从第4个位置交换,结果就是561234。这个方式其实就是数组的循环移位,为了多次进行这个操作,必须使用一种尽可能快的方法来编程实现。在本题目中,还引入另外一种洗牌方式,就是把前一半(如果总数是奇数,就是(n-1)/2)牌翻转过来,这种操作称之为翻转(flip)。在前面shift操作的结果上进行flip,结果就是165234。当然,如果是实际的扑克牌,直接翻转会造成正反面混在一起的,我们就不管那么多了。

        给定n张牌,初始次序为从1到n,经过若干次的shift和flip操作后,结果会是什么样?

 

思路

剑指 offer 例题, 三次 reverse. Leetcode 3.5 出了个新题, 和这道类似

 

代码

#include 
#include
using namespace std;int card[2000];int ops[2000];int n, k;void myReverse(int st, int ed) { while(st < ed) { swap(card[st], card[ed]); st ++; ed --; }}void shift(int x) { myReverse(1, x); myReverse(x+1, n); myReverse(1, n);}void flip() { myReverse(1, n/2);}int main() { while(scanf("%d%d", &n, &k) != EOF && n != 0) { for(int i = 1; i <= n; i ++) card[i] = i; for(int i = 0; i < k; i ++) scanf("%d", ops+i); for(int i = 0; i < k; i ++) { int x = ops[i]; shift(x); flip(); } for(int i = 1; i <= n; i ++) printf("%d ", card[i]); printf("\n"); } return 0;}

 

转载于:https://www.cnblogs.com/xinsheng/p/3587008.html

你可能感兴趣的文章
php中eval函数的危害与正确禁用方法
查看>>
20172315 2017-2018-2 《程序设计与数据结构》第十一周学习总结
查看>>
MySQL添加、修改、撤销用户数据库操作权限的一些记录
查看>>
关于谷歌浏览器Chrome正在处理请求的问题解决
查看>>
Git核心技术:在Ubuntu下部署Gitolite服务端
查看>>
平面波展开法总结
查看>>
建造者模式
查看>>
ArraySort--冒泡排序、选择排序、插入排序工具类demo
查看>>
composer 安装laravel
查看>>
8-EasyNetQ之Send & Receive
查看>>
Android反编译教程
查看>>
List<string> 去重复 并且出现次数最多的排前面
查看>>
js日志管理-log4javascript学习小结
查看>>
Android之布局androidmanifest.xml 资源清单 概述
查看>>
How to Find Research Problems
查看>>
Linux用户管理
查看>>
数据库第1,2,3范式学习
查看>>
《Linux内核设计与实现》第四章学习笔记
查看>>
使用iperf测试网络性能
查看>>
图片的显示隐藏(两张图片,默认的时候显示第一张,点击的时候显示另一张)...
查看>>