有N张卡片,标号为从1到N。第一轮抽取到奇数位时,将卡片扔掉,偶数位保留;第二轮扔掉剩下来的奇数位。以此类推,最后剩下的卡片标号为?
1. 列表实现
private static int retrieveLastViaList(int n) {
LinkedList<Integer> list = new LinkedList<Integer>(); // 构建列表
for (int i = 1; i <= n; i++) { // 第一轮
if (i % 2 == 0) {
list.add(i); // 存放卡片
}
}
boolean bOdd = true; // 奇数位标志
Iterator<Integer> iter = list.iterator();
while (true) {
if (!iter.hasNext()) { // 到卡片尾部了,开始下一轮
iter = list.iterator();
bOdd = true; // 重置奇数位标志
}
Integer cur = iter.next();
if (list.size() == 1) { // 卡片只有一张了,是我们需要的
return cur;
}
if (bOdd) { // 奇数位
iter.remove(); // 扔掉卡片
bOdd = false; // 切换偶数位
} else { // 偶数位
bOdd = true; // 切换奇数位
}
}
}
2. 数组实现
private static int retrieveLastViaArray(int n) {
int[] arr = new int[n]; // 构建数组
for (int i = 1; i <= n; ++i) {
arr[i - 1] = i; // 存放卡片
}
int cur = 1; // 当前卡片
int rem = n; // 剩余卡片数
boolean bOdd = true; // 奇数位标志
while (true) {
if (rem == 1) { // 只剩一张卡片
while (arr[cur - 1] == 0) { // 该卡片已丢弃,定位下一张可用的卡片
cur++;
if (cur > n) { // 超过卡片尾部
cur = 1;
}
}
return cur; // 返回该卡片标号
}
while (arr[cur - 1] == 0) { // 该卡片已丢弃,定位下一张可用的卡片
cur++;
if (cur > n) { // 超过卡片尾部,开始下一轮
bOdd = true; // 重置奇数位标志
cur = 1;
}
}
if (bOdd) { // 奇数位
arr[cur - 1] = 0; // 置0,表示丢弃
rem--; // 剩余卡片减一
bOdd = false; // 切换到偶数位
} else { // 偶数位
bOdd = true; // 切换到奇数位
}
cur++;
if (cur > n) { // 超过卡片尾部,开始下一轮
bOdd = true; // 重置奇数位标志
cur = 1;
}
}
}
逻辑方面,数组比列表复杂,因为数组创建后,长度无法改变,通过置0表示扔掉该卡片。
性能方面,数组比列表要好很多。
分享到:
相关推荐
1)利用C\C++语言实现DSA算法。 2)DSA中的Hash函数采用SHA算法。 (1)消息填充:因为我们存储的时候是以字节为单位存储的,所以消息的长度(单位:位)一定是 8 的倍数。而我们填充的时候也一定是 8 位、8 位...
这里的压缩包文件聚焦于RSA算法的C++实现以及数字签名的相关程序。RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因其发明者的名字首字母命名。它广泛应用于数字证书、网络通信...
其中,Crpto-1算法是Mifare Classic卡中用于数据加密的一种专有算法,它为卡片的数据安全提供了基础保障。本资源包含的是Crpto-1加密算法的源码,可用于理解算法原理或开发与Mifare Classic兼容的读写设备。 Crpto-...
本文档“条件中位数及其改进算法的Matlab实现”提供了如何利用Matlab编程语言来实现这一方法。 首先,条件中位数的基本概念是,在给定一组数据且不考虑任何失效时间的情况下,找到一个点,使得在这个点之前的数据占...
g_p算法,关于求解嵌入关联维数的matlab的算法
好久没有上传资料了,这是我前几年开发51单片机时写得多位数除法的一个算法。前两天用了一下。感觉还是那么好用。所以发上来供大家参考。 此算法为汇编,被除数、除数和商的位数都不限,商的小数点后转换为十进制后...
实验一 处理器调度 一. 实验内容 选择一个调度算法,实现处理器调度。 二. 实验目的 在采用多道程序设计的系统中,...第—题:设计一个按优先数调度算法实现处理器调度的程序。 运行环境:Microsoft Visual Studio 2005
滤波算法集合(中位数、中位数平均、平均、加权平均、一阶加权、正太分布)
在计算机科学领域,算法是解决问题的关键工具,而中位数作为一种重要的统计概念,常常被用于数据分析和算法设计中。本文将深入探讨如何在给定两个升序序列的情况下找到它们的中位数。升序序列意味着元素按从小到大的...
以下是一些关于手写数字识别的基本概念、常用算法以及如何在C语言中实现这些算法的关键知识点: 1. **预处理**: 在识别手写数字之前,通常需要对图像进行预处理。这包括二值化(将图像转换为黑白)、降噪(去除...
3.7 禁位排列 习 题 第四章 鸽巢原理 4.1 鸽巢原理 4. 2 鸽巢原理的推广形式 4. 3 ramsey数 4.4 ramsey数的性质 4.5 ramsey定理 习 题 第五章 母函数 5.1 母函数概念 5.2 幂级数型母函数 5.3 ...
模型算法大全(20+种常用算法模型+代码实现)模型算法大全(20+种常用算法模型+代码实现)模型算法大全(20+种常用算法模型+代码实现)模型算法大全(20+种常用算法模型+代码实现)模型算法大全(20+种常用算法模型+...
算法合集之《浅谈数位类统计问题》.pdf
Java算法全卷涵盖了基本算法和图算法,是学习和提升编程技能的重要资源。这份资料主要针对使用Java语言进行算法实现的开发者,适用于那些对ANT、EJB、J2EE、JAVA和SPRING等技术栈有了解或兴趣的人群。下面我们将深入...
常见的磁盘调度算法有先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)和循环扫描算法(CSCAN)等。 先来先服务算法(FCFS) 先来先服务算法(FCFS)是一种最简单的磁盘调度算法。该算法...
《算法》第四版是图灵丛书中的经典之作,专注于阐述算法和数据结构的核心概念,是计算机科学和技术领域不可或缺的学习资源。这本书以清晰易懂的方式,深入浅出地讲解了编程中涉及的各种算法和数据结构,适合初学者和...
K2算法是其中一种用于学习贝叶斯网络结构的算法,尤其适用于小到中等规模的数据集。 K2算法,全称为Cowell-Koller-Komorowski算法,由R. Cowell、M. Koller、A. Komorowski于1994年提出。该算法基于最大后验概率...
粒子群算法(Particle Swarm Optimization, PSO)与遗传算法(Genetic Algorithm, GA)是两种在优化问题中广泛应用的全局搜索方法。它们都是基于自然选择和群体智能的启发式算法,能够有效地解决复杂多模态优化问题...
标题中的"C语言数位排序共4页.pdf.zip"表明这是一个关于C语言编程的文档,主要讲解的是数位排序算法,并且文档共有四页。数位排序是一种在整数数组中进行排序的算法,它根据数字的每一位来进行排序,通常适用于大...
对二进制的数字数据,在需要按位取反时,可以直接使用该函数。是效率最优算法。