有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表示扔掉该卡片。
性能方面,数组比列表要好很多。
分享到:
相关推荐
这里的压缩包文件聚焦于RSA算法的C++实现以及数字签名的相关程序。RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因其发明者的名字首字母命名。它广泛应用于数字证书、网络通信...
其中,Crpto-1算法是Mifare Classic卡中用于数据加密的一种专有算法,它为卡片的数据安全提供了基础保障。本资源包含的是Crpto-1加密算法的源码,可用于理解算法原理或开发与Mifare Classic兼容的读写设备。 Crpto-...
好久没有上传资料了,这是我前几年开发51单片机时写得多位数除法的一个算法。前两天用了一下。感觉还是那么好用。所以发上来供大家参考。 此算法为汇编,被除数、除数和商的位数都不限,商的小数点后转换为十进制后...
G-P算法计算关联维数 G-P算法是一种常用的计算关联维数的方法,该算法由Grassberger和Procaccia于1983年提出的,主要用于计算时间序列的关联维数。关联维数是一种衡量时间序列复杂度的指标,可以反映时间序列的自...
实验一 处理器调度 一. 实验内容 选择一个调度算法,实现处理器调度。 二. 实验目的 在采用多道程序设计的系统中,...第—题:设计一个按优先数调度算法实现处理器调度的程序。 运行环境:Microsoft Visual Studio 2005
以下是一些关于手写数字识别的基本概念、常用算法以及如何在C语言中实现这些算法的关键知识点: 1. **预处理**: 在识别手写数字之前,通常需要对图像进行预处理。这包括二值化(将图像转换为黑白)、降噪(去除...
算法讲解084【必备】数位dp-上
数位dp与ac自动机算法
3.7 禁位排列 习 题 第四章 鸽巢原理 4.1 鸽巢原理 4. 2 鸽巢原理的推广形式 4. 3 ramsey数 4.4 ramsey数的性质 4.5 ramsey定理 习 题 第五章 母函数 5.1 母函数概念 5.2 幂级数型母函数 5.3 ...
8. 5 数字非相干双△△DLL跟踪算法及VLSI结构 8. 5. 1 非相干双△DLL跟踪算法描述 8. 5. 2 环路参数设计及部分单元部件的VLSI结构 8. 5. 3 数字式非相干双△DLL的VLSI结构 8. 6 窄相关DLL原理及性能 8. 6. 1 窄相关...
常见的磁盘调度算法有先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)和循环扫描算法(CSCAN)等。 先来先服务算法(FCFS) 先来先服务算法(FCFS)是一种最简单的磁盘调度算法。该算法...
K2算法是其中一种用于学习贝叶斯网络结构的算法,尤其适用于小到中等规模的数据集。 K2算法,全称为Cowell-Koller-Komorowski算法,由R. Cowell、M. Koller、A. Komorowski于1994年提出。该算法基于最大后验概率...
标题中的“灰狼优化算法和粒子群优化算法比较”指的是在优化问题中,对两种流行的启发式算法——灰狼优化算法(Grey Wolf Optimizer, GWO)与粒子群优化算法(Particle Swarm Optimization, PSO)的性能进行分析和...
Clock置换算法:为进入内存的页面设置一个访问位,当内存中某页被访问,访问位置一,算法在选择一页淘汰时,只需检查访问位,若为0,则直接换出,若为1,置该访问位为0,检测内存中的下一个页面的访问位。 改进型...
讲述PID PID控制算法控制算法PID控制算法控制算法 PID控制算法控制算法 PID控制算法控制算法 PID控制算法控制算法 PID控制算法控制算法 PID控制算法控制算法 PID控制算法控制算法 PID控制算法控制算法 PID控制算法...
PID控制算法是一种在工业控制领域应用极为广泛的反馈控制算法,它的名字由比例(Proportional)、积分(Integral)、微分(Derivative)三个部分的英文首字母缩写而成。PID算法通过这三个控制环节对被控对象进行调节...
c#语言实现的原始MD5加密算法,支持16位加密和32位加密.
基于遗传算法和模拟退火算法改进的混合模拟退火算法(解决求函数极值问题,MATLAB代码已实现)混合模拟退火算法时遗传算法和模拟退火算法的结合,在混合模拟退火算法中使用了大量的样本作为问题的可能解决方案而不是...
Mersenne Twister算法译为马特赛特旋转演算法,是伪随机数发生器之一,其主要作用是生成伪随机数。此算法是Makoto Matsumoto (松本)和Takuji Nishimura (西村)于1997年开发的,基于有限二进制字段上的矩阵线性再生。...
算法是计算机科学中解决问题的基本工具和方法。通过解决算法谜题,我们可以提高对算法的理解和应用能力,从而提升算法思维。算法谜题是结合了传统谜题和计算机算法知识的一种智力游戏,旨在通过谜题的求解过程训练和...