剑指 Offer 62. 圆圈中最后剩下的数字

题目:

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

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

 

示例 1:

输入: n = 5, m = 3
输出: 3

示例 2:

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

 

限制:

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

 

代码:

//超时了

复制代码
 1 import java.util.*;
 2 
 3 /**
 4  * @author zcy
 5  * @date 2021年04月11日 16:28
 6  */
 7 
 8 class Solution {
 9     public int lastRemaining(int n, int m) {
10 
11         List<Integer> list = new LinkedList<>();
12         for (int i = 0; i < n; i++) {
13             list.add(i );
14         }
15         //上一次删除时,删除下标前一位的下标
16         int index = -1;
17         while (n > 1) {
18             int t = index + m;
19             //取模,因为可能超过长度
20             t = t % n;              
21             list.remove(t);
22                         //在头尾的话index都会到最后一个位置
23             if(t==0||t==n-1){            
24                 index=n-2;
25             }else{
26                 index=t-1;
27             }
28             n--;
29         }        
30         return list.get(0);
31     }
32 }        
复制代码

 

代码2:

//约瑟夫环问题

复制代码
 1 import java.util.*;
 2 
 3 /**
 4  * @author zcy
 5  * @date 2021年04月11日 16:28
 6  */
 7 
 8 class Solution {
 9     public int lastRemaining(int n, int m) {
10         int p=0;
11         for(int i=2;i<=n;i++){
12             p=(p+m)%i;
13         }
14         return p;
15 
16     }
17 }
复制代码

 

posted @   堤苏白  阅读(51)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示