10年经验的PHP程序员不会写循环是段子?可能80%的PHPer都不会

前几天,听到有一个在三线省会城市国企的技术负责人在群里吐槽,面试了一个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程序员是这样的吗?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注