前段时间朋友面试碰到过这样题,要在指定的短时间内实现起来有一定困难,网上也看到类似这样算法题,今天跟朋友同事一起讨论一下,现在把我的一些方法与想法实现代码贴出来,参考参考...先做个记录了
/**
*created by zxb
*date 2008-10-29 - 上午12:48:10
*zxb 开源测试项目 test算法研究
*to do TODO
*JDK5.0
**/
package com.test;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
/**
* 题如下:指定500个人,编号从1-500,现在从1编号开始点名,当点到序号为7时,
* 让该人出列,后续接着继续开始点名从1开始,再次点到为7时,让该人出列,
* 一直点名直到最后只有一个为止,当点名到最后时,从新开始循环点名,
* 剩下的最后一个人的编号是多少?(一面试题,还是有点挑战性,抛砖引玉了)
* 解题思路:构造LinkedList<Integer>进行批量删除等的操作
* 循环设置出列点位置值为0,然后删除该点数据,循环至小于数据组长度小于7时,
* 重新调整开始点名数据组,始终把第一位点名的数字<人>放在实际所因位置也是第一位的位置
* 按照索引位置增量删除一个 因为每删除一个数据组少掉一个数
*
*
* 451
*@author zxb
*/
public class FiveHundred {
private LinkedList<Integer> l=null;
private List<Integer> list=null;
private static final int MAX=7;//指定点名的出列的编号数 固定范围内进行循环删除指定的索引位置
private int count=0; //多少个轮回次数
private static final int SUM=500;//待删除指定索引位置的数据组(1--500)
private static int size=0;//队列的动态个数
public FiveHundred(){
list=new ArrayList<Integer>();
for (int i = 1; i <= SUM; i++) {
list.add(Integer.valueOf(i));
}
l=new LinkedList<Integer>(list);
int m= l.size()%MAX;
if(m==0){
count=l.size()/MAX;
}else{
count=l.size()/MAX+1;
}
}
public void change(){
List<Integer> l_2=new ArrayList<Integer>();
int j=1;//叠加 根据后面补充
List<Integer> l_3=null;
//过滤掉为0的元素
int s1=l.size();
for (int i = 0; i < s1; i++) {
if(l.contains(new Integer(0))){
l.remove(l.indexOf(new Integer("0")));
}
}
//点名出列的临时设置为0 并且设置点名之后队伍列的数据组
int s2=l.size();
for (int i = 0; i < s2; i++) {
if(i==MAX*j-1 && j<=count){//
l.set(MAX*j-1, new Integer("0"));
j++;
}else{
l_2.add(l.get(i));
}
}
//截取数据从最后一个0开始往后 list数据
int lastIndexZero=l.lastIndexOf(new Integer("0"));
int size=l.size();
if(lastIndexZero<size-1){
l_3=l.subList(lastIndexZero+1, size);
}
if(l_2!=null && l_3!=null)
l=reverseList(l_2,l_3);
}
//反调过来进行 重新排序
public LinkedList<Integer> reverseList(Collection<Integer> c1,Collection<Integer> c2){
LinkedList<Integer> l=new LinkedList<Integer>();
c1.removeAll(c2);
l.addAll(c2);
l.addAll(c1);
return l;
}
//处理特殊的情况,当剩下的个数小于指定出列的索引位置时 这里即 小于7时
@SuppressWarnings("unchecked")
public void specialList(){
System.out.println(l);
int size=l.size();
List l1=new ArrayList<Integer>();
List l2=new ArrayList();
int count=0;
while(size!=1){
if((MAX-1) % size==0){
l.remove((MAX-1) % size);
}else{
//后补叠加替换
l.remove((MAX-1) % size);
l1=l.subList((MAX-1) % size, l.size());
LinkedList<Integer> l3=new LinkedList<Integer>();
l3=(LinkedList)l.clone();
l2=(l3.subList(0, (MAX-1) % size));
count=l1.size();
//使用删除Collection的删除方法 容易引起java.util.ConcurrentModificationException
//remove(),clear(); iterator.remove()
for (int i = 0; i < count; i++) {
l.set(i, (Integer) l1.get(i));
}
int s1=l2.size();
for (int i = 0; i < s1; i++) {
l.set(count+i, (Integer) l2.get(i));
}
}
size--;
System.out.println(l);
}/**/
System.out.println("获取到最后一个数字==="+l.get(0));
}
//程序启动测试
public static void main(String[] args) {
FiveHundred fh=new FiveHundred();
long lo1=System.currentTimeMillis();
size=fh.l.size();
do{
fh.change();
size--;
}while(size>1);
fh.specialList();
long lo2=System.currentTimeMillis();
System.out.println("计算花费时间==== "+(lo2-lo1)+" 毫秒");
}
}
分享到:
相关推荐
计算机常见算法面试题 本资源摘要信息涵盖了计算机常见算法面试题,主要涉及链表、字符串操作、搜索算法等方面的知识点。下面是对标题、描述、标签和部分内容的详细解释: 标题:计算机常见算法面试题 该标题表明...
本资源包聚焦于C语言实现的数据结构面试题,旨在帮助应聘者准备相关面试,提升对数据结构和算法的理解。 一、链表 链表是一种线性数据结构,与数组不同,它在内存中不是连续存储的。每个节点包含数据和指向下一个...
【Java面试题】 在Java面试中,面试官通常会考察候选人的算法基础以及数据库操作能力。这包括但不限于数据结构的理解、算法设计与分析、以及SQL的熟练运用。以下是相关知识点的详细介绍: 1. **算法基础**: - **...
以下是一些热门的Java算法面试题及其详细解释: 1. **双指针问题**:常用于解决数组相关的问题,如寻找两个数之和等于目标值,或者在有序数组中查找重复元素等。通过维护两个指针,一个从左向右移动,另一个从右向...
【面试题得物1】涉及了众多IT领域的知识点,涵盖了Java、Kafka、RocketMQ、MySQL、Redis、算法和分布式等多个方面。以下是这些知识点的详细解释: 1. **数据库索引结构**:索引是数据库管理系统中用于提高查询速度...
本文总结了高级软件测试面试题,涵盖了软件测试的多个方面,包括数据类型、哈希算法、哈希冲突、内存管理和垃圾回收机制、拷贝机制、协程机制等。 一、列表和元组的区别 列表是动态的,长度可变,可以随意地增删改...
"算法大全-面试题-链表-栈-二叉树-数据结构"这个压缩包文件提供了丰富的知识资源,旨在帮助学习者深入理解和应用这些核心概念。 链表是一种线性数据结构,与数组不同,它的元素在内存中不是连续存储的。链表由一...
根据给定文件的信息,我们可以总结出以下数据结构与算法...以上是对文档中提到的几道数据结构和算法面试题的详细解析,每一道题目都给出了具体的代码实现和分析思路,这对于理解这些经典问题及其解决方法具有重要意义。
数据库面试题涵盖了数据库基础知识、数据结构、算法、面向对象编程、软件工程以及特定数据库系统(如Visual FoxPro和SQL)的使用等多个方面。以下是这些题目所涉及的关键知识点的详细解释: 1. **算法的执行效率与...
面试题可能涉及循环队列、优先级队列(堆)等。 5. **哈希表**:哈希表通过哈希函数将键映射到数组中的位置,提供快速的查找、插入和删除操作。面试中可能问到哈希冲突的解决方法(开放寻址法、链地址法等)。 6. ...
以下是对这些常见面试题的详细解释: 1. 创建矩阵: 在Matlab中,矩阵是其核心数据结构。创建矩阵的方法多种多样,最简单的方式是直接通过方括号`[]`来定义。例如,创建一个2x2矩阵A,包含数字1到4,可以使用如下...
从给定的文件信息来看,我们探讨的主题是“算法面试题”,这在IT行业特别是软件开发领域是非常重要的一个环节。面试官通过算法题来评估应聘者的逻辑思维能力、编程技能以及解决问题的能力。以下是对给定内容中涉及的...
这些知识点涵盖了C#的基础语法、面向对象特性、Web开发以及算法等多个方面,对于理解和解答C#面试题至关重要。通过深入学习和实践,开发者可以更好地掌握C#编程,从而在面试和实际工作中表现出色。
"java中级面试题(自己汇总)" 本文总结了Java中级面试题,涵盖了集合、HashMap、HashSet、HashTable、ConcurrentHashMap、红黑树、Java 8对HashMap的优化、LinkedHashMap、TreeMap、IdentityHashMap等知识点。 ...
本资源提供了100多个C#面试题,涵盖了C#语言的各个方面,包括ASP.NET、委托、事件、索引器、排序算法等。这些题目可以帮助开发者更好地理解C#语言的特性和使用方法,并提高面试的通过率。 1. ASP.NET页面之间传递值...
【链表操作:删除指定节点】 若已知一个指针指向链表中的某个节点,但不知道头节点,要删除该节点,需要将该节点的值复制给它的下一个节点,然后更新指针,最后释放原节点。如下: ```c void deleteNode(Link **...
【计算机常见算法面试题】涉及的是一些经典的C语言编程和算法问题,这些问题在面试中经常出现,对理解和掌握C语言以及基础算法至关重要。以下是对这些题目及其解法的详细解析: 1. **判断链表中是否有环**: 判断...
本资源摘要信息涵盖了.NET经典面试题的知识点,涉及到C#语言、ASP.NET Web开发、面向对象编程、数据结构和算法等方面。 1. 访问权限修饰符 * private:私有成员,在类的内部才可以访问。 * protected:保护成员,...