偶然在博客中见对百度一个面试题的探讨,写些自己的看法以及指出探讨中不对的观点:百度面试题:求绝对值最小的数 有一个已经排序的数组(升序),数组中可能有正数、负数或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 = Arrays.binarySearch(source, 0);
      int insertPos = -1 - index;
      return index >= 0 ? 0
        : source[insertPos == source.length ? source.length - 1
        : insertPos];
    }

  那我接下来谈下我的看法。刚开始看到这个问题的时候发现不能用顺序比较的方法,那我觉得可能要写一段很长的方法,后来发现评论区有人写了上边的方法,所以只能说我对Arrays的binarySearch(*,key)方法也不熟悉!!!于是我查了下API:

***********************API内容**********************

binarySearch

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

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

***********************API内容**********************

  发现此方法是使用二分来搜索指定key值所在的索引(此方法要求*数组必须是排序过得数组没不然结果会不对,一下分析都是针对*升序后的分析),如果*中不存在key则返回(-(插入点) - 1,这个插入点是指排序过得数组*中大于key的后一个值的索引(此处还是比较难理解的,我是通过debug后才理解的,因为-1所以返回值为该值后第二个数的索引;如果数组中所有数都小于key则返回*.length),不得不说评论的那位老哥知识面还是挺广的,可是我运行了下老哥的那个demo,发现结果并不对,我也找到了其不对的原因,如下为我写的正确的demo(已验证)如下:

@org.junit.Test

public void listTest(){

  int[] sourcenum = new int[]{6,23,4,1,-2,-8};

  Arrays.sort(sourcenum);

  int min = getMinAbsoluteValue(sourcenum);

  System.out.println(min);

}

private static int getMinAbsoluteValue(final int[] source) {

  int index = Arrays.binarySearch(source, 0);

  //未找到情况下

  int insertFront = 0-index-2;//找到0的前一个数的索引

  int insertNext = 0-index-1;//找到的后一个数的索引

  return index == index > 0 ? source[index == source.length ? source.length-1 : index]//找到0的情况下载数组中通过0的索引取数

      : Math.abs(source[insertFront]) > Math.abs(source[insertNext]) ? source[insertNext] : source[insertFront];//未找到的情况下对0前后的那个数进行绝对值对比

}

时间: 2024-10-07 05:02:14

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

【poj3415-长度不小于k的公共子串个数】后缀数组+单调栈

这题曾经用sam打过,现在学sa再来做一遍. 基本思路:计算A所有的后缀和B所有后缀之间的最长公共前缀. 分组之后,假设现在是做B的后缀.前面的串能和当前的B后缀产生的公共前缀必定是从前往后单调递增的,每次与h[i]取min时必定将栈尾一些长的全部取出来,搞成一个短的. 所以就开一个栈,栈里存的是长度,同时存一下它的出现此处cnt. 注意各种细节啊.. 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring>

用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建. 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这里还是做下简单的介绍. 它是一个能够把一组 reStructuredText 或者 Markdown 格式的文件转换成各种输出格式,而且自动地生成交叉引用,生成目录等的一个文档编排工具. 不得不说,它的排版功能强大.非常清晰,顔值非常高. 但是使用这个方法搭建的博客,一直有一个

阅读《C++Primer》的个人记录(一)——在2019新年的爆竹声中开始自己的博客生涯

第一篇博客,不知从何说起才好.思来想去,决定还是从自己为什么转专业进入IT说起吧.其实建筑学在大多数人眼里还是一个不错的专业吧[雾,毕竟是上海某建筑老八校]当初高考之后真的是下定决心想学建筑呢,全力说服了母上大人终于在志愿书的第一志愿第一专业写下了&&&&&&&.进入建筑专业学习也有了一年多了,经历了无数个熬夜和通宵,方案被毙,在自习室画满一桌子的草图纸,在集中周亡命复习一学期几乎没学的公共基础课,也经历了方案最终成果被老师认可表扬后内心的释然和解脱

如何挖掘网络资源(编程随想的博客)

一:网站的类型和使用场景 首先来介绍一下网站的类型和特点.不同的网站特点将决定你挖掘资源的方式. ★网站内容的指标 要挖掘互联网的资源,首先需要关注网站的内容.俺大致总结了几个指标,任何网站的内容,都具有这几个指标. 通过这些指标,可以评估某个网站[对你的价值]到底有多大,还可以评估你挖掘其中的内容需要耗费多少时间和精力. ◇内容的信噪比 任何一个网站的内容,都会有一些信息是无用的,咱们称之为"噪声".所谓的[信噪比],就是是"有用信息"与"垃圾噪声&qu

hexo+github个人博客搭建

首先要了解一下我们搭建博客要用到的框架.Hexo是高效的静态站点生成框架,它基于Node.js.通过Hexo,你可以直接使用Markdown语法来撰写博客.相信很多小伙伴写工程都写过README.md文件吧,对,就是这个格式的!写完后只需两三条命令即可将生成的网页上传到你的github上,然后别人就可以看到你的网页啦.是不是很简单?你无需关心网页源代码的具体细节,你只需要用心写好你的博客内容就行. 安装Node.js 首先下载最新版Node.js,我这里给的是64位的. 安装选项全部默认,一路点

手把手教你建github技术博客by hexo

适合人群 喜欢写Blog的人 有一定的编程基础 爱折腾的人 熟练使用版本控制Git 了解使用Github 熟悉基本的MarkDown语法 环境准备 安装Git 下载 msysgit 并执行即可完成安装. 安装Node.js 在 Windows 环境下安装 Node.js 非常简单,仅须下载安装文件并执行即可完成安装. 安装hexo 利用 npm 命令即可安装.(在任意位置点击鼠标右键,选择Git bash) npm install -g hexo 问题 * npm ERR! registry e

开源分享:用Python开发的开源博客系统Blog_mini

本博文在51CTO技术博客首发. 开源不易,Python良心之作,真心送给广大朋友,恳请给予支持,不胜感激! 0.Blog_mini送给你们:让每个人都轻松拥有可管理的个人博客 你从未架设过服务器或网站,希望可以接触一下这方面的知识-- 你从未使用过Linux操作系统,希望可以接触一下这方面的知识-- 你是初中生/高中生/大学生,希望能在学业之余锻炼一下自己的IT技能-- 你是Python新手,希望能有一个用Python开发的个人博客-- 你学习Python许久,希望有一个开源的项目可以用来学习

在Github上搭建自己的博客网站

程序员都应该有写博客的习惯,博客可以作为知识管理,提升自己.当然写博客的地方有很多,CSDN,博客园以及新浪,网易等等.但是如果使用Github Pages来搭建一个有自己域名的独立网站,会不会更加炫酷呢?当然这方面的教程网上也很多,这里主要是我自己实现后的经验总结和注意事项. 这是最完整的教程,虽然是针对Windows的,但是我在mac上一步步做下来也是可以实现的.大家也可以照着做.链接:http://cnfeat.com/2014/05/10/2014-05-11-how-to-build-

我的Android进阶之旅------&gt;经典的大牛博客推荐(排名不分先后)!!

本文来自:http://blog.csdn.net/ouyang_peng/article/details/11358405 今天看到一篇文章,收藏了很多大牛的博客,在这里分享一下 谦虚的天下 柳志超博客 Android中文Wiki AndroidStudio-NDK开发-移动开发团队谦虚的天下 - 博客园gundumw100博客 - android进阶分类文章列表 - ITeye技术网站CSDN博文精选:Android系列开发博客资源汇总 - CSDN.NET - CSDN资讯Android笔