一、第一种实现:

实现比较简单,直接贴现成的代码了,第一种实现:

/**
* 总人数
*
* @param d
*/
private static void sortQuerry1(int d) {
// TODO 先构造一个数组
ArrayList<Integer> arr = new ArrayList<>();
for (int i = 1; i <= d; i++) {
arr.add(i);
}
int xiabiao = -1;
int count = 0;
// 循环查找
int mun = 10;
while (arr.size() > 1) {
xiabiao++;
count++;
if (count == 3) {
System.out.println("移除的是" + arr.get(xiabiao));
arr.remove(xiabiao);
count = 0;
xiabiao = xiabiao - 1;
}
if (xiabiao == (arr.size() - 1)) {
xiabiao = -1;
}
if (arr.size() == 1) {
System.out.println("最后一个剩余的人是:" + arr.get(0));
break;
} } }

二、优化和改进

思考1分钟,上述这种实现的缺点是什么?

时间到了,答案就在Arraylist上面,Arraylist.remove()方法的实现原理是将数组第i个元素之后的所有元素,向前挪一位,这样会导致时间复杂度增加。

如何改进呢?尽量避免ArrayList.remove()方法的使用。下面是一种实现:

private static void sortQuerry2(int d) {
// TODO 先构造一个数组
ArrayList<Boolean> arr = new ArrayList<>(); for (int i = 1; i <= d; i++) {
arr.add(true);
}
int xiabiao = -1;
int count = 0;
int x=0;
// 循环查找
while (true) { xiabiao++;
if(xiabiao>=arr.size()-1)
xiabiao=xiabiao%arr.size();
if(arr.get(xiabiao)==false)
continue;
if (x>=arr.size()-1) {
System.out.println("最后一个剩余的人是:" + (xiabiao+1));
break;
}
count++;
if (count == 3) {
System.out.println("移除的是" + (xiabiao+1));
arr.set(xiabiao, false);
count = 0;
x++;
System.out.println("X是" + x); }
if (xiabiao == (arr.size() - 1)) {
xiabiao = -1;
} }
}

三、测试对比:

两组数据分别是200000,400000

public static void main(String[] args) {
System.out.println("请输入一个数字:");//200000,400000
Scanner scanner = new Scanner(System.in);
int d = scanner.nextInt();
long startTime=System.currentTimeMillis();
sortQuerry1(d);
long endTime=System.currentTimeMillis();
System.out.println("消耗时间:"+(endTime-startTime)/1000.000); }

第一组测试数据200000:

sortQuerry1耗时: 3.919     sortQuerry2耗时:3.304

第二组测试数据400000:

sortQuerry1耗时: 13.443     sortQuerry2耗时:7.157

当数据量大的时候,算法二明显要快于算法1。

以上欢迎交流。

某厂java算法题实现及改进【有n个人成一圈,顺序排号(编号为1到n),从第一个人开始报数1到3报数】的更多相关文章

  1. 【转】约瑟夫环算法---------题目:有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后最后留下的是原来第几号的那位.

    提示:用环形链表实现 对于这个题目其实就是用c语言的循环链表实现一个约瑟夫环.我们可以定义一个循环链表,将这n个人加入到链表中,然后定义三个节点指针在链表上循环,移动跨度为3,利用链表的循环功能每次删 ...

  2. java例题_37 有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 3 问最后留下的是原来第几号的那位。

    1 /*37 [程序 37 报数] 2 题目:有 n 个人围成一圈,顺序排号.从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 3 问最后留下的是原来第几号的那位. 4 */ 5 ...

  3. 一道java算法题分析

    最近在面试中遇到这样的一道算法题:       求100!的结果的各位数之和为多少?       如:5!=5*4*3*2*1=120,那么他们的和为1+2+0=3这道题不算难,不过倒是注意的细节也有 ...

  4. 面试-java算法题

    1.编写一个程序,输入n,求n!(用递归的方式实现). public static long fac(int n){ if(n<=0) return 0; else if(n==1) retur ...

  5. 【JAVA算法题】职业抢劫

    题目 /*You are a professional robber planning to rob houses along a street. * Each house has a certain ...

  6. 25道经典Java算法题

    题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?   //这是一个菲波拉契数列问题 [Java] 纯 ...

  7. 50道java算法题(一)

    [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:   兔子的规律为数列1 ...

  8. 趣味Java算法题(附答案)

    [程序1]    题目:古典问题:有一对兔子,从出生后第3个月起每一个月都生一对兔子,小兔子长到第三个月后每一个月又生一对兔子,假如兔子都不死,问每一个月的兔子总数为多少?    //这是一个菲波拉契 ...

  9. 面试题-JAVA算法题

    1.编写一个程序,输入n,求n!(用递归的方式实现). public static long fac(int n){ if(n<=0) return 0; else if(n==1) retur ...

随机推荐

  1. 网页版仿Excel效果组件--handsontable拓展运用

    引言(祝看官们新年万事大吉) 前段时间项目需要实现网页版的excel表格功能,瞬间就想到了handsontable,为什么呢?理由如下:该UI组件功能齐全多样,展示效果也更贴近bootstrap风格, ...

  2. 借腾讯开源 VasDolly,谈谈 Android 签名和多渠道打包的原理!

    一.前言 Hi,大家好,我是承香墨影! 当我们需要发布一款 App 到应用市场的时候,一般需要我们针对不同的市场生产不同的渠道包,它们使用的是同一套代码,只是会包含一些各自的渠道信息,用于我们做数据分 ...

  3. 将Word表格中单元格中的文字替换成对应的图片

    示例 原文件结构: 替换后文档结构: 软件截图: 代码: using System;using System.Collections.Generic;using System.ComponentMod ...

  4. java对excel表格上传和下载的处理方法

    详见:http://www.jb51.net/article/120443.htm

  5. toString 方法在数组中的使用

    对于一个一维数组,他在转换成字符串的时候应该调用Arrays.toString(); 对于一个多维数组,他在转换成字符串的时候应该调用Arrays.deepToString(); 实例: packag ...

  6. CSS 圣杯布局升级版---多个固定宽度一个自适应宽度

    1.一个div固定,一个div自适应宽度.两种情况,固定在左或者在右. HTML: <div class="box1"> <div class="mai ...

  7. RotatedRect 类的用法

    RotatedRect 以 Emgu.CV.Structure 为命名空间. 表示带有旋转角度的矩形. 结构说明 普通矩形的基本结构

  8. 在JDBC中使用Java8的日期LocalDate、LocalDateTime

    在实体Entity里面,可以使用java.sql.Date.java.sql.Timestamp.java.util.Date来映射到数据库的date.timestamp.datetime等字段 但是 ...

  9. 对ios、android开发程序员的14条忠告

    ————————本文摘自千锋教育(http://www.mobiletrain.org/)对ios\android开发程序员的14条忠告————————— 1.不要害怕在工作中学习. 只要有电脑,就可 ...

  10. 利用 jQuery 来验证密码两次输入是否相同

    html <div class="row"> <div class="panel panel-info"> <div class= ...