剑指offer之圆圈最后剩下的数

举报
chenyu 发表于 2021/07/27 01:45:35 2021/07/27
【摘要】 1 问题  求圆圈最后剩下的数,比如数组0, 1, 2 ,3 ,4围城一个环,我们每次去掉第三个数字,删除的前4个数字依次是2, 0, 4, 1,最后剩下的数字是3                   0          ...

1 问题 

求圆圈最后剩下的数,比如数组0, 1, 2 ,3 ,4围城一个环,我们每次去掉第三个数字,删除的前4个数字依次是2, 0, 4, 1,最后剩下的数字是3


  
  1.                   0
  2.          4               1
  3.            3           2

 

 

 

 

 

 

 

 

2 思路

我们用list,我们要支持环就这样,如果发现当前指针指向是尾巴的时候,我们把它指向链表的开始。

 

 

 

 

 

 

 

 

 

3 代码实现


  
  1. #include <iostream>
  2. #include <list>
  3. using namespace std;
  4. int getIndex(int n, int m)
  5. {
  6. if (n < 1 || m < 1)
  7. {
  8. return -1;
  9. }
  10. list<int> numbers;
  11. for (int i = 0; i < n; ++i)
  12. {
  13. numbers.push_back(i);
  14. }
  15. list<int>::iterator current = numbers.begin();
  16. while(numbers.size() > 1)
  17. {
  18. for(int i = 1; i < m; ++i)
  19. {
  20. current++;
  21. //指针向右移动的时候需要判断是否到了数组尾巴
  22. if (current == numbers.end())
  23. {
  24. current = numbers.begin();
  25. }
  26. }
  27. //指针向右移动的时候需要判断是否到了数组尾巴
  28. list<int>::iterator next = ++current;
  29. if (next == numbers.end())
  30. {
  31. next = numbers.begin();
  32. }
  33. current--;
  34. //删除指定的元素
  35. numbers.erase(current);
  36. current = next;
  37. }
  38. return *(current);
  39. }
  40. int main()
  41. {
  42. int a[] = {0, 1, 2, 3, 4};
  43. int index = getIndex(5, 3);
  44. if (-1 != index)
  45. {
  46. std::cout << a[index] << std::endl;
  47. }
  48. return 0;
  49. }

 

 

 

4 运行结果

3
 

 

 

 

5 总结

如果我们需要环的数据结构,我么可以使用list数据结构,然后当指针指向尾巴的时候我们指向头。


  
  1. list<int> numbers;
  2. for (int i = 0; i < n; ++i)
  3. {
  4. numbers.push_back(i);
  5. }
  6. list<int>::iterator current = numbers.begin();
  7. for (int i = 1; i < m; ++i)
  8. {
  9. ++current;
  10. if (current == numbers.end())
  11. {
  12. current = numbers.begin();
  13. }
  14. }

 

文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。

原文链接:chenyu.blog.csdn.net/article/details/97983965

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。