【编程题目】n 个数字(0,1,…,n-1)形成一个圆圈,从数字 0 开始
第 18 题(数组):
题目:n 个数字(0,1,…,n-1)形成一个圆圈,从数字 0 开始,
每次从这个圆圈中删除第 m 个数字(第一个为当前数字本身,第二个为当前数字的下一个
数字)。当一个数字删除后,从被删除数字的下一个继续删除第 m 个数字。
求出在这个圆圈中剩下的最后一个数字。
思路:看到这道题,直觉是不难,模拟一下过程就好了。我用的是数组来表示的,用first表示当前第一个数字是哪一个数,若删除一个数字则将后面的数字平移到前面。
/*
第 18 题(数组):
题目:n 个数字(0,1,…,n-1)形成一个圆圈,从数字 0 开始,
每次从这个圆圈中删除第 m 个数字(第一个为当前数字本身,第二个为当前数字的下一个
数字)。当一个数字删除后,从被删除数字的下一个继续删除第 m 个数字。
求出在这个圆圈中剩下的最后一个数字。
start time = 10:38
end time = 11:30
*/ #include <stdio.h>
#include <stdlib.h>
#include <string.h> int findlast(int * n, int len, int m, int first) // n是输入数字的数组 len是输入数字的长度 m是要删除第几个数字 first是第一个数字是第几个数字
{
if(len == )
{
return n[];
}
else
{
int d = (m % len) + first - ;
for(int i = d - ; i < len - ; i++)
{
n[i] = n[i + ];
}
return findlast(n, len - , m, d %(len - ));
}
} int findlastn(int n, int m)
{
int * num = (int *)malloc(sizeof(int) * n);
for(int i = ; i < n; i++)
{
num[i] = i;
}
return findlast(num, n, m, );
} int main()
{ int ans = findlastn(, ); return ;
}
上网找答案,发现这是一个很经典的问题 约瑟夫环。有模拟O(MN)、数学O(N)两种常见方法。
网上的模拟都是用的循环链表:
来源http://www.cnblogs.com/dartagnan/archive/2011/09/16/2179143.html
int LastRemaining_Solution1(unsigned int n, unsigned int m)
{
// invalid input
if(n < || m < )
return -; unsigned int i = ; // initiate a list with n integers (0, 1, ... n - 1)
list<int> integers; for(i = ; i < n; ++ i)
integers.push_back(i); list<int>::iterator curinteger = integers.begin(); while(integers.size() > )
{
// find the mth integer. Note that std::list is not a circle
// so we should handle it manually for(int i = ; i < m; ++ i)
{
curinteger ++; if(curinteger == integers.end())
curinteger = integers.begin();
} // remove the mth integer. Note that std::list is not a circle
// so we should handle it manually list<int>::iterator nextinteger = ++ curinteger; if(nextinteger == integers.end())
nextinteger = integers.begin();
-- curinteger;
integers.erase(curinteger);
curinteger = nextinteger;
} return *(curinteger); }
数学方法很有启发性,从后向前推倒。把最后剩下的数字依次回推到最开始的值
过程http://www.360doc.com/content/12/0314/13/1429048_194255548.shtml
代码:http://www.cnblogs.com/dartagnan/archive/2011/09/16/2179143.html
int LastRemaining_Solution2(int n, unsigned int m)
{
// invalid input
if(n <= || m < )
return -; // if there are only one integer in the circle initially,
// of course the last remaining one is 0
int lastinteger = ; // find the last remaining one in the circle with n integers
for (int i = ; i <= n; i ++)
lastinteger = (lastinteger + m) % i; return lastinteger;
}
【编程题目】n 个数字(0,1,…,n-1)形成一个圆圈,从数字 0 开始的更多相关文章
- 经典面试题:n个数字(0,1,…,n-1)形成一个圆圈
题目: n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, 每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字). 当一个数字删除后,从被删除数字的下一个继续删 ...
- 华为 2015 机试 输出:数字后面的连续出现的(2个或多个)相同字符(数字或者字符),删去一个,非数字后面的不要删除,例如,对应输出为:33aabb55pin。
package 华为机试; //C++ 输入:由数字和字母组成的字符串,例如:333aaabb55ppin //输出:数字后面的连续出现的(2个或多个)相同字符(数字或者字符),删去一个,非数字后面的 ...
- 【编程题目】栈的 push、pop 序列
29.栈的 push.pop 序列(栈)题目:输入两个整数序列.其中一个序列表示栈的 push 顺序,判断另一个序列有没有可能是对应的 pop 顺序.为了简单起见,我们假设 push 序列的任意两个整 ...
- 【编程题目】在从 1 到 n 的正数中 1 出现的次数
30.在从 1 到 n 的正数中 1 出现的次数(数组)题目:输入一个整数 n,求从 1 到 n 这 n 个整数的十进制表示中 1 出现的次数.例如输入 12,从 1 到 12 这些整数中包含 1 的 ...
- 【编程题目】在一个字符串中找到第一个只出现一次的字符。如输入 abaccdeff,则输出 b。
第 17 题(字符串):题目:在一个字符串中找到第一个只出现一次的字符.如输入 abaccdeff,则输出 b. 思路:此题非常容易. 最开始是想开辟一块空间存储每个字符出现的次数. 但转念一想,似乎 ...
- OJ——华为编程题目:输入字符串括号是否匹配
package t0815; /* * 华为编程题目:输入字符串括号是否匹配 * 若都匹配输出为0,否则为1 * 样例输入:Terminal user [name | number (1)] * 样例 ...
- php实现 提取不重复的整数(编程题目能够最快的熟悉函数)
php实现 提取不重复的整数(编程题目能够最快的熟悉函数) 一.总结 一句话总结:编程题目能够最快的熟悉函数. 1.字符串反转函数? 没有str_revserse,有arr_reverse,这里是st ...
- 【编程题目】如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
转自:http://blog.csdn.net/vast_sea/article/details/8167968 看上去似乎任何已知的算法都无法做到,如果谁做到了,那么所有的排序方法:QuickSor ...
- 【编程题目】有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序;(需要回头仔细研究)
32.(数组.规划)有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序:要求:通过交换 a,b 中的元素,使[序列 a 元素的和]与[序列 b 元素的和]之间的差最小.例如: var a=[ ...
随机推荐
- 解析posix与perl标准的正则表达式区别 ---PHP
正则表达式(Regular Expression,缩写为regexp,regex或regxp),又称正规表达式.正规表示式或常规表达式或正规化表示法或正规表示法,是指一个用 来描述或者匹配一系 ...
- C#中的那些全局异常捕获
1.WPF全局捕获异常 public partial class App : Application { public App() { // 在异 ...
- 【AngularJS】—— 6基于AngularJS的过滤与排序
阅读目录 程序设计分析 代码以及结果 前面了解了AngularJS的使用方法,这里就简单的写个小程序,实现查询过滤以及排序的功能. 本程序中可以了解到: 1 angularjs的过滤器 2 n ...
- linux命令行netstat总结
1.所谓的监听就是某个服务程序会一直常驻在内存中,所以该程序启动的Port就会一直存在. 2.在小于1023的端口,都是需要以root身份才能够启动的. 3.大于1024以上的Port主要是作为cli ...
- HDOJ 4336 Card Collector
容斥原理+状压 Card Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- springmvc之自定义注解(annotation)
参考:日志处理 三:Filter+自定义注解实现 系统日志跟踪功能 1.项目结构 2.pom.xml,添加需要依赖 <project xmlns="http://maven.apach ...
- 几个Jquery对话框插件
项目现状 While Thickbox had its day, it is not maintained any longer, so we recommend you use some alter ...
- 几个简单实用的css效果
1.要使按钮具有3D效果,只要将它的左上部分边框设置为浅色,右下部分边框设置为深色即可. eg:#button { background: #888; border: 2px solid; borde ...
- [OpenJudge0054]特务会议召开
[OpenJudge0054]特务会议召开 试题描述 在敌占区的特务时常会碰头.敌占区有n个城市,为保证安全,中央经过侦查,只选择了n-1条较安全的道路作为特务们碰头可以走的道路.每次开会,中央会选择 ...
- Unable to locate player settings. bin/Data/settings.xml
Hello guys, so according to the this response: http://stackoverflow.com/a/18302624/5727136 you need ...