数组最后剩下的数字
1、题目描述:
有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。
2、思路:
这道题明显改编自剑指offer的圆圈中最后剩下的数字。具体解题思路主要借助于list集合,直接用数组删除元素代价极高。
将数组元素放到list里,定义一个指针,维护这个指针,当指针指向的index超出list的范围,将指针从头开始。
3、代码:
import java.util.*; public class Main{ public static void main(String[] args){ Scanner in=new Scanner(System.in); while(in.hasNext()){ int k=in.nextInt(); int [] a=new int [k]; for(int i=0;i<k;i++){ a[i]=i; } int result=lastIndexDelete(a); System.out.println(result); } } public static int lastIndexDelete(int [] a){ //只要找到最后一个删除的数,再去原数组中定位其下标即可 ArrayList<Integer> list=new ArrayList<>(); for(int i=0;i<a.length;i++){ list.add(a[i]); } int cur=0; while(list.size()!=1){ cur+=2;
//此处用while循环防止list剩下少量元素时,一次置零还是越界 while(cur>=list.size()){ cur = cur - list.size(); } list.remove(cur); } int lastNum=list.get(0); int result=-1; for(int i=0;i<a.length;i++){ if(lastNum==a[i]){ result=i; } } return result; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)