16. 微软面试题:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始
来源:互联网 发布:淘宝客服处理售后软件 编辑:程序博客网 时间:2024/05/16 06:18
题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,
每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。
当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。
分析:
最初的想法是想设计一个数据结构,实现随机存取,又能快速删除的数据结构。最开始想到的是循环数组,发现删除不好处理,得移动大量的数据,效率上比较低。
如果使用链表的话,又没法实现随机存取。
后面使用百度搜了下,看到一种方法,看看他的分析:
n个数字(0,1,…,n-1),先删除第m个数字,再从后 开始。。。
假设k = (m-1)%n,n个数字的位置为:f(n), 删除第k个数字后的位置为:f(n-1),删除剩一个数字位置为:f(1)
f(n) f(n-1)
k+1 -> 0
k+2 -> 1
…
n-1 -> n-k-2
0 -> n-k-1
…k-1 -> n-2
由此可以推出:f(n) = (f(n-1) + k + 1)%n 并且f(1) = 0 ,其中 k = (m-1)%n
所以 f(n) = (f(n-1) +m)%n。
那么实现如下:
#include<iostream>using namespace std;int findpos(int n, int m){ if(n < 1 || m < 1) return -1; if(n == 1) return 0; return (findpos(n-1, m) + m)%n;}int main(){ int n = 10; int m = 5; cout << " 0,1,...,10 从0开始数5开始删除,最后为: " << findpos(10, 5) << endl; return 0;}输出结果为:
0,1,...,10 从0开始数5开始删除,最后为: 2
0 0
- 16. 微软面试题:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始
- n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始
- n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始
- n 个数字(0,1,…,n-1)形成一个圆圈,从数字0 开始,每次从这个圆圈中删除第m 个数字
- n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, 每次从这个圆圈中删除第m个数字
- n 个数字(0,1,…,n-1)形成一个圆圈,从数字0 开始,每次从这个圆圈中删除第m 个数字
- n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始(18)
- 第18 题:题目:n 个数字(0,1,…,n-1)形成一个圆圈,从数字0 开始,
- [约瑟夫环]n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始... ...
- [约瑟夫环]n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始... ...
- 18.n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,
- 微软面试100题之18题:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始... ...
- 【微软100题】n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, 每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。 当一个数字删除后,从被删除数
- 每天学习一点编程(7)(n 个数字(0,1,…,n-1)形成一个圆圈,从数字0 开始,每次从这个圆圈中删除第m 个数字)
- 每天学习一算法系列(18)(n 个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m 个数字)
- n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字
- n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字
- n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m
- POJ 1236 Network of Schools 强连通分量
- 《算法概论》思维导图
- 单链表常见面试题及答案
- 黑马程序员----Java基础之数据类型包装类及集合框架
- 球幕互动投影
- 16. 微软面试题:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始
- Cmarkup 使用总结 xml解析
- LeetCode Construct Binary Tree from Preorder and Inorder Traversal
- CSS基础教程17篇 [翻译Htmldog]
- Linux程序前台后台切换
- 股票F10关键字过滤工具:13年年报10转10股票一览,截止2014年3月10日 共67只
- 寻找下一个最大排列
- node.js Error: SSL Error: CERT_UNTRUSTED
- C语言学习记录2