偶然在博客中见对百度一个面试题的探讨,写些自己的看法以及指出探讨中不对的观点:百度面试题:求绝对值最小的数 有一个已经排序的数组(升序),数组中可能有正数、负数或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前后的那个数进行绝对值对比
}
偶然在博客中见对百度一个面试题的探讨,写些自己的看法以及指出探讨中不对的观点:百度面试题:求绝对值最小的数 有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现 例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4。的更多相关文章
- 【poj3415-长度不小于k的公共子串个数】后缀数组+单调栈
这题曾经用sam打过,现在学sa再来做一遍. 基本思路:计算A所有的后缀和B所有后缀之间的最长公共前缀. 分组之后,假设现在是做B的后缀.前面的串能和当前的B后缀产生的公共前缀必定是从前往后单调递增的 ...
- 【随笔】这段时间没有写博客是因为一边看Qt5的帮助文档一边写小程序
长话短说,因为和做程序员的以前的同学联系了一下,知道自己有很多不足,加之接到一个培训机构的人打来的电话稍微打击了一下,虽然那个人满嘴跑火车想装做和我很谈得来,但是我依然看到了自己没有写过任何命令行以外 ...
- CSDN博客给我带来的一些诱惑和选择机会
武汉九天鸟-p2p网贷系统开发-互联网应用软件开发 公司官网:http://jiutianniao.com 社交问答:http://ask.jiutianniao.com 最近1年多,尤其是今年5月 ...
- 用 Sphinx 搭建博客时,如何自定义插件?
之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建. 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清 ...
- 关于博客中引用多媒体出现的bug说明
插件说明 Aplayer.Dplayer @DIYgod 大佬在gihub的开源项目,对此,表示非常之感谢!! Aplayer 支持放在页首 支持放在页尾 但是不支持直接放在文章中引用 解决方法: 1 ...
- 人生中的第一篇OI博客及博客规划
这是笔者第一次在博客园里发表文章,也同样是第一次来写关于OI的一些想法,此篇的主题是想总体对日后的博客有具体的规划. 首先,笔者创办博客并发表观点于看法的目的是记录自己对于题目或竞赛的观念,主要以题解 ...
- WebGIS博客文本分析(词频分析)手动扒取 去除格式 词语分割 统计分析
1. [置顶](一)开篇—杂谈WebGIS 摘要: 文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.前言 ...
- 超详细Hexo+Github博客搭建小白教程
原文链接:超详细Hexo+Github博客搭建小白教程 去年9月的时候开始搭建了第一个自己的独立博客,到现在也稍微像模像样了.很多小伙伴应该也想过搭建一个自己的博客,网上也有一堆详细教程.我在此稍稍总 ...
- Hexo+Github: 博客网站搭建完全教程(看这篇就够了)
本篇教程首次发布在个人博客:sunhwee.com,想要获得最佳阅读体验,欢迎前往,建议用电脑查看教程文档. # 阅读须知 注意,这篇文章篇幅较长,主要针对新手,每一步很详细,所以可能会显得比较啰嗦, ...
随机推荐
- 最简单、最常用的一些Git命令
---------------------------------------------------------------------------------------------------- ...
- Linux centosVMware Linux集群架构LVS DR模式搭建、keepalived + LVS
一.LVS DR模式搭建 三台机器 分发器,也叫调度器(简写为dir) davery :1.101 rs1 davery01:1.106 rs2 davery02:11.107 vip 133.200 ...
- 实现JSP部分内容继承
我们的网站框架搭好以后,只需要主体部分显示不同的数据. 如果每次代码重写都会造成冗余. 今天欣赏别人代码,学到了 maven 核心代码 <dependency> <groupId&g ...
- 八大排序算法C++代码实现
八大排序算法 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序 ...
- Go语言的map
map一般是以库的方式提供,在C++和C#和JAVA中都需要引用相应的库而Go语言不需要引入库,可以直接方便使用 定义:map是一堆键值对的未排序集合.无序 1.声明变量: map的声明基本上没有多余 ...
- SignalR Connection has not been fully initialized
在使用 SignalR 过程中遇到 SignalR: Connection has not been fully initialized. Use .start().done() or .start( ...
- redis集群配置文件
bind xxx.xxx.xxx.xxx 绑定redis服务器网卡IP,默认为127.,即本地回环地址.这样的话,访问redis服务只能通过本机的客户端连接,而无法通过远程连接.如果bind选项为空的 ...
- 在 aws emr 上,将 hbase table A 的数据,对 key 做 hash,写到另外一张 table B
先 scan 原表,然后 bulkload 到新表. 采坑纪录1. bulkload 产生 hfile 前,需要先对 hash(key) 做 repartition,在 shuffle 的 read ...
- 2 HTML简介&标签嵌套和并列关系&文档声明
HTML:Hyper Text Markup Language 超文本标签语言(hyper:精力旺盛的 markup:标记 n noun) HTML不是编程语言,而是一种标记语言(就是一套标记标签) ...
- SqlSession为什么可以提交事务
本应在开始读MyBatis源码时首先应该了解下MyBatis的SqlSession的四大对象:Executor.StatemenHandler.ParameterHandler.ResultHandl ...