【编程题目】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=[ ...
随机推荐
- C#集合类图继承关系一览表
- 绿书模拟day10 单词前缀
[题目描述]一组单词是安全的,当且仅当不存在一个单词是另一个单词的前缀,这样才能保证数据不容易被误解,现在你手上有一个单词集合s,你需要计算有多少个自己是安全的.注意空集永远是安全的.[输入格式]第一 ...
- 导入 sun.net.TelnetInputStream; 报错
// 对于导入 sun.net.TelnetInputStream; 报错 是权限不足 myeclise 默认不是使用sun 下面的额工具类 也可以自己建立一个 TelnetInputStream 继 ...
- Eclipse常见配置及常用插件
tomcat为能同时运行多个项目而不崩溃,需要配置一下jvm设置 -Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=512m
- hdu1026.Ignatius and the Princess I(bfs + 优先队列)
Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- LoadRunner脚本编写(转)
性能测试工程师要懂代码么?答案是必须的.好多测试员认为在loadrunner中编写脚本很难很牛X ,主要是大多测试人员并未做过开发工作,大学的那点程序基础也忘记的差不多了.还有非计算机专业出身的测试员 ...
- compareTo(String str)与compareToIgnoreCase(String str)
一.compareTo(String str)方法 返回值:如果参数字符串等于此字符串,则返回值 0:如果此字符串按字典顺序小于字符串参数,则返回一个小于 0 的值:如果此字符串按字典顺序大于字符串参 ...
- CentOS6系升级Python2.7版本
安装前准备 本实例以CentOS6.7为例 [root@E tools]# uname -r 2.6.32-431.23.3.el6.x86_64 [root@E tools]# uname -m x ...
- C#构造方法重载
1.什么是构造方法? 首先,它是一个方法,它是类中 众多方法中的一个.其次,它具有类中其他方法所不具备的一些特性. 在类执行开始的时候,执行这个方法. 2.构造方法相对其他方法有哪些不同? 方法名:类 ...
- transition第一次没有效果
原因很简单因为一开始没有设定要改变的样式的初始值 例如你要改的是top:-50; 那一开始就要设top:0; 不然第一次不会有动画效果移动