有一个已经排序的数组(升序),数组中可能有正数、负数或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;elsebreak;}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];elseresult = source[index-1];}else{if(index == source.length - 1 || Math.abs(source[index]) < source[index+1])result= source[index];elseresult = 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 欢迎关注

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

  1. Java学习手册:(数据结构与算法-数组)如何求绝对值最小的数?

    问题: 有一个升序排列的数组,数组中可能有正数.负数或0,求数组中元素的绝对值最小的数,例如,数组{-10,-5,-2,7,15,50},绝对值最小的是2. 方法一: 对于升序数组,求绝对值最小的数可 ...

  2. 面试题: 求绝对值最小的数

    题目: 有⼀个已经排好序的整数序列(升序,⽆重复项),序列中可能有正整数.负整数或者0,请 ⽤你认为最优的⽅法求序列中绝对值最⼩的数.**_要求不能使⽤顺序⽐较的⽅法(时间复杂 度需要⼩于 O(n) ...

  3. javascript:求绝对值最小的数

    问题来源:http://androidguy.blog.51cto.com/974126/1129543 有一个已经排序的数组(升序),数组中可能有正数.负数或0,求数组中元素的绝对值最小的数,要求, ...

  4. 如何求数组中绝对值最小的数?

    """ 有一个升序排列的数组,数组中可能有正数,负数或0,求数组中元素的绝对值最小的数.例如,数组[-10,-5,-2,7,15,50],该数组中绝对值最小的数是2 &q ...

  5. JSK-399 绝对值最小的数【大数】

    绝对值最小的数 输入 10 个数,找出其中绝对值最小的数,将它和最后一个数交换. 输入格式 输入一行包括 10 个绝对值不超过 1000 的整数. 输出格式 输出 10 个交换后的整数,答案输出在一行 ...

  6. 找出有序数组中绝对值最小的数

    假设数组是从小到大排序,数值可能为负数.0.正数. 思路一 可以一次性遍历一遍,找出绝对值最小值,此时时间复杂度为O(N),缺点是没有利用数组是有序的这一特点. int getMinAbs(int[] ...

  7. 【面试】求最大最小的数

    一.代码 package DR6;import java.util.Scanner;class EX10 {/*** @param args*/public static void main(Stri ...

  8. 历届试题 核桃的数量(3个数的最小公倍数),翻硬币(贪心),买不到的数目(在范围内暴力,找范围,最小公倍数是上界,最小的数是下界),兰顿蚂蚁(dfs,模拟)

    历届试题 核桃的数量 问题描述 小张是软件项目经理,他带领3个开发组.工期紧,今天都在加班呢.为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑).他的要求是: 各组的核桃数量必须相同 各组内必须能 ...

  9. (笔试题)将数组分成两组,使两组的和的差的绝对值最小

    题目: 数组中的数分为两组,给出一个算法,使得两个组的和的差的绝对值最小数组中的数的取值范围是0<x<100,元素个数也是大于0,小于100 比如a[]={2,4,5,6,7},得出的两组 ...

  10. 面试题45. 把数组排成最小的数

    题目: 面试题45. 把数组排成最小的数 题解: 1. 题解一: 2. 题解二: * 解题思路:* 先将整型数组转换成String数组,然后将String数组排序,最后将排好序的字符串数组拼接出来.关 ...

最新文章

  1. MySQL 报错 1055
  2. NUXT 入门第一课: 关于 Nuxt.js
  3. 解决ftp上传connection reset错误
  4. python生成xml文件工具_Python根据指定文件生成XML的方法
  5. 【模拟】【递归】电子表格(jzoj 2127)
  6. 第八章xgboost/lightGBM
  7. 专访uPlane陈宏强:手机遥控固定翼飞机还是蓝海
  8. Python求数独的补充
  9. 牛客网模拟笔试——膨胀的牛牛(JavaScript)
  10. win11系统正式版介绍
  11. ubuntu 如何确定虚拟机中的网关_如何在虚拟机中安装Kali Linux
  12. PreparedStatement 批处理
  13. java播放器_Java视频播放器的制作
  14. C# 自定义控件,日期时间选择输入插件
  15. 【多校训练】2021牛客多校第二场
  16. 2020年最好用的手机是哪一款_2020年值得入手的三款手机,性价比超高,网友:真香!...
  17. 详解滤波电路工作原理及相关参数计算
  18. ApowerMirror PJ教程
  19. 《数据结构》C语言版 严蔚敏版本 学习笔记
  20. Java中间件-Elasticsearch

热门文章

  1. 包包各部位名称图解_手袋包细节详解
  2. 如何创建lpar通过HMC/VIOS(动态加disk)
  3. 熊猫在线压缩图_回归图与熊猫和脾气暴躁
  4. vue调用摄像头pc+移动端
  5. uuctf-Unicorn shop----easy_web----CheckIN
  6. 增加linux vg 空间大小_Desperate struggle
  7. docker compose自定义IP报错ERROR: Pool overlaps with other one on this address space
  8. 在R语言中如何打开一般方法打不开的中文xls文件?
  9. IE和Firefox浏览器下javascript、CSS兼容性研究
  10. 一篇论文的正确格式是什么?