`

一道经典的Google算法题

阅读更多

      这是一道google的比较经典算法题,题目是:已经两个已经排好序的数组,找出两个数组合起来的中间大的数字。要求算法复杂度尽可能低。如:x数组:1,7,9,10,30    y数组:3,5,8,11    则中间大数为:8

 

     下面是我自己想的算法。 

 

public class GetMiddleValue 
{
	public static void main(String[] args)
	{
		int[] a = {1, 7, 9, 10, 30};
		int[] b = {3, 5, 8, 11};
		
		getMiddleValue(a, b);
		
		getMiddleValue2(a, b);
	}
	
	public static void getMiddleValue(int[] a, int[] b)
	{
		int n = (a.length + b.length + 1)/2;
		
		int i = 0;
		int j = 0;
		int sum = 0;
		int middle = 0;
		boolean flag = true;
		
		while(i < a.length && j < b.length)
		{
			if(a[i] <= b[j])
			{
				i++;
				middle = a[i-1];
			}
			else
			{
				j++;
				middle = b[j-1];
			}
			
			sum++;
			if(sum == n)
			{
				System.out.println("The middle number is : " + middle);
				
				flag = false;
				break;
			}
		}
		
		if(flag)
		{
			if(i == a.length)
			{
				while(sum < n)
				{
					j++;
					sum++;
				}
					
				middle = b[j-1];
			}
			else
			{
				while(sum < n)
				{
					i++;
					sum++;
				}
				
				middle = a[i-1];
			}
			
			System.out.println("The middle number is : " + middle);
		}
	}
	
	public static void getMiddleValue2(int[] a, int[] b)
	{
		int n = (a.length + b.length + 1)/2;
		
		int i = 0;
		int j = 0;
		int middle = 0;
		
		while(i < a.length && j < b.length && n > 0)
		{
			if(a[i] <= b[j])
			{
				i++;
				middle = a[i-1];
			}
			else
			{
				j++;
				middle = b[j-1];
			}
			
			n--;
		}
		
		if(n == 0)
		{
			System.out.println("The middle number is : " + middle);
		}
		else
		{
			if(i == a.length)
			{
				while(n > 0)
				{
					j++;
					n--;
				}
					
				middle = b[j-1];
			}
			else
			{
				while(n > 0)
				{
					i++;
					n--;
				}
				
				middle = a[i-1];
			}
			
			System.out.println("The middle number is : " + middle);		}
	}
}

//算法说明
//若两个数组合并起来有奇数个数,如9个, 则第5个为中间那个数
//若两个数组合并起来有偶数个数,如10个,则第5个为中间那个数

 

1
2
分享到:
评论
5 楼 蔡华江 2010-09-19  
楼主的思路算法应该是最优的,就是怎么写的这么臃肿,还可以优化 
4 楼 tangchj 2010-04-22  
这是我写的算法,看符不符合楼主要求,时间复杂度两数组长度之和
public class Test {

//这是一道google的比较经典算法题,题目是:已经两个已经排好序的数组,
//找出两个数组合起来的中间大的数字。要求算法复杂度尽可能低。
//如:x数组:1,7,9,10,30    y数组:3,5,8,11    则中间大数为:8
//算法说明  
//若两个数组合并起来有奇数个数,如9个, 则第5个为中间那个数  
//若两个数组合并起来有偶数个数,如10个,则第5个为中间那个数 
public static void main(String[] args) {
//int[] a = {1,7,9,10,30};
//int[] b = {3,5,8,11};
// int[] a = {1,2,3};
// int[] b = {4,5,6,7};
int[] a = {1,3,8};
int[] b = {4,5,6,7};
int[] c = new int[a.length+b.length];
int p1 = 0;
int p2 = 0;
for(int i=0;i<a.length+b.length;i++){
if(p1==a.length&&p2<b.length){
while(p2<b.length){
c[i] = b[p2];
i++;
p2++;
}
break;
}
if(p1<a.length&&p2==b.length){
while(p1<a.length){
c[i] = a[p1];
i++;
p1++;
}
break;
}
if(p1>=a.length&&p2>=b.length){
break;
}
if(a[p1]<=b[p2]){
c[i] = a[p1];
p1++;
}else{
c[i] = b[p2];
p2++;
}
}
for(int i=0;i<c.length;i++){
System.out.println(c[i]+",");
}
System.out.println("中间数:"+c[(c.length-1)/2]);
}

}
3 楼 jasstion 2009-09-24  
seasun 写道
我的想法是这样的,先得出第一组的中间数,然后再同第二组的数据对比大小

请问有官方答案吗?

你的想法可定不对,第一组的中间数不一定是组合后数据的中间数,你直接在申明一个数据能够存储两个数组,然后对其排序后,不久很容易得到中间的较大的数拉么?
2 楼 yoyo08 2009-07-06  
seasun 写道

我的想法是这样的,先得出第一组的中间数,然后再同第二组的数据对比大小 请问有官方答案吗?

官方答案不知道 你的想法具体怎么样?
假如A={1,2,3},B={4,5,6,7},怎么比较?
或者A={1,3,8},B={4,5,6,7},又怎么比较?
1 楼 seasun 2009-07-06  
我的想法是这样的,先得出第一组的中间数,然后再同第二组的数据对比大小

请问有官方答案吗?

相关推荐

    AB序列 O(N^2)实现 算法题

    AB序列,是一道经典的算法题。可以google搜索“AB”序列。 这儿是Java实现代码

    Google 算法真题 20201

    在本文中,我们将探讨Google公司在2020年面试中出现的一些算法题目,包括在线评估(OA)、电话面试(电面)以及现场面试(Onsite)的问题。这些问题涵盖了动态规划(DP)、字符串处理、模拟、数据结构优化等多个方面...

    一道 Google 竞赛题的解法

    这道Google竞赛题目是关于在一个字母网格中寻找给定单词的路径数量的问题。题目要求从网格中的任何位置开始,沿着上、下、左、右或对角线方向移动,可以重复使用网格中的字母,但不能连续停留在同一格子内。目标是...

    Google经典面试21题

    根据给定的信息,我们可以将这些经典的Google面试题分解为几个主要的知识点进行详细的解析: ### 1. 解密等式问题 **知识点:** - 数学逻辑与代数方程求解 - 字符串处理与算法设计 **解析:** 这道题目要求解一个...

    2012谷歌笔试题

    谷歌笔试题很可能会包含一系列复杂度分析、排序算法(如快速排序、归并排序)、查找算法(如二分查找)、链表操作、树和图的遍历等问题。例如,一道典型的题目可能是要求实现一个高效的数据结构来存储和查询大量数据...

    google百度北电华为腾讯试题及面试

    算法题: 1.连接两个单向链表,返回排序后的结果。 2.一个保存有10000个URL的文本文件,删除其中相同的URL。 3.将9个石子放在9x9的方格中,要求同行、同列、45度上无两个石子。 智力题: 。。。。。 网易笔试...

    google面试题及答案

    - **分析与解答**:这是一道经典的递归逻辑推理题。假设只有1位丈夫偷情,那么这位丈夫的妻子在听到女头领的声明后,发现没有其他丈夫偷情,即可确定是自己的丈夫,于是当天将其杀害。如果存在2位丈夫偷情,则他们的...

    程序员面试金典-卷二

    应对棘手算法题的5种行之有效的方法通过这5种方法,你可以学会如何处理并攻克算法难题,包括那些最棘手的算法题。面试者最容易犯的10个错误不要因为这些常见的错误而与成功失之交臂。要了解面试者常犯的一些错误,...

    Google中国编程大赛入围赛真题

    首先,"Google750.doc"的命名可能暗示了这是一道具有750分难度的题目,通常这样的高分题目会涉及到更为复杂的数据结构与算法。可能的知识点包括: 1. **深度优先搜索(DFS)** 和 **广度优先搜索(BFS)**:这两种图...

    java_leetcode:java_leetcode 项目主要使用 java 刷 leetcode 的算法题,并作整理与总结

    java_leetcodeLeetCode 成为 Google 筛选码工的重要途径之一,可见 LeetCode 上面的题的重要性,因此开个项目,每周来刷一道题。通过刷题,更好的学习算法。算法算法对于我们的逻辑思维的锻炼是非常重要的,虽然知道...

    google笔试题

    【谷歌笔试题】是针对求职者,特别是对 IT 相关职位感兴趣的人群设计的一系列测试,用于评估应聘者的编程能力、逻辑思维、问题解决技巧以及计算机科学基础知识。以下是题目中涉及的一些知识点: 1. **链表与数组的...

    google面试题 面试

    这是一道经典的优化问题,可以用二分查找的思想来解决。目标是找到一个临界高度,使得玻璃球落下后会破碎。我们用较小的球进行实验,从第1层开始,逐步向上层推进。 1. 将楼层范围设定为 [1, 100]。 2. 使用二分...

    程序员面试金典-卷一

    应对棘手算法题的5种行之有效的方法通过这5种方法,你可以学会如何处理并攻克算法难题,包括那些最棘手的算法题。面试者最容易犯的10个错误不要因为这些常见的错误而与成功失之交臂。要了解面试者常犯的一些错误,...

    软件水平考试《程序员》习题及答案.docx

    这是一道广为流传的google面试题,考察了应聘者的算法设计和编程能力。 知识点11:数据结构 在解决问题时,需要了解数据结构的概念,如数组、链表、树等,以便更好地设计算法和编写程序。 知识点12:问题分析 在...

    Java 面经手册.docx

    在书中提到的例子中,2004年Google的招聘广告就是一个很好的展示,它要求求职者解决一道涉及数学和编程的问题,寻找自然对数底e中的前10位质数。这个问题涉及到计算e的值,可能需要用到泰勒公式以及数论中的筛法,如...

    南开上级一百题国三数据库

    《南开上级一百题国三数据库》是一份针对国家三级(国三)数据库考试精心编纂的练习集,其中包含了众多经典题目和解决方案。这份资料的重要性在于它为备考者提供了全面且具有针对性的训练,有助于提升考生在数据库...

    GymTeacherGame:一道招聘程序题

    《GymTeacherGame: 一道招聘程序题》 在编程面试和招聘过程中,设计和解决算法问题是一项重要的考察环节。GymTeacherGame 是一个典型的面试题目,它涉及到C++编程语言,旨在测试候选人的逻辑思维、数据结构以及算法...

    程序员面试题精选100题

    本文档提供了一道经典的微软面试题——如何将一棵二元查找树转换成一个排序的双向链表。这道题不仅考察了应聘者对于数据结构的理解,还考验了解决问题的能力。 **题目描述:** 给定一棵二元查找树,目标是将它转换...

Global site tag (gtag.js) - Google Analytics