zoukankan      html  css  js  c++  java
  • 数组最后剩下的数字

    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; } }
  • 相关阅读:
    Angular2 组件通信
    vue跨组件通信的几种方法
    Angular React 和 Vue的比较
    vue对比其他框架
    ReactJS 生命周期、数据流与事件
    LeetCode 1089. 复写零(Duplicate Zeros) 72
    LeetCode 421. 数组中两个数的最大异或值(Maximum XOR of Two Numbers in an Array) 71
    12
    11
    10
  • 原文地址:https://www.cnblogs.com/guoyu1/p/12394726.html
Copyright © 2011-2022 走看看