博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
百度面试题:求绝对值最小的数
阅读量:7231 次
发布时间:2019-06-29

本文共 1754 字,大约阅读时间需要 5 分钟。

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

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

算法实现的基本思路

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

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

 
  1. public class MinAbsoluteValue 
  2.     private static int getMinAbsoluteValue(int[] source) 
  3.     { 
  4.           
  5.         int index = 0
  6.         int result = 0;  
  7.         int startIndex = 0
  8.         int endIndex = source.length - 1
  9.         //  计算负数和正数分界点 
  10.         while(true
  11.         {              //  计算当前的索引 
  12.             index = startIndex + (endIndex - startIndex) / 2
  13.             result = source[index];<br>                //  如果等于0,就直接返回了,0肯定是绝对值最小的 
  14.             if(result==0
  15.             { 
  16.                 return 0
  17.             }              //  如果值大于0,处理当前位置左侧区域,因为负数肯定在左侧 
  18.             else if(result > 0
  19.             { 
  20.                 if(index == 0
  21.                 { 
  22.                     break
  23.                 } 
  24.                 if(source[index-1] >0
  25.                     endIndex = index - 1
  26.                 else if(source[index-1] ==0
  27.                     return 0
  28.                 else 
  29.                     break
  30.             }               //  如果小于0,处理当前位置右侧的区域,因为正数肯定在右侧的位置 
  31.             else 
  32.             { 
  33.                 if(index == endIndex) 
  34.                     break
  35.                 if(source[index + 1] < 0
  36.                     startIndex = index + 1
  37.                 else if(source[index + 1] == 0
  38.                     return 0
  39.                 else 
  40.                     break
  41.             } 
  42.         } 
  43.         //  根据分界点计算绝对值最小的数 
  44.         if(source[index] > 0
  45.         { 
  46.             if(index == 0 || source[index] < Math.abs(source[index-1])) 
  47.                 result= source[index]; 
  48.             else 
  49.                 result = source[index-1]; 
  50.         } 
  51.         else 
  52.         { 
  53.             if(index == source.length - 1 || Math.abs(source[index]) < source[index+1]) 
  54.                 result= source[index]; 
  55.             else 
  56.                 result = source[index+1]; 
  57.         } 
  58.           
  59.           
  60.         return result; 
  61.     } 
  62.     public static void main(String[] args) throws Exception 
  63.     { 
  64.           
  65.         int[] arr1 = new int[]{-23,-22,-3,-2,1,2,3,5,20,120}; 
  66.         int[] arr2 = new int[]{-23,-22,-12,-6,-4}; 
  67.         int[] arr3 = new int[]{
    1,22,33,55,66,333}; 
  68.         int value = getMinAbsoluteValue(arr1); 
  69.         System.out.println(value); 
  70.         value = getMinAbsoluteValue(arr2); 
  71.         System.out.println(value); 
  72.         value = getMinAbsoluteValue(arr3); 
  73.         System.out.println(value); 
  74.     } 

上面的代码分别输出1、-4和1

 本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/1129543如需转载请自行联系原作者

你可能感兴趣的文章
KgMall B2B/B2B2c/C2C版店铺商号初始化
查看>>
Linux内核的ioctl函数学习
查看>>
Liunx Shell入门
查看>>
Thread的中断
查看>>
linux --- 内存管理
查看>>
PostgreSQL
查看>>
CPU 超线程、多核
查看>>
用ASCII码显示string.xml中的特殊字符
查看>>
网站301跳转到新域名
查看>>
codewars020: The Clockwise Spiral 数字顺时针螺旋矩阵
查看>>
ios 下拉刷新
查看>>
Django在Windows系统下的安装配置
查看>>
懒到极致:对mybatis的进一步精简
查看>>
Android学习之OTA Update
查看>>
Maven Multi-environment package
查看>>
JMM-java内存模型
查看>>
iOS的soap应用(webservice) 开发
查看>>
Delphi listview 点击列头排序
查看>>
android preference page
查看>>
mysql索引挑选
查看>>