`
oboaix
  • 浏览: 274309 次
社区版块
存档分类
最新评论

循环删除指定索引位置一道面试题算法

    博客分类:
  • JAVA
阅读更多

      前段时间朋友面试碰到过这样题,要在指定的短时间内实现起来有一定困难,网上也看到类似这样算法题,今天跟朋友同事一起讨论一下,现在把我的一些方法与想法实现代码贴出来,参考参考...先做个记录了

 

 

/**
*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)+" 毫秒");
	}
}

 

 

2
0
分享到:
评论

相关推荐

    计算机常见算法面试题

    计算机常见算法面试题 本资源摘要信息涵盖了计算机常见算法面试题,主要涉及链表、字符串操作、搜索算法等方面的知识点。下面是对标题、描述、标签和部分内容的详细解释: 标题:计算机常见算法面试题 该标题表明...

    c 数据结构 面试题 算法 面试题

    本资源包聚焦于C语言实现的数据结构面试题,旨在帮助应聘者准备相关面试,提升对数据结构和算法的理解。 一、链表 链表是一种线性数据结构,与数组不同,它在内存中不是连续存储的。每个节点包含数据和指向下一个...

    java面试题(算法+数据库)

    【Java面试题】 在Java面试中,面试官通常会考察候选人的算法基础以及数据库操作能力。这包括但不限于数据结构的理解、算法设计与分析、以及SQL的熟练运用。以下是相关知识点的详细介绍: 1. **算法基础**: - **...

    最热门的Java 算法面试题汇总

    以下是一些热门的Java算法面试题及其详细解释: 1. **双指针问题**:常用于解决数组相关的问题,如寻找两个数之和等于目标值,或者在有序数组中查找重复元素等。通过维护两个指针,一个从左向右移动,另一个从右向...

    面试题得物1

    【面试题得物1】涉及了众多IT领域的知识点,涵盖了Java、Kafka、RocketMQ、MySQL、Redis、算法和分布式等多个方面。以下是这些知识点的详细解释: 1. **数据库索引结构**:索引是数据库管理系统中用于提高查询速度...

    面试宝典!高级软件测试面试题大放送

    本文总结了高级软件测试面试题,涵盖了软件测试的多个方面,包括数据类型、哈希算法、哈希冲突、内存管理和垃圾回收机制、拷贝机制、协程机制等。 一、列表和元组的区别 列表是动态的,长度可变,可以随意地增删改...

    算法大全-面试题-链表-栈-二叉树-数据结构

    "算法大全-面试题-链表-栈-二叉树-数据结构"这个压缩包文件提供了丰富的知识资源,旨在帮助学习者深入理解和应用这些核心概念。 链表是一种线性数据结构,与数组不同,它的元素在内存中不是连续存储的。链表由一...

    22道数据结构算法面试题.doc

    根据给定文件的信息,我们可以总结出以下数据结构与算法...以上是对文档中提到的几道数据结构和算法面试题的详细解析,每一道题目都给出了具体的代码实现和分析思路,这对于理解这些经典问题及其解决方法具有重要意义。

    数据库面试题数据库面试题.

    数据库面试题涵盖了数据库基础知识、数据结构、算法、面向对象编程、软件工程以及特定数据库系统(如Visual FoxPro和SQL)的使用等多个方面。以下是这些题目所涉及的关键知识点的详细解释: 1. **算法的执行效率与...

    数据结构面试题

    面试题可能涉及循环队列、优先级队列(堆)等。 5. **哈希表**:哈希表通过哈希函数将键映射到数组中的位置,提供快速的查找、插入和删除操作。面试中可能问到哈希冲突的解决方法(开放寻址法、链地址法等)。 6. ...

    面试管经常文的Matlab面试题算法矩阵详情加解答2023.docx

    以下是对这些常见面试题的详细解释: 1. 创建矩阵: 在Matlab中,矩阵是其核心数据结构。创建矩阵的方法多种多样,最简单的方式是直接通过方括号`[]`来定义。例如,创建一个2x2矩阵A,包含数字1到4,可以使用如下...

    算法面试题大全

    从给定的文件信息来看,我们探讨的主题是“算法面试题”,这在IT行业特别是软件开发领域是非常重要的一个环节。面试官通过算法题来评估应聘者的逻辑思维能力、编程技能以及解决问题的能力。以下是对给定内容中涉及的...

    C# 面试题及答案 C# 面试题及答案

    这些知识点涵盖了C#的基础语法、面向对象特性、Web开发以及算法等多个方面,对于理解和解答C#面试题至关重要。通过深入学习和实践,开发者可以更好地掌握C#编程,从而在面试和实际工作中表现出色。

    java中级面试题(自己汇总)

    "java中级面试题(自己汇总)" 本文总结了Java中级面试题,涵盖了集合、HashMap、HashSet、HashTable、ConcurrentHashMap、红黑树、Java 8对HashMap的优化、LinkedHashMap、TreeMap、IdentityHashMap等知识点。 ...

    C#面试题100例

    本资源提供了100多个C#面试题,涵盖了C#语言的各个方面,包括ASP.NET、委托、事件、索引器、排序算法等。这些题目可以帮助开发者更好地理解C#语言的特性和使用方法,并提高面试的通过率。 1. ASP.NET页面之间传递值...

    计算机常见算法面试题.pdf

    【链表操作:删除指定节点】 若已知一个指针指向链表中的某个节点,但不知道头节点,要删除该节点,需要将该节点的值复制给它的下一个节点,然后更新指针,最后释放原节点。如下: ```c void deleteNode(Link **...

    计算机常见算法面试题.docx

    【计算机常见算法面试题】涉及的是一些经典的C语言编程和算法问题,这些问题在面试中经常出现,对理解和掌握C语言以及基础算法至关重要。以下是对这些题目及其解法的详细解析: 1. **判断链表中是否有环**: 判断...

    .NET经典面试题(.NET面试集锦 全)

    本资源摘要信息涵盖了.NET经典面试题的知识点,涉及到C#语言、ASP.NET Web开发、面向对象编程、数据结构和算法等方面。 1. 访问权限修饰符 * private:私有成员,在类的内部才可以访问。 * protected:保护成员,...

Global site tag (gtag.js) - Google Analytics