38. PHP在升序数组中查找绝对值最小的元素

这是不久前我在滴滴出行时,面试官让我在纸上写出来的面试题。在一个升序排列的数组中, 查找绝对值最小的元素。分析, 数组升序排列, 两边的数值绝对值只会越来越大, 绝对值最小的元素必须在中间趋近于0的地方,因此思路就是不断的遍历数组, 找到趋近于0的这个位置。考虑四种情况:

  1. 数组全部为正数时, 绝对值最小的元素是第一位;
  2. 数组全部为负值时, 绝对值最小的元素为最后一位;
  3. 数组即包含正数, 也包含负数时, 需要找到趋近于0的位置, 找到两边的正数和负数, 比较这两个元素的大小;
  4. 数组为空或为一个元素时, 就是该元素或不存在。

这个题的思路并不难, 一般都会一开始就想到, 关键是面试时如何在纸上正确写出。我在网上搜索了下,发觉这是一道很老的面试题了,遗憾没有为找工作刷过题,当时没能在纸上写出来,但是思路是正确的,就卡在如何处理有正负数时的情况。我想到了用中点来快速遍历,但是一下子没多想,可能还是因为紧张,就没想到while循环的数组下标处理方式,而是去设计每次判断中点偏离了解题思路。

Read More

37. PHP处理数学精度

用编程语言做计算,很多时候浮点数精度都是困扰过我的问题,即便是刚学PHP的新手也会在群里问为什么我的计算结果明显不对,而我们总是老态龙钟的丢出一句浮点数计算都存在精度问题,并没有提出过什么实质性的改善。比如下面的计算 0.57*100

zhgxun-pro:~ zhgxun$ php -a
Interactive shell

php > echo intval(0.57*100);
56
php > echo 0.57*100;
57
php >

看到结果其实我们已经想到了,很多时候我们忽略精度问题,一定意义上是因为我们没有对计算结果进行类型转换,巧妙的得到了更好的结果值。但是总会有(细心)的开发者会自作聪明的对结果进行指定,恰恰得到了相反的效果。这也是为什么我一直没有仔细想过这个问题的原因,按动态解释性语言的特性,变量都是在运行时才最终确定的,所以不要刻意去转换类型,即便你很确认变量就应该是这个样子的。

我记得在刚学PHP的时候,偶然间看到网络上高洛峰的一个视频,其间有一句话就说以后你们在PHP编程中,会遇到很多一时半会解释不清楚的问题,那时候你们首先想到的应该是这门语言的特性–解释性,自然你就会慢慢理解了。

Read More