【1】题目
题目:0,1,…,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
【2】思路
我们自己实现一个链表也不是很难的事情。如果面试官没有特殊要求,我们就可以用模板库中的std::list来模拟一个环形链表。由于std::list本身并不是一个环形结构,因此每当迭代器(Iterator)扫描到链表末尾的时候,我们要记得把迭代器移到链表的头部,这样就相当于按照顺序在一个圆圈里遍历了
【3】代码
// Test42.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
#include<list>
using namespace std;
typedef unsigned int UINT;
//n个数字 ,第m个元素
int LastRemaining(UINT n, UINT m)
{
//判断输入条件是否满足要求
if (n<1||m<1)
{
return -1;
}
//创建链表并初始化链表
UINT i = 0;
list<int> number;
for ( i = 0; i < n;++ i)
{
number.push_back(i);
}
//开始寻找到m个数据
list<int>::iterator current = number.begin();
while (number.size()>1)
{
//寻找到第m个数字,
for ( int j = 1; j < m; ++j)
{
current ++;
//如果到达末尾就循环到开始
if (current==number.end())
{
current = number.begin();
}
}
//删除第m个数字,当前指针指的是第m+1个元素
list<int>::iterator next = ++current;
//如果遇到末尾指针,则调到起始位置
if (next == number.end())
{
next = number.begin();
}
//当前指针切换到第m个元素,然后删除
--current;
number.erase(current);
current = next;
}
return *(current);
}
int main()
{
UINT n = 20;
UINT m = 7;
int reslut = LastRemaining(n, m);
printf_s("最后的结果:%d", reslut);
}