`

一道阿里电话面试中的算法题

阅读更多

 

电话面试算法题一道:找出数组中重复次数最多的元素并打印

 

问题不难,看你能给出更优的方案

 

 

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;

import commons.algorithm.sort.QuickSort;

/**
 * 找出数组中重复次数最多的元素并打印
 *
 */
public class Problem_3 {
	
	//先快速排序后循环查找    O( n*log2(n) + n )
	public static void find1(int[] arr){
		
		QuickSort.sort(arr);
		
		
		int max = arr[0];
		int pre=1;
		int now=1;
		
		for(int i=0;i<(arr.length-1);i++){
			
			if(arr[i]==arr[i+1])
				now++;
			else {
				if(now>=pre){
					pre=now;
					now=1;
					max=arr[i];
				}	
			}
		}
		
		
		
	}
	
	//嵌套循环查找   O(n*n)
	public static void find2(int[] arr){
		

		int pre=0;
		int max=arr[0];
		
		for(int i=0;i<arr.length;i++){
			int now=0;
			for(int j=0;j<arr.length;j++){
				
				if(arr[i]==arr[j]) {
					now++;	
				}				
			}
			
			if(now>=pre){			
				max=arr[i];
				pre=now;			
			}
			
					
		}
		
	
		
	}
	
	//通过 Hash 方式
	public static void find3(int[] arr){
		HashMap<Integer,Integer> hm=new HashMap<Integer, Integer>();
		for(int i=0;i<arr.length;i++){
			if(hm.containsKey(arr[i])) {
				int count=hm.get(arr[i]);
				hm.put(arr[i], ++count);
			 
			}else{
				hm.put(arr[i],1);
			}
		}
		
		Iterator<Entry<Integer, Integer>> it=hm.entrySet().iterator();
		int pre=0;
		int max=arr[0];
		while(it.hasNext()) {
			Entry<Integer, Integer> en=it.next();
			int key=en.getKey();
			int val=en.getValue();
			if(val>pre){	
				pre=val;
				max=key;
			}
			
		}
		
	
		
	}
	public static  void main(String args[]){

		//数据量800 重复元素多,查找时候分别是:  46  3680  195
		int arr2[]={0,1,2,        .....       
				,0,1,2,3,6,7,8,9};
		
		//数据量800 重复元素少,查找时间分别是     82  3727  360
		int arr[]={0,0,0,11,12,13,14,5,6    ......     
		                ,51,52,53,,728,29,730,731,3,794,95,796,797,798,799};
		

		
		long start,end;
			
		start=System.currentTimeMillis();
		for(int i=0;i<1000;i++) find1(arr);
		end=System.currentTimeMillis();
		System.out.println(end-start);
		
		start=System.currentTimeMillis();
		for(int i=0;i<1000;i++) find2(arr);
		end=System.currentTimeMillis();
		System.out.println(end-start);
		
		
		start=System.currentTimeMillis();
		for(int i=0;i<1000;i++) find3(arr);
		end=System.currentTimeMillis();
		System.out.println(end-start);
		
	}
}
 
分享到:
评论
10 楼 rockis 2010-10-06  
不同的情况有不同的算法。听到这个问题后,应该首先确定数组中的元素是什么类型。是对象,基本类型还是字符串?
如果基本类型或者字符串,建一个hash表即可。如果是对象,还需要确定这个对象是否覆写了hashcode和equals方法。
9 楼 sam_chi 2010-10-06  
这道题应该主要是来考察哈希表的使用
8 楼 icanfly 2010-10-06  
codeparser 写道
terencewong 写道
you can consider hash. Key will be the value of the array element, and the duplicate time will be the value. The complexity will be O(n). Maybe you can do more research to make it in O(lgN).


应该是这个思路,因为它只要求记录最多的那个元素,可以在hash的时候,顺便记录下当前重复次数最多的元素。
有种情况是重复次数相同的时候,也需要记录下来,这样只需要扫描一遍数组就可以了。


有两个值有可能hash值一样,还得做一下判断!
7 楼 Lewis·Lee 2010-10-06  
terencewong 写道
you can consider hash. Key will be the value of the array element, and the duplicate time will be the value. The complexity will be O(n). Maybe you can do more research to make it in O(lgN).


赞成 “terencewong”!
6 楼 ywgoal 2010-10-06  
将该数组tostring(如果是对象则按照一定的规则tostring),然后取到数组里面的每个元素tostring后,到前面那个string中进行split,split后数组length最大的那个就是的了。
5 楼 codeparser 2010-10-06  
terencewong 写道
you can consider hash. Key will be the value of the array element, and the duplicate time will be the value. The complexity will be O(n). Maybe you can do more research to make it in O(lgN).


应该是这个思路,因为它只要求记录最多的那个元素,可以在hash的时候,顺便记录下当前重复次数最多的元素。
有种情况是重复次数相同的时候,也需要记录下来,这样只需要扫描一遍数组就可以了。
4 楼 terencewong 2010-10-06  
you can consider hash. Key will be the value of the array element, and the duplicate time will be the value. The complexity will be O(n). Maybe you can do more research to make it in O(lgN).
3 楼 mengtianheng 2010-10-06  
我觉的是不是可以多定义两个数组,一个放元素,一个放次数,不排序直接接受后对比,如果有了,对应另一个数组相应地方加1(初始0),没有则放到放元素的数组中,最后对比次数,元素也相应找到了。是不是和楼上想的一样,初学,不知道效率高不高。
2 楼 quxiaoyong 2010-10-06  
只想到了最普通的方法:遍历一次数组,用map把数组的值和出现的次数存放起来。然后比较。
1 楼 leves 2010-10-05  
感觉以上两种实现效率上并不高,因为紧张在电话里也没答好。。。

相关推荐

    高中数学如何解决阿里面试算法题

    今天跟大家分享一道阿里的算法面试题。 题目描述 给定一个正整数nnn,把它拆分为若干个数的和,记这若干个数的积为MMM,求MMM的最大值。 题目分析 这道题正常的思路是使用动态规划算法。 假设 dp[n]dp[n]dp[n] 为正...

    阿里技术《程序员面试宝典》

    这本书不仅提供了解题思路,还对每一道题目的不同解法进行了详尽的解析,有的题目甚至给出了多种解法,帮助读者开阔思维,理解算法的多样性。通过这些内容的学习,读者能够提升解决实际问题的能力,增加面试成功的...

    最新阿里算法(LeetCode)指南(文档和代码).zip

    5. 实战经验:分享阿里巴巴内部项目中的算法应用,以及面试过程中可能遇到的问题。 三、代码示例 配套的代码示例通常会以Python、Java、C++等主流编程语言编写,每个例子都会对应一个或多个LeetCode题目,旨在帮助...

    阿里各岗位技术面试题含答案最新.docx

    【阿里技术面试题解析】 ...以上是阿里集团不同职位的面试题解析,涉及了并发编程、网络编程、系统设计、数据结构、算法等多个领域的知识点。这些题目展示了阿里集团对于技术人才全面而深入的技术要求。

    选择文件 ( 阿里研发面试题2016最新.docx )

    总结起来,本文介绍了进程创建的基本概念,特别是`fork()`函数的工作方式,以及正则表达式的使用和匹配规则,同时涉及了一道逻辑推理题。对于研发面试来说,这些知识点涵盖了操作系统、编程基础和逻辑思维能力,都是...

    2023最新版大厂面试真题

    这份资料涵盖了百度、腾讯、阿里、华为、京东、美团、拼多多、携程、蚂蚁金服、唯品会、字节跳动、阿里云和哔哩哔哩(B站)等多家知名企业的面试题目。 首先,我们要明白这些大厂在面试时通常关注哪些方面: 1. ...

    阿里巴巴面试题leetcode-CharSimpleAlgorithm:字符串算法

    阿里巴巴面试题leetcode CharSimpleAlgorithm 字符串算法 WordConversion 该类是用于改变字母的大小写,使一...ps:该类的实际意义没有想到,是我在浏览LeetCode评论区的时候看到的一道阿里巴巴面试题,所以就实现了一下

    阿里巴巴笔试题打包

    5. 理解并认同阿里巴巴的企业文化,能够在面试中体现出自身价值观与企业文化的契合。 总之,要想在阿里巴巴的笔试中脱颖而出,就必须以全面的知识储备和充分的练习作为基础。无论对于在校学生还是社会人士,这都是...

    2012十月百度_阿里巴巴_迅雷_搜狗面试题

    这些面试题展示了面试者需要掌握的关键技能,包括但不限于算法分析、数据结构的应用、问题解决能力以及对基础理论的深入理解。在实际工作中,这些知识对于优化代码性能、解决复杂问题以及进行系统设计都至关重要。

    「面试算法练习等级攻略」-「LeetCode题解」-「剑指offer题解」_Java_下载.zip

    《面试算法练习等级攻略》- LeetCode 题解与《剑指Offer》题解 Java 版本 在准备IT行业的面试,特别是算法相关的职位时,LeetCode 和《剑指Offer》是两个不可或缺的资源。这份压缩包包含了这两个平台上的算法问题的...

    华为od社招python开发面试题.docx

    3. **算法题解答**:技术面试环节通常会有一道算法题,需在规定时间内完成。 - 建议策略:先快速理解题目要求,再构思解题思路,最后编码实现。 4. **沟通技巧**: - 在面试过程中保持自信,即使遇到不懂的问题也...

    阿里巴巴_java_研发成功笔面试总结.doc

    在职业发展的道路上,技术研发岗位的笔面试无疑是一道难关。对于许多技术研发者来说,能否在激烈的竞争中脱颖而出,往往取决于个人在笔面试中的表现。今天,我们分享的是一篇关于阿里巴巴Java研发岗位笔面试成功经验...

    阿里巴巴2014校园招聘笔试试题-软件研发工程+网友版答案.docx

    - 第19题:这是一道关于组合计数的问题,询问的是在一定条件下不同颜色球的组合数。 4. **系统负载与性能监控**: - 第22题:题目涉及系统负载的概念,指出了一分钟、五分钟和十五分钟的平均负载,负载越低说明...

    华为od社招python开发面试题.pdf

    3. **实战演练**:面试中可能会给出一道算法题供现场解答,通常时间为20分钟左右。 - **建议**:提前熟悉常见的数据结构与算法,提高解决问题的能力。 #### 六、综合建议 1. **技术积累**:不断学习新知识,提高...

    IT公司面试大全

    面试中,面试官通常会出一些算法题目,如排序、查找、图论、动态规划等。对于数据结构,链表、队列、栈、树、哈希表等的理解及其应用是考察的重点。熟练掌握这些基本功,能帮助你在解决问题时快速找到最优解。 六、...

    c++笔试题-多个大厂秋招笔试题库!

    本资源精心收录了多家知名企业(包括奇安信、贝壳找房、小米、游卡、vivo、阿里巴巴、爱奇艺、百度、猿辅导、中兴等)的C++方向笔试题,覆盖从2020年至2022年的秋招和校招题目。这些题目不仅考察了C++的基础知识,如...

    各个大的IT公司笔试真题汇总,值得一看.doc

    11. **面试经验**:除了笔试,如阿里巴巴的校园招聘试卷,也可能包含面试技巧和常见面试问题的讨论。 准备这些笔试的关键在于广泛学习和深入理解计算机科学的基本原理,同时保持对新技术的关注和实践。通过模拟题和...

    计算机学习经验谈

    - 谷歌等公司在面试时可能会考察系统设计能力和算法题解答能力。 3. **公司选择**: - 实习机会能够增加内部转正的可能性,因此选择一家理想的公司实习至关重要。 - 创业公司和大型企业各有优势,可根据个人职业...

    世界500强面试题.pdf

    第一篇 面试题 ................................................................................ 8 1.1. 简介 ................................................................................................

Global site tag (gtag.js) - Google Analytics