在昨天騰訊發短信通知筆試,今天因爲出了點交通意外沒趕上~也是囧啊~然後等同學出來後得知了幾個題目,在這記錄一下~
PS:聽同學說,騰訊規定要用C++來答題~題目比較廣,涉及到了考研的408,然後算法啥啥的~
簡述一下JS中的閉包:
- 官方原話:閉包是一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。其實通俗點說就是JavaScript中的函數都是閉包,不過一般來說嵌套的函數產生的閉包更爲強大,所以很多書上說的是嵌套的函數,從而用於外圍function可以訪問到內部的function的局部變量
- 詳見http://www.frontopen.com/1702.html
當Http頭中的Connection設置爲close時是表示什麼:
- 在Http1.1中,client和Server都是默認支持長連接的,而close設置可以讓允許客戶端或服務器中任何一方關閉底層的連接雙方都會要求在處理請求後關閉它們的TCP連接。
- 詳見http://blog.csdn.net/zwwtj2014/article/details/45115105
約瑟夫環(題目貌似被改動,但是按照我的理解,問題的核心就是約瑟夫環):
- 題目約瑟夫環(這裏說個簡單的情況,很多題目都是這個的變種):0,1,。。。,n-1這n個數字排成一個環,從數字0開始每次從這個圓圈中刪除第m個,求這個圓圈剩餘的最後一個數
- 解答(一):用環形鏈表模擬這個環,代碼如下:
/** * * <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))
- 這個題目是個非常經典的算法,很早之前看過。。不過同學和我說的時候我第一時間沒反應過來,也是醉了,說了當初看的時候根本沒有完全理解~思想主要是:設置兩個指針,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++題,想想沒趕上還是有些不爽~