【编程题目】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=[ ...
随机推荐
- [译]git log
git log git log命令用来显示提交的快照. 能列出来你项目的历史, 能过滤和搜索你指定的一些修改. git status能让你检查工作目录和stage区的状态, git log只提供被co ...
- ajax基础了解
使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据.这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息.AJAX即“Asynchronous JavaSc ...
- html 图像映射
个人先做而一个例子 <body> <img src="图像映射/enterdesk.com-D69055E2B422567CB273963EA05FF7D4.jpg&quo ...
- EL表达式和JSTL
EL相关概念JSTL一般要配合EL表达式一起使用,来实现在jsp中不出现java代码段.所以我们先来学习EL表达式 EL主要用于查找作用域中的数据,然后对它们执行简单操作:它不是编程语言,甚至不是脚本 ...
- tableview侧滑删除
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { ) { retu ...
- session会话复制
前几天请教了Yoda大神关于会话复制方面的问题, 如果客户访问是两个服务器的东西,这样会有两个分别的session, 这两个session之间怎么交互,集群环境下,同构的服务器,专业术语 ...
- MyEclipse SVN安装方法
方法一:在线安装 1.打开HELP->MyEclipse Configuration Center.切换到SoftWare标签页. 2.点击Add Site 打开对话框,在对话框Name输入Sv ...
- log4j 配置
给java项目添加log4j日志: 1.下载log4j jar包,放入lib目录, 导入项目中 2.创建log4j.properties 文件 目录 Src 3.在需要使用输出的类中使用 priva ...
- HDU——PKU题目分类
HDU 模拟题, 枚举1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 ...
- xadmin 自定义视图在uwsgi部署时的一坑
比如修改登录页的template,代码如下: xadmin.site.register(xadmin.views.LoginView, login_template="card_pool/s ...