百度:求绝对值最小的数

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

  看了会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(在实验室电脑上,可惜历史记录清除了),在此表示感谢。睡啦睡啦···

时间: 2024-09-29 01:38:58

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

偶然在博客中见对百度一个面试题的探讨,写些自己的看法以及指出探讨中不对的观点:百度面试题:求绝对值最小的数 有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现 例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4。

今天申请了博客园账号,在下班后阅览博客时发现了一个关于百度面试题探讨的博客(其实是个很基础的问题),此博客url为:http://www.blogjava.net/nokiaguy/archive/2013/01/30/394920.html 其中下面有人评论为: 有序列表查找显然二分啊,博主貌似对java的arrays和collections不是很熟. private static int getMinAbsoluteValue(final int[] source) { int index

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

问题: 一个有序数组,值有可能有负值,也有可能没有,现需要找出其中绝对值最小的值. 方法1: 遍历数组,找到绝对值最小值,时间复杂度O(n),n为元素个数. 方法2: 二分查找,因为数组有序,可以利用二分查找,时间复杂度O(logn). 分析步骤: 如果第一个数为正数,说明整个数组没有负数,直接返回第一个数 如果最后一个数为负数,说明整个数组没有正数,直接返回最后一个数 数组元素有正有负,说明绝对值最小的元素肯定在正负数交界处,需要二分查找上场: 如果a[mid]<0,因为数组是升序,说明绝对值

含有n个元素的整型数组,将这个n个元素重新组合,求出最小的数,如{321,3,32},最小的数为321323

public class GetMinNumber { public static void main(String[] args) { String[] arr = null; System.out.println("输入一行待处理的整型数据,并以逗号隔开:"); Scanner input = new Scanner(System.in); arr = input.nextLine().split(","); sort(arr); for(String s :

输入10个数,找出其中绝对值最小的数,将它和最后一个数交换,然后输出这10个数。

题目描述 输入 十个数 输出 交换后的十个数 样例输入 10 2 30 40 50 60 70 80 90 100 样例输出 10 100 30 40 50 60 70 80 90 2 1 #include<stdio.h> 2 void fun_A(); 3 int abs(int n); 4 void swap(int *,int *); 5 int main() 6 { 7 fun_A(); 8 return 0; 9 } 10 void fun_A() 11 { 12 const in

求数组中绝对值最小的元素

给定一个有序数组a(从小到大排列),数组中的数据有正有负,找出这个数组中的绝对值最小的元素.最先到的自然是从头到尾依次遍历数组中的每个元素,找出绝对值最小的元素.这是最简单的方法,不过它并没有用到数组有序这个特性,现在我们来看看有没有更好的方法.题目要求在数组中查找元素,并且此数组有序,那么可以想到用二分法来处理. 首先我们先看一下如果数组中元素全部为正数或者全部为负数的情况: 如果a[0]>0,那么数组中所有元素均为正数,则a[0]为绝对值最小的元素 如果a[len-1]<0,那么数组中所有

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

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

整数数组中两两之差绝对值最小的值

题目1: 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数. 题目2:请求出最小连续子序列绝对值和,也就是求连续子序列之和的绝对值最小值 针对问题1: 方法<1>:暴力的方式.遍历所有的两个数的差,记录最小值.算法的复杂度O(n2) 方法<2>:两个数要想差的绝对值最小,肯定是需要两个数大小相近.故有思路:先对数组进行排序,然后遍历一遍,相邻的数相减,记录绝对值最小的数. 方法<3>:将现在的问题进行转化: 设这个整数数组是a

绝对值最小

题目描述:  给你一个数组A[n],请你计算出ans=min(|A[i]+A[j]|)(0<=i,j<n). 例如:A={1, 4, -3}, 则: |A[0] + A[0]| = |1 + 1| = 2. |A[0] + A[1]| = |1 + 4| = 5. |A[0] + A[2]| = |1 + (-3)| = 2. |A[1] + A[1]| = |4 + 4| = 8. |A[1] + A[2]| = |4 + (-3)| = 1. |A[2] + A[2]| = |(-3)

CSDN挑战编程——《绝对值最小》

绝对值最小 题目详情: 给你一个数组A[n],请你计算出ans=min(|A[i]+A[j]|)(0<=i,j<n). 例如:A={1, 4, -3}, 则: |A[0] + A[0]| = |1 + 1| = 2. |A[0] + A[1]| = |1 + 4| = 5. |A[0] + A[2]| = |1 + (-3)| = 2. |A[1] + A[1]| = |4 + 4| = 8. |A[1] + A[2]| = |4 + (-3)| = 1. |A[2] + A[2]| = |(