百度面试题:求绝对值最小的数

有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现

例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4。

算法实现的基本思路

找到负数和正数的分界点,如果正好是0就是它了,如果是正数,再和左面相邻的负数绝对值比较,如果是负数,取取绝对值与右面正数比较。还要考虑数组只有正数或负数的情况。

我根据这个思路用Java简单实现了一个算法。大家有更好的实现方法欢迎跟帖

public class MinAbsoluteValue
{
    private static int getMinAbsoluteValue(int[] source)
    {

    	int index = 0;
    	int result = 0;
    	int startIndex = 0;
    	int endIndex = source.length - 1;
        //  计算负数和正数的分界点
    	while(true)
    	{
    		index = startIndex + (endIndex - startIndex) / 2;
    		result = source[index];
    		if(result==0)
    		{
    			return 0;
    		}
    		else if(result > 0)
    		{
    			if(index == 0)
    			{
    				break;
    			}
    			if(source[index-1] >0)
    				endIndex = index - 1;
    			else if(source[index-1] ==0)
    				return 0;
    			else
    				break;
    		}
    		else
    		{
    			if(index == endIndex)
    				break;
    			if(source[index + 1] < 0)
    				startIndex = index + 1;
    			else if(source[index + 1] == 0)
    				return 0;
    			else
    				break;
    		}
    	}
    	//  根据分界点计算绝对值最小的数
    	if(source[index] > 0)
    	{
    		if(index == 0 || source[index] < Math.abs(source[index-1]))
    			result= source[index];
    		else
    			result = source[index-1];
    	}
    	else
    	{
    		if(index == source.length - 1 || Math.abs(source[index]) < source[index+1])
    			result= source[index];
    		else
    			result = source[index+1];
    	}

    	return result;
    }
	public static void main(String[] args) throws Exception
	{

		int[] arr1 = new int[]{-23,-22,-3,-2,1,2,3,5,20,120};
		int[] arr2 = new int[]{-23,-22,-12,-6,-4};
		int[] arr3 = new int[]{1,22,33,55,66,333};
		int value = getMinAbsoluteValue(arr1);
		System.out.println(value);
		value = getMinAbsoluteValue(arr2);
		System.out.println(value);
		value = getMinAbsoluteValue(arr3);
		System.out.println(value);
	}
}

李宁的新浪微博 http://weibo.com/androidguy 欢迎关注

时间: 2024-10-29 08:19:03

百度面试题:求绝对值最小的数的相关文章

百度:求绝对值最小的数

我只是从网上搜集的,下面的代码或许有错误. 看了会Hadoop,和传华聊了会,他说,他们那三等奖8000,:打算要回宿舍了,不经意间看到了这个题,貌似简单,其实还是比较有难度的. 一段时间只能干一件事就行了. 有一个已经排序的数组(升序),数组中可能有正数.负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现,例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4.  算法实现的基本思路:找到负数和正数的分界点

javascript中求绝对值最小的数

有一个已经排序的数组(升序),数组中可能有正数.负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4. 问题分解: 第一步:二分法寻找改变符号的位置(0视为正数) 第二步:比较位置左右数字的绝对值大小,取较小的那一个 <script language="javascript"> var getBound = function(a,fr,

百度面试题:求一个已排序的数组中绝对值最小的元素

题目为: 有一个已经排序的数组(升序),数组中可能有正数.负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现 例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4. 这一题该如何求呢? 初步的解决思路是:     1.数组中的元素全为正,取最左边的数字:     2.数组中的元素全为负,取最右边的数字的绝对值:     3.数组中有正数有负数,就用二分法查找,判断中间元素的符号        a)中间元素为

[经典面试题]排序数组中绝对值最小元素

[题目] 题目为: 有一个已经排序的数组(升序),数组中可能有正数.负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现 例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4. [分析] 给定数组是已经排好序的,且是升序,没有重复元素. 一个简单的思路,就是一次性遍历数组,求出数组的元素的绝对值的最小值,这样的时间复杂度为O(n). 但是,这样就浪费了题目的一个条件:数组是已经排好序的.所以,需要对原来的题目

百度面试题

百度面试题,仅提供一些参考.   1 完成函数 size_t foo(unsigned int *a1, size_t al1, unsigned int* a2, size_t al2) 其中a1和a2都为无符号数组,al1和al2为数组的长度,数组的长度为偶数. 无符号数组由一对数字区间组成. 如下例: a1 为 0,1,3,6,10,20 a2 为 0,1,20,50,4,5 则 a1表示以下区间[0,1] [3,6] [10,20] a2表示以下区间[0,1] [20,50] [4,5]

java基础高手看这里了,这几道基础性的面试题求解答。

问题描述 java基础高手看这里了,这几道基础性的面试题求解答. 同学出去应聘,笔试的时候遇到这几道基础题不会做,拿给我看,发现自己也不怎么会,java基础好多都有些忘了,来帮忙解答一下吧. 1.实现一个函数,函数有一个形参,类型为整数,功能是将形参的十进制数的二进制序列打印到控制台上. 2.实现一个函数,函数有一个形参,类型为集合,功能是将集合中的内容按照每行3个输出(写出两种以上方法). 3.有数据表,字段定义为如下: 客户 商品 报价 报价日期 表中存放着不同客户,不同商品,不同日期的报价

剑指offer系列之三十一:把数组排成最小的数

题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 根据结果判断,所谓最小的数字实际上就是对数组中所有元素的一个组合.一种笨拙的方法是求出所有元素的全排列,然后对所有排列的值的大小进行排序,那么就可以得到最小的数了.求全排列的算法已经在之前的文章中提到.那么是不是还有其他思路呢?联想到Java库函数中有一个sort方法,是不是可以直接使用呢?(该sort方法的时

java类的问题-java基础高手看这里了,这几道基础性的面试题求解答。

问题描述 java基础高手看这里了,这几道基础性的面试题求解答. 编制父类Shape:包括普通成员变量图形的行数.列数:图形开始绘制的列数:静态变量图形个数:以及方法绘制图形: 编写两个子类:菱形和矩形,这两个子类继承父类中的绘制图形方法,即在控制台中输出菱形或矩形(根据构造函数中给出的行.列): 验证上述要求,使得屏幕上显示多个图形,并且输出图形的个数. 解决方案 你应该先贴出你的代码,有问题的话大家讨论,直接让人做题不好吧. 解决方案二: abstract class Shape { pub

java基础高手看这里了,这道基础性的试题求解答

问题描述 java基础高手看这里了,这道基础性的试题求解答 编制父类Shape:包括普通成员变量图形的行数.列数:图形开始绘制的列数:静态变量图形个数:以及方法绘制图形: 编写两个子类:菱形和矩形,这两个子类继承父类中的绘制图形方法,即在控制台中输出菱形或矩形(根据构造函数中给出的行.列): 验证上述要求,使得屏幕上显示多个图形,并且输出图形的个数. 解决方案 class Shape { public int rows; public int columns; public int maginc