数组最后剩下的数字

Posted guoyu1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组最后剩下的数字相关的知识,希望对你有一定的参考价值。

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; } }

 

以上是关于数组最后剩下的数字的主要内容,如果未能解决你的问题,请参考以下文章

《剑指Offer——剪绳子,圆圈中最后剩下的数字》代码

剑指offer---数组中出现次数超过一半的数字

约瑟夫环(超好的代码存档)--19--约瑟夫环--LeetCode面试题62(圆圈最后剩下的数字)

约瑟夫环(超好的代码存档)--19--约瑟夫环--LeetCode面试题62(圆圈最后剩下的数字)

[剑指offer]面试题45:圆圈中最后剩下的数字

约瑟夫环