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

题目为:

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

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

这一题该如何求呢?

初步的解决思路是:

    1.数组中的元素全为正,取最左边的数字;

    2.数组中的元素全为负,取最右边的数字的绝对值;

 
  3.数组中有正数有负数,就用二分法查找,判断中间元素的符号

 
     a)中间元素为正,继续判断中间元素前面一个元素的符号

 
     b)中间元素为负,判断中间元素后一个元素的符号

 
     c)中间元素为零,令其等于结果值返回

下面是根据上面的想法的代码实现,应该还会有漏洞

#include "stdafx.h"
#include <iostream>

using namespace std;

//求取数组中绝对值最小的数字
int minAbsolute(int arr[],int size);
//返回两个数中较小的数
int compare(int a,int b);
int _tmain(int argc, _TCHAR* argv[])
{
	int a[10] = {-10,-8,-5,-3,2,5,8,9,11,15};
	int size = sizeof(a)/sizeof(int);
	int result = minAbsolute(a,size);
	cout<<"绝对值最小的数是:"<<result<<endl;
	return 0;
}

int minAbsolute(int arr[],int size)
{
	int first,last,mid;
	first = 0;
	last = size - 1;
	int result;

	//数组中的数全是负数,取最右边的数
	if (arr[0] < 0 && arr[size-1] < 0)
	{
		result = arr[size-1];
	}
	//数组中的数全是正数,取最左边的数
	else if (arr[0] > 0 && arr[size-1] > 0)
	{
		result = arr[0];
	}
	//数组有正有负,二分查找
	else
	{
		while(first < last)
		{
			int mid = (first + last)/2;
			if (arr[mid] > 0)
			{
				if (arr[mid - 1] > 0)
				{
					last = mid - 1;
				}
				else if(arr[mid - 1] < 0)
				{
					result = compare(-arr[mid - 1],arr[mid]);
					break;
				}
				else
				{
					result = arr[mid - 1];
					break;
				}
			}
			else if (arr[mid] < 0)
			{
				if (arr[mid + 1] < 0)
				{
					first = mid + 1;
				}
				else if (arr[mid + 1] > 0)
				{
					result = compare(-arr[mid],arr[mid+1]);
					break;
				}
				else
				{
					result = arr[mid + 1];
					break;
				}
			}
			else
			{
				result = arr[mid];
				break;
			}
		}
	}
	return result;
}

int compare(int a,int b)
{
	if (a > b)
	{
		return b;
	}
	else
	{
		return a;
	}
}
时间: 2024-12-27 20:18:53

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

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

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

LeetCode 26 Remove Duplicates from Sorted Array(从已排序数组中移除重复元素)

翻译 给定一个已排序的数组,删除重复的元素,这样每个元素只出现一次,并且返回新的数组长度. 不允许为另一个数组使用额外的空间,你必须就地以常量空间执行这个操作. 例如, 给定输入数组为 [1,1,2] 你的函数应该返回length = 2, 其前两个元素分别是1和2.它不关心你离开后的新长度. 原文 Given a sorted array, remove the duplicates in place such that each element appear only once and re

任意元素和-求一个数组中选出任意个数元素相加之和,求大神指教

问题描述 求一个数组中选出任意个数元素相加之和,求大神指教 求一个数组中选出任意个数元素相加之和,求大神指教 比如打印出arry[8]中,任意两个数相加的和,任意三个数相加的和,直到任意八个数相加的和. 求大神指教. 解决方案 不知道你用的什么语言 如果C#,参考我写的http://bbs.csdn.net/topics/390550326 这个问题其实就是求M选N,其中M=8,N循环1-8 然后得到每个组合再求和. 解决方案二: 不知道你使用的是什么语言,不过思路是这样的,你的要求是不是随机数

求一个能在网页游戏中画板使用的自动画画的软件。。。。

问题描述 求一个能在网页游戏中画板使用的自动画画的软件.... 解决方案 解决方案二:我是小白.我什么都不会.大家帮帮我呗解决方案三:我玩那个游戏是开心宝贝.特别幼稚的游戏.嘻嘻解决方案四:photoShop解决方案五:好使吗?那个不是做图片的么.怎么能用到游戏里呢.求用法

Java求数组中连续n个元素使其和最大

给定一个数组,求出数组中连续的一些元素使其和的值最大.如果所有元素都为正数,显然整个数组即为所求的.如果所有元素的值为负数,则所求的最大值为0. 这是在编程珠玑上看到的,其时间复杂度由O(n3)减为O(n)了. java代码 package cn.lifx.test; public class MaxSum { public static void main(String[] args) { int[] arr = new int[]{31, -41, 59, 26, -53, 58, 97,

一个标签从标签数组中取值方法实现

问题描述 一个标签从标签数组中取值的两种方法实现.一种方法是按标签出次的次数取值按出现.String[]add={"北京","上海","四川","四川","北京","四川"};"地址":"四川";还有一个方法是按权重进行显示String[]add={"北京","上海","四川","

系统给出一个数组,一个值,在数组中怎么找出同样的对象

问题描述 系统给出一个数组,一个值,在数组中怎么找出同样的对象?并完成以下程序publicIntegershow(ArrayListvaluelistintvalue){} 解决方案 解决方案二:如果是已经排序的,可以用2分法查找.解决方案三:应该是:publicIntegershow(ArrayListvaluelist,intvalue){}解决方案四:value不是对象,你要找的应该是valuelist对象列表里与value值相等的对象,便利一下list列表,booleanisExist=

javascript中判断一个值是否在数组中并没有直接使用_基础知识

在JS中要判断一个值是否在数组中并没有函数直接使用,如PHP中就有in_array()这个函数.但我们可以写一个类似in_array()函数来判断是一个值否在函数中 例1 复制代码 代码如下: /* * * 判断在数组中是否含有给定的一个变量值 * 参数: * needle:需要查询的值 * haystack:被查询的数组 * 在haystack中查询needle是否存在,如果找到返回true,否则返回false. * 此函数只能对字符和数字有效 * */ function findnum(){

js in_array判断一个值是否在数组中

例1  代码如下 复制代码 function in_array(stringToSearch, arrayToSearch) {  for (s = 0; s < arrayToSearch.length; s++) {   thisEntry = arrayToSearch[s].toString();   if (thisEntry == stringToSearch) {    return true;   }  }  return false; } 例2  代码如下 复制代码 var a