1:實現單鏈表的逆置
html
2: 有個單鏈表,不知道節點N的值,怎樣只遍歷一次就能夠求出中間節點?面試
解:設立兩個指針,好比*p, *q, p每次移動兩個位置,即 p = p->next->next, q每次移動一個位置,即 q = q->next,當p到達最後一個節點時,q就是中間節點。算法
3:如何找出單鏈表中的倒數第k個元素?數組
思路:設立兩個指針*p,*q, p一開始指向單鏈表的第k個節點,q一開始指向頭結點,而後p,q同時向後移動,當p移動到尾節點時,q就是咱們須要找的位置。服務器
4:一致性hash算法原理數據結構
4.1:從頭至尾解析Hash表算法spa
5:100億個數據中找出最大的10個?.net
思路:線程
一、首先一點,對於海量數據處理,思路基本上是肯定的,必須分塊處理,而後再合併起來。指針
二、對於每一塊必須找出10個最大的數,由於第一塊中10個最大數中的最小的,可能比第二塊中10最大數中的最大的還要大。
三、分塊處理,再合併。也就是Google MapReduce 的基本思想。Google有不少的服務器,每一個服務器又有不少的CPU,所以,100億個數分紅100塊,每一個服務器處理一塊,1億個數分紅100塊,每一個CPU處理一塊。而後再從下往上合併。注意:分塊的時候,要保證塊與塊之間獨立,沒有依賴關係,不然不能徹底並行處理,線程之間要互斥。另一點,分塊處理過程當中,不要有反作用,也就是不要修改原數據,不然下次計算結果就不同了。
四、上面講了,對於海量數據,使用多個服務器,多個CPU能夠並行,顯著提升效率。對於單個服務器,單個CPU有沒有意義呢?
也有很大的意義。若是不分塊,至關於對100億個數字遍歷,做比較。這中間存在大量的沒有必要的比較。能夠舉個例子說明,全校高一有100個班,我想找出全校前10名的同窗,很傻的辦法就是,把高一100個班的同窗成績都取出來,做比較,這個比較數據量太大了。應該很容易想到,班裏的第11名,不多是全校的前10名。也就是說,不是班裏的前10名,就不多是全校的前10名。所以,只須要把每一個班裏的前10取出來,做比較就好了,這樣比較的數據量就大大地減小了。
6:洗牌算法
7:堆的數據結構 比較適合處理像海量數據中找到前100個這種相似的問題
9:二分查找
10:快速排序
11:冒泡排序
// 冒泡排序 public void bubbleSort() { for(int out = nElems - 1; out > 1; out--) for(int in = 0; in < out; in++ ) if(array[in] > array[in+1]) swap(in, in+1); }
12:選擇排序
// 算法思路:在這些數據中從頭開始找最小的一個數,找到了就和第一個相互交換,換過以後,就表明第一個數不須要在排序了, // 接着從第二個數開始遍歷查找最小的,找到了,就和第二個位置的數交換,就這樣往下循環,就能夠了。 public void selectSort() { int out, in, min; for(out = 0; out < nElems - 1; out++) { min = out; for(in = out + 1; in < nElems; in++) if(array[in] < array[min]) min = in; swap(out, min); } }
13:插入排序
/* 插入排序:起始條件:有一個無序的數組 比較一個數以前,先保存在一個臨時值裏面, 一開始,先將數組的第二個裏面的數保存在一個臨時temp中,而後與數組的第一個值比較大小 a[0]與a[1],若第一個大,則交換值 下一次循環從數組的第三個值開始比較,由於前面的是有序的了,因此先和第數組的第二個值比較大小,若a[1]>a[2],交換數值,接着和a[0]比較。因此整個插入排序就很清楚了 */ public void insertSort() { int in, out; for(out = 1; out < nElems; out++) { long temp = array[out]; in = out; //in做爲標記最終插入的地方 while(in > 0 && array[in-1] > temp) { array[in] = array[in-1]; --in; } array[in] = temp; } }
14:不用臨時變量交換兩個數的值
int main(int argc, char *argv[]) { int a = 2, b = 6; a = a ^ b; b = b ^ a; a = a ^ b; printf("a = %d b = %d/n", a, b); return 0; }
異或運算符^也稱XOR運算符,它的規則是若參加運算的兩個二進位同號,則結果爲0(假);異號爲1(真)。即0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0
知足性質: 一、交換律
二、結合律(即(a^b)^c == a^(b^c))
三、對於任何數x,都有x^x=0,x^0=x
四、自反性 A XOR B XOR B = A xor 0 = A