百度:求绝对值最小的数

简介:   我只是从网上搜集的,下面的代码或许有错误。   看了会Hadoop,和传华聊了会,他说,他们那三等奖8000,;打算要回宿舍了,不经意间看到了这个题,貌似简单,其实还是比较有难度的。   一段时间只能干一件事就行了。

  我只是从网上搜集的,下面的代码或许有错误。

  看了会Hadoop,和传华聊了会,他说,他们那三等奖8000,;打算要回宿舍了,不经意间看到了这个题,貌似简单,其实还是比较有难度的。

  一段时间只能干一件事就行了。

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

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

  有序列表查找显然二分啊,貌似对java的arrays和collections不是很熟。
    

private static int getMinAbsoluteValue(final int[] source) {
    int index = Arrays.binarySearch(source, 0);
    int insertPos = -1 - index;
    return index >= 0 ? 0
    : source[insertPos == source.length ? source.length - 1
    : insertPos];
}

  算法还有点问题,如果数组是{-20, -13, -4, 4, 77, 200},算法就只能求出一个值。当index < 0时,还应该比较下插入点附近的两个值,读者完全可以自己解决。

  那么上面的insertPos什么意思呢?请看笔者分解。

package com.jaky;
import java.util.*;
public class Quest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String[] colors = {"blue","red","green","yellow","orange","black"};
        
        Arrays.sort(colors);
        
        int s2=Arrays.binarySearch(colors, "orange");
        int s3=Arrays.binarySearch(colors, "violet");
        
        System.out.println(s2+""+s3);
    }

}

  输出结果为:3-6。violet在 colors数组中不存在,一直很纳闷为什么s3会等于-6 ,查看JDK API 才知道。  

  public static int binarySearch(byte[] a,byte key)使用二分搜索法来搜索指定的 byte 型数组,以获得指定的值。必须在进行此调用之前对数组进行排序(通过 sort(byte[]) 方法)。如果没有对数组进行排序,则结果是不确定的。如果数组包含多个带有指定值的元素,则无法保证找到的是哪一个。  参数:

  a - 要搜索的数组
  key - 要搜索的值
  返回:
  如果它包含在数组中,则返回搜索键的索引;否则返回 (-(插入点) - 1)。插入点 被定义为将键插入数组的那一点:即第一个大于此键的元素索引,如果数组中的所有元素都小于指定的键,则为 a.length。注意,这保证了当且仅当此键被找到时,返回的值将 >= 0。

  好了,写完了,回宿舍睡觉吧。

  走在路上我想起来我忘了加参考文献,特此声明:来源于推酷(一个爬虫网站,没有原文链接)和csdn(在实验室电脑上,可惜历史记录清除了),在此表示感谢。睡啦睡啦···

目录
相关文章
|
10月前
leetcode-2006:差的绝对值为 K 的数对数目
leetcode-2006:差的绝对值为 K 的数对数目
77 0
|
Python
LeetCode 2006. 差的绝对值为 K 的数对数目
给你一个整数数组 nums 和一个整数 k ,请你返回数对 (i, j) 的数目,满足 i < j 且 |nums[i] - nums[j]| == k 。
107 0
LeetCode 1343. 大小为 K 且平均值大于等于阈值的子数组数目
LeetCode 1343. 大小为 K 且平均值大于等于阈值的子数组数目
|
机器学习/深度学习 容器
LeetCode 最接近的三个数之和
本题和盛水最多的容器这个题目非常的类似,我就不做过多的铺垫了,我们一起来看题目和我的解题思路吧。
169 0
|
9月前
每日一题 2006. 差的绝对值为 K 的数对数目
每日一题 2006. 差的绝对值为 K 的数对数目
|
算法 Java C语言
LeetCode刷题2006-简单-差的绝对值为 K 的数对数目
LeetCode刷题2006-简单-差的绝对值为 K 的数对数目
153 0
LeetCode刷题2006-简单-差的绝对值为 K 的数对数目
|
机器学习/深度学习
欧拉函数:求小于等于n且与n互质的数的个数
求小于等于n且与n互质的数的个数 互质穷举法 互质:两个数互质代表两者最大公约数为1 最大公约数求法:辗转相除法,最小公倍数:较大值除以最大公约数乘以较小值 辗转相除法: 较大的数a取模较小的数b,得取模值c 若取模值等于0 则最大公约数为取模值,否则继续下一步 a与c再次取模,回到第二步 //求最大公约数gcd以及最大公倍数lcm // 36 24 36/24 // 24 12 24/12 // 0 结束最大公约数为12 // 求最小公倍数 // lcm(a, b) = (a * b)/g
199 0
给出任意一个正整数,算出大于它的最小不重复数——最高效[2014百度笔试题]
<p>程序很简单,一看就懂,我就不多介绍了,直接上代码。</p> <p></p> <pre code_snippet_id="191807" snippet_file_name="blog_20140217_1_7068119" name="code" class="cpp">/** * 给出任意一个正整数,算出大于它的最小不重复数(即不存在相邻两个数相同的情况) */ #inclu
1498 0