腾讯2015实习生招聘笔试题部分

时间:2022-12-27 14:37:10

在昨天腾讯发短信通知笔试,今天因为出了点交通意外没赶上~也是囧啊~然后等同学出来后得知了几个题目,在这记录一下~

PS:听同学说,腾讯规定要用C++来答题~题目比较广,涉及到了考研的408,然后算法啥啥的~


简述一下JS中的闭包:

  1. 官方原话:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。其实通俗点说就是JavaScript中的函数都是闭包,不过一般来说嵌套的函数产生的闭包更为强大,所以很多书上说的是嵌套的函数,从而用于外围function可以访问到内部的function的局部变量
  2. 详见http://www.frontopen.com/1702.html


当Http头中的Connection设置为close时是表示什么:

  1. 在Http1.1中,client和Server都是默认支持长连接的,而close设置可以让允许客户端或服务器中任何一方关闭底层的连接双方都会要求在处理请求后关闭它们的TCP连接。
  2. 详见http://blog.csdn.net/zwwtj2014/article/details/45115105


约瑟夫环(题目貌似被改动,但是按照我的理解,问题的核心就是约瑟夫环):

  1. 题目约瑟夫环(这里说个简单的情况,很多题目都是这个的变种):0,1,。。。,n-1这n个数字排成一个环,从数字0开始每次从这个圆圈中删除第m个,求这个圆圈剩余的最后一个数
  2. 解答(一):用环形链表模拟这个环,代码如下:
    • /**
      	 * 
      	* <p>Title: LastRemaining</p>
      	* <p>Description: Java</p>
      	* <p>描述:实现约瑟夫环的问题,因为我们使用的是单链接实现的,所以当最current到达末尾时需要注意重置指向头</p>
      	* @param n 长度
      	* @param m 间隔位置
      	 */
      	public int LastRemaining(int n,int m){
      		if(n < 1 || m <1){
      			return -1;
      		}
      		
      		List<Integer> numbers = new LinkedList<Integer>();
      		for(int i=0;i<n;i++){
      			numbers.add(i);
      		}
      		
      		int current = 0;//用current指向list的index = 0处的结点,即第一个结点
      		while(numbers.size() > 1){//当numbers只剩一个时即为所求
      			int i = 1;
      			for(;i<m;i++){
      				++current;
      				if(current == numbers.size()){//当增加后发现超过最后一个结点的index时,将current重新指向第一个结点
      					current = 0;
      				}
      			}
      			System.out.print(numbers.get(current) + " ");
      			numbers.remove(current);
      			if(current == numbers.size()){//当删除后发现current超过了最后一个结点,需要重置
      				current = 0;
      			}
      		}
      		System.out.println(numbers.get(0));
      		return numbers.get(0);
      	}
    • 如果只是为了得到题目中的答案,其实有更好的一种解法:就是找到初始序列和删除一个结点之后的序列的映射关系,然后使用递归或者迭代来实现,可以参加剑指Offer题目45,上面也给了用C++来实现的代码

判断一个单向链表是否有环(要求时间复杂度O(n),空间O(1))

  1. 这个题目是个非常经典的算法,很早之前看过。。不过同学和我说的时候我第一时间没反应过来,也是醉了,说了当初看的时候根本没有完全理解~思想主要是:设置两个指针,p1,p2,p1每次走一步,p2每次走两步,如果有环,终究有天他两会相遇,如果没环则不会~如果知道这个思想,这题就很简单了,按我同学的说法,他3分钟就写完了~膜拜大神~
    • bool IsExitsLoop(slist *head)  
          { slist *slow = head, *fast = head;  
              while ( fast && fast->next )   
              {  
                  slow = slow->next;  
                  fast = fast->next->next;  
                  if ( slow == fast ) break;  
              }    
              return !(fast == NULL || fast->next == NULL);  
          }  
      

PS:还有一些设计到设计模式,C++语法的,可以看到腾讯对C/C++确实要求比较高,笔试超过一半都是C++题,想想没赶上还是有些不爽~