前几天,听到有一个在三线省会城市国企的技术负责人在群里吐槽,面试了一个10年经验的高级PHP工程师,居然不会写循环,此言一出,群里一片哗然,有人认为是在黑世界上最好的语言PHP,有人认为是夸大其词,当然也有人觉得那是遇上了混子,如果是自己,不可能不会写。
其实,我在四五年前就听到很多次类似的感叹了。在我看来,这是再正常不过的了,笔者甚至说过,80%的PHP程序员不会写循环。可能有人要惊呼了,你这是哗众取宠吧。至于是不是,你自己来看下这三个题目,看完你还言之凿凿说你或者你身边的web程序员会写循环吗?
1.二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1
这个算是入门题目了吧,仔细思考下,似乎很容易想通,有点基本功的应该还是能写出源码的。
代码如下
public static int commonBinarySearch(int[] arr,int key){ int low = 0; int high = arr.length - 1; int middle = 0; //定义middle if(key < arr[low] || key > arr[high] || low > high){ return -1; } while(low <= high){ middle = (low + high) / 2; if(arr[middle] > key){ //比关键字大则关键字在左区域 high = middle - 1; }else if(arr[middle] < key){ //比关键字小则关键字在右区域 low = middle + 1; }else{ return middle; } } return -1; //最后仍然没有找到,则返回-1 }
这是不是循环,而且只是单层循环。这个会了,那再来一个题
2.调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。期间,不得借助其他存储空间。
这个题目看起来也不难,但代码要写起来就要思考几分钟了。写别看代码,建议自己先在纸上试一试。
void FunSeperate(int *a,int len) { //奇数odd前半部,偶数even后半部 int temp,i,j; i=0;j=len-1; for(i=0;i<=j;) { if(a[i]%2==0) //偶数 { if(a[j]%2==1) { temp=a[i];a[i]=a[j];a[j]=temp; i++; } j--; } else i++; } }
这个题目也是循环吧,而且也只有单层
3.BFS算法
广度优先遍历BFS(Breadth First Search),其主要思想是从起始点开始,将其邻近的所有顶点都加到一个队列(FIFO)中去,然后标记下这些顶点离起始顶点的距离为1.最后将起始顶点标记为已访问,今后就不会再访问。然后再从队列中取出最先进队的顶点A,也取出其周边邻近节点,加入队列末尾,将这些顶点的距离相对A再加1,最后离开这个顶点A。依次下去,直到队列为空为止。
public class Graph { private int V; private LinkedList<Integer> adj[]; // Create a graph Graph(int v) { V = v; adj = new LinkedList[v]; for (int i = 0; i < v; ++i) adj[i] = new LinkedList(); } // Add edges to the graph void addEdge(int v, int w) { adj[v].add(w); } // BFS algorithm void BFS(int s) { boolean visited[] = new boolean[V]; LinkedList<Integer> queue = new LinkedList(); visited[s] = true; queue.add(s); while (queue.size() != 0) { s = queue.poll(); System.out.print(s + " "); Iterator<Integer> i = adj[s].listIterator(); while (i.hasNext()) { int n = i.next(); if (!visited[n]) { visited[n] = true; queue.add(n); } } } } }
这个题也不难吧,也才2层循环。
这三个算法是不是都是基本的for循环呢,最难的不过是嵌套的2层循环,现在你还敢说自己会写循环吗?你觉得80%的比例算不算夸张呢。
为什么?你还以为是段子吗?
事实上,我身边很多技术负责人在面试的时候都会考察上面几个简单题目,足以刷掉很大一部分面试者了。
所以,80%的PHP程序员不会写循环,并不是随口胡诌的一句话,这也是笔者把这三个题目多次发群里后的调查结果。你以为10年经验不会写循环很奇怪,然而呢?大部分做纯web开发的程序员其实根本没有算法和逻辑的概念,大多数逻辑都是靠死记硬背和套框架来的,并不是写个分页或者输出个商品列表就算用循环了。不少程序员,只要你稍微换个形式,比如把循环的步长设置为可变,或者使用两个及以上的变量控制循环,他们就懵了,就开始不理解循环了。
你不能说上面三个最简单的算法题不是循环吧。咱不能光把输出1到10这种循环给算进来吧。
很多大公司在面试的时候,重学历重算法,轻从业经验,就是因为行业经验很容易得到,而且很容易过时,而硬功夫才是终生必备。
写10年CURD又奈何,和写了3年的比,优势在哪?如果换个全新行业,再打几折?
虽然PHP是重灾区(虽然很多人不愿意承认,但PHP的定位就注定是逻辑和算法的重灾区了),但是你觉得仅仅是PHP程序员是这样的吗?