某厂java算法题实现及改进【有n个人成一圈,顺序排号(编号为1到n),从第一个人开始报数1到3报数】
一、第一种实现:
实现比较简单,直接贴现成的代码了,第一种实现:
/**
* 总人数
*
* @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报数】的更多相关文章
- 【转】约瑟夫环算法---------题目:有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后最后留下的是原来第几号的那位.
提示:用环形链表实现 对于这个题目其实就是用c语言的循环链表实现一个约瑟夫环.我们可以定义一个循环链表,将这n个人加入到链表中,然后定义三个节点指针在链表上循环,移动跨度为3,利用链表的循环功能每次删 ...
- java例题_37 有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 3 问最后留下的是原来第几号的那位。
1 /*37 [程序 37 报数] 2 题目:有 n 个人围成一圈,顺序排号.从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 3 问最后留下的是原来第几号的那位. 4 */ 5 ...
- 一道java算法题分析
最近在面试中遇到这样的一道算法题: 求100!的结果的各位数之和为多少? 如:5!=5*4*3*2*1=120,那么他们的和为1+2+0=3这道题不算难,不过倒是注意的细节也有 ...
- 面试-java算法题
1.编写一个程序,输入n,求n!(用递归的方式实现). public static long fac(int n){ if(n<=0) return 0; else if(n==1) retur ...
- 【JAVA算法题】职业抢劫
题目 /*You are a professional robber planning to rob houses along a street. * Each house has a certain ...
- 25道经典Java算法题
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? //这是一个菲波拉契数列问题 [Java] 纯 ...
- 50道java算法题(一)
[程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1 ...
- 趣味Java算法题(附答案)
[程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每一个月都生一对兔子,小兔子长到第三个月后每一个月又生一对兔子,假如兔子都不死,问每一个月的兔子总数为多少? //这是一个菲波拉契 ...
- 面试题-JAVA算法题
1.编写一个程序,输入n,求n!(用递归的方式实现). public static long fac(int n){ if(n<=0) return 0; else if(n==1) retur ...
随机推荐
- ApiManager搭建
piManager 作为一个Api 文档管理工具,而且是开源的,作为开发者使用,还是蛮不错的,整体的界面也很友好,下面就来看一下吧. 下面就来介绍下ApiManager在centos 6下的搭建过程吧 ...
- 编译安装python3.6后pip3无法安装模块问题处理
编译安装python3.6之后,使用pip3命令安装第三方库效果如图所示: pip is configured with locations that require TLS/SSL, however ...
- JavaScript 知识点
JS基础 页面由三部分组成: html:超文本标记语言,负责页面结构 css:层叠样式表,负责页面样式 js:轻量级的脚本语言,负责页面的动效和数据交互 小总结:结构,样式和行为,三者相分离 在htm ...
- 获取目录-Winform
// 获取程序的基目录. System.AppDomain.CurrentDomain.BaseDirectory // 获取模块的完整路径. System.Diagnostics.Process.G ...
- ArrayList源码阅读
前言 数组是我们最常用最简单的数据结构,Java里对数组做了一个简单的包装,就是ArrayList,提供自动扩容的功能. 最常用法 list在我们日常代码中最为常用的做法是创建一个list,放入数据, ...
- Centos下_MysqL5.7在使用mysqldump命令备份数据库报错:mysqldump: Got error: 1449: The user specified as a definer ('fk_system'@'localhost') does not exist when using LOCK TABLES
在阿里云服务器增加一个shell脚本定时备份数据库脚本执行任务时,测试性的执行了备份命令,如下 [root@iZ2ze503xw2q1fftv5rhboZ mysql_bak]# /usr/local ...
- 情景linux--如何摆脱深路径的频繁切换烦恼?
情景 通常情况下,在linux系统上切换目录的成本很低,使用cd命令就可以了.如果需要在一个目录的不同的子目录和其父目录之间切换,进入到这个目录之后,再使用相对路径会比较方便.如果要切换的目录的路径较 ...
- 随笔︱MRO-Microsoft R Open使用心得与相应内容总结
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 往期回顾: 新工具︱微软Microsoft ...
- 如何构造一个简单的USB过滤驱动程序
本文分三部分来介绍如何构造一个简单的USB过滤驱动程序,包括"基本原理"."程序的实现"."使用INF安装".此文的目的在于希望读者了解基本 ...
- HighCharts之2D柱状图、折线图和饼图的组合图
HighCharts之2D柱状图.折线图和饼图的组合图 1.实例源码 ColumnLinePie.html: <!DOCTYPE html> <html> <head&g ...