百度:求绝对值最小的数

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

  看了会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-10-29 08:18:59

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

百度面试题:求绝对值最小的数

有一个已经排序的数组(升序),数组中可能有正数.负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现 例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4. 算法实现的基本思路 找到负数和正数的分界点,如果正好是0就是它了,如果是正数,再和左面相邻的负数绝对值比较,如果是负数,取取绝对值与右面正数比较.还要考虑数组只有正数或负数的情况. 我根据这个思路用Java简单实现了一个算法.大家有更好的实现方法欢迎跟帖

javascript中求绝对值最小的数

有一个已经排序的数组(升序),数组中可能有正数.负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4. 问题分解: 第一步:二分法寻找改变符号的位置(0视为正数) 第二步:比较位置左右数字的绝对值大小,取较小的那一个 <script language="javascript"> var getBound = function(a,fr,

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

题目为: 有一个已经排序的数组(升序),数组中可能有正数.负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现 例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4. 这一题该如何求呢? 初步的解决思路是:     1.数组中的元素全为正,取最左边的数字:     2.数组中的元素全为负,取最右边的数字的绝对值:     3.数组中有正数有负数,就用二分法查找,判断中间元素的符号        a)中间元素为

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

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

剑指offer系列之三十一:把数组排成最小的数

题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 根据结果判断,所谓最小的数字实际上就是对数组中所有元素的一个组合.一种笨拙的方法是求出所有元素的全排列,然后对所有排列的值的大小进行排序,那么就可以得到最小的数了.求全排列的算法已经在之前的文章中提到.那么是不是还有其他思路呢?联想到Java库函数中有一个sort方法,是不是可以直接使用呢?(该sort方法的时

如何把数组排成最小的数

题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为一个整数m (1<=m <=100)代表输入的正整数的个数. 输入的第二行包括m个正整数,其中每个正整数不超过10000000. 输出: 对应每个测试案例, 输出m个数字能排成的最小数字. 样例输入:323 13 6223456 56样例输

acm-c语言 ACM求绝对值为什么是错误答案,明明可以运行啊

问题描述 c语言 ACM求绝对值为什么是错误答案,明明可以运行啊 #include ""stdio.h""#include ""math.h"" int main(){ float x; for(;scanf(""%f""&x)!=EOF;) printf(""%.2fn""fabs(x));} 解决方案 题目要求是循环输入数据循环打印么?

using-输入10个整数,将其中最小的数与第一个数交换,把最大的数与最后一个数交换。用指针实现,但是程序崩溃了

问题描述 输入10个整数,将其中最小的数与第一个数交换,把最大的数与最后一个数交换.用指针实现,但是程序崩溃了 #include #include /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main() { int a[10],i, p, *q, *n; printf("请输入十个数n"); for

求给定值的数的所有组合

问题描述 求给定值的数的所有组合 写一个函数,给定参数 x 指定一个数字 参数sum 指定和 要求: 1.求出和为sum的所有的可能的组合,以任意格式输出都可以 2.后一位不能大于前一位数(小于等于) 3.每一位大于0 eg: x为5 sum为17 那么 可能的结果有 5,5,5,2; 5,5,4,3; 5,5,3,3,1; 5,4,4,4; -- 4,4,4,4,1 -- 2,2,2,2,2,2,2,2,1 -- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 等 解决方案