码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • JZ65 [剑指 Offer 62] 圆圈中最后剩下的数字


    题目:圆圈中最后剩下的数字

    CategoryDifficultyLikesDislikes
    lcofEasy (65.95%)657-

    0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。

    例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。

    示例 1:

    1. 输入: n = 5, m = 3
    2. 输出: 3

    示例 2:

    1. 输入: n = 10, m = 17
    2. 输出: 2

    限制:

    • 1 <= n <= 10^5
    • 1 <= m <= 10^6

    Discussion | Solution

    方法一:循环列表

    分析:采用链表模拟圆圈,当圆圈前后指针为自身时,结束。

    1. typedef struct number
    2. {
    3. int val;
    4. struct number* pre;
    5. struct number* next;
    6. }number;
    7. //创建圆圈,返回头结点
    8. number* createCircle(int n){
    9. int i = n;
    10. number *hp, *fp = nullptr, *pre = nullptr, *tail;
    11. while (i >= 0)
    12. {
    13. hp = (number*)malloc(sizeof(number) * 1);
    14. if(hp ){
    15. //节点赋值
    16. hp->val = i;
    17. hp->next = fp;
    18. //前一个节点的pre为当前节点
    19. if(fp) fp->pre = hp;
    20. // cout << hp->val << endl;
    21. if(n == i) tail = hp;
    22. fp = hp;
    23. i--;
    24. }
    25. }
    26. tail->next = hp;
    27. hp->pre = tail;
    28. return hp;
    29. }
    30. //计算最后一个值, 每次删除第n个值
    31. int retLastNumber(number* root, int n, int m){
    32. int size = n;
    33. if(!root) return -1;
    34. number* step = root, *temp;
    35. while(step->pre != step){
    36. //遍历
    37. int times = m%size == 0 ? m: m%size;
    38. for(int i = 1; i < times; i++){
    39. step = step->next;
    40. }
    41. //删除
    42. temp = step;
    43. temp->pre->next = temp->next;
    44. temp->next->pre = temp->pre;
    45. step = temp->next;
    46. free(temp);
    47. size--;
    48. }
    49. cout << "==" << step->val;
    50. return step->val;
    51. }
    52. int lastRemaining(int n, int m) {
    53. number* root = createCircle(n-1);
    54. return retLastNumber(root, n, m);
    55. }

    方法二:数组模拟

    分析:采用vector数据,循环至size==1

    1. int getResult(int n, int m){
    2. int size = n, pos = 0;
    3. vector<int> list;
    4. for(int i=0; i < n; i++)
    5. list.push_back(i);
    6. while (size > 1)
    7. {
    8. pos = (pos + m-1) % size;
    9. list.erase(list.begin() + pos);
    10. size--;
    11. }
    12. return *list.begin();
    13. }
    14. int lastRemaining(int n, int m) {
    15. return getResult(n,m);
    16. }

    方法三:约瑟夫环

    数学方法:约瑟夫环

    1. //数学问题:约瑟夫环
    2. int getAnsInMath(int n, int m){
    3. if(n == 1) return 0;
    4. //ans : 胜利者的位置
    5. int ans = 0;
    6. for(int size = 2; size <= n; size++){
    7. ans = (ans + m) % size;
    8. }
    9. return ans;
    10. }
    11. int lastRemaining(int n, int m) {
    12. return getAnsInMath(n,m);
    13. }

    Accepted

    • 36/36 cases passed (4 ms)
    • Your runtime beats 93.34 % of cpp submissions
    • Your memory usage beats 80.45 % of cpp submissions (5.7 MB)

    总结:常规想到的方法是方法一和方法二,方法三一般现场推倒,不易推倒出;但是方法一和方法二不满足时间要求。

  • 相关阅读:
    75:第六章:开发文章服务:8:开发前台的【根据条件,分页查询当前登录用户的,文章列表,接口】;(没什么好说的,就是使用了tkmybatis的条件查询;)
    Toronto Research Chemicals单羟基舒更葡糖钠说明书
    Java序列化以及反序列化
    名牌大学毕业,在名企担任程序员月薪5万,却为何选择离职当司机
    2023年信息安全管理与评估(赛项)评分标准第三阶段夺旗挑战CTF(网络安全渗透)
    创建型模式-工厂方法模式
    Android studio2022.3项目,X5内核WebView页面,顶部栏不显示问题
    【Taro3踩坑日记】不存在全局配置文件:C:\Users\TYW\.taro-global-config\index.json
    MySql8.0 驱动编译和使用 - Qt mingw73_32
    TI/德州仪器 CSD86350Q5D 同步降压 集成电路
  • 原文地址:https://blog.csdn.net/qq_32116001/article/details/126365065
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号