聲明:本文題目來源於互聯網,僅供即將從學校畢業的.Net碼農(固然,我本人也是菜逼一個)學習之用。固然,學習了這些題目不必定會拿到offer,可是針對就業求職作些針對性的準備也是不錯的。此外,除了技術上的準備外,要想獲得提高,還得深刻內部原理,閱讀一些經典書籍(例如Jeffrey Richter的《CLR via C#》)以及藉助Reflector或ILSpy反編譯查看源碼實現,知其然也知其因此然,方能獲得感性認識到理性認識的飛躍!另外,原本想將本文標題取爲就業求職寶典,但一想這名字太LOW了,並且太過浮華了,本文也根本達不到那個目標,因而將其改成儲備,簡潔明瞭。javascript
注意:這裏僅寫出了最基本的js代碼,至於什麼二次封裝和重構各位能夠自行解決;html
function ajax(method, url, callback) { var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); xhr.open(method, url, true); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { var result = xhr.responseText; callback(result); } } xhr.send(); }
這裏主要理解記憶爲四個步湊便可:java
(1)建立XMLHttpRequest對象:若是你足夠細心,還能夠考慮一下各主流瀏覽器的兼容性;
程序員
(2)創建與服務器端的鏈接:藉助open方法,GET仍是POST?服務頁面地址是?異步仍是同步?面試
(3)設置響應完成後的回調函數:注意條件是readyState=4且status=200的狀況下,下面給出了這些條件的具體含義ajax
屬性算法 |
描述數據庫 |
onreadystatechange設計模式 |
每次狀態改變所觸發事件的事件處理程序數組 |
readyState |
對象狀態值:
|
responseText |
從服務器進程返回的數據的字符串形式 |
responseXML |
從服務器進程返回的DOM兼容的文檔數據對象 |
status |
從服務器返回的數字代碼,好比404(未找到)或200(就緒) |
statusText |
伴隨狀態碼的字符串信息 |
(4)最後正式發送請求:最後一步纔是正式的發送這次Ajax請求,調用send方法;
PS:能夠看看上面這段js方法具體如何應用的
View Code<script type="text/javascript"> function getServerTime() { ajax("GET", "AjaxHandler.ashx?action=gettime", afterSuccess); } function afterSuccess(data) { if (data != null) { document.getElementById("spTime").innerHTML = data; } } function ajax(method, url, callback) { var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); xhr.open(method, url, true); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { var result = xhr.responseText; callback(result); } } xhr.send(); } </script> </head> <body> <div align="center"> <input id="btnAjax" type="button" value="Get Server Time" onclick="getServerTime()" /> <br /> <span id="spTime" style="font-weight:bold;"></span> </div> </body>
1.2 基本排序算法:冒泡排序與快速排序
(1)基本概念
冒泡排序(Bubble Sort),是一種計算機科學領域的較簡單的排序算法。
它重複地走訪過要排序的數列,一次比較兩個元素,若是他們的順序錯誤就把他們交換過來。走訪數列的工做是重複地進行直到沒有再須要交換,也就是說該數列已經排序完成。這個算法的名字由來是由於越大的元素會經由交換慢慢「浮」到數列的頂端,故名。
下圖是一個經典的冒泡排序過程圖,能夠看出,在排序過程當中,大的記錄像石頭同樣「沉底」,小的記錄逐漸向上「浮動」,冒泡排序的名字也由此而來。
圖1 冒泡排序過程模擬
(2)算法過程
①比較相鄰的元素。若是第一個比第二個大,就交換他們兩個。
②對每一對相鄰元素做一樣的工做,從開始第一對到結尾的最後一對。這步作完後,最後的元素會是最大的數。
③針對全部的元素重複以上的步驟,除了最後一個。
④持續每次對愈來愈少的元素重複上面的步驟,直到沒有任何一對數字須要比較。
(3)代碼實現
public static void BubbleSort(int[] array) { int temp; bool flag; for (int i = array.Length - 1; i >= 1; i--) { flag = false; for (int j = 1; j <= i; j++) { if (array[j - 1] > array[j]) { temp = array[j - 1]; array[j - 1] = array[j]; array[j] = temp; flag = true; } } if (!flag) { return; } } }
這裏爲何要藉助flag標誌位來判斷?由於若是在一趟排序中沒有發生元素交換,那麼數組中的數據都已經有序了,這時就無需再繼續比較了,這也是冒泡排序算法結束的條件。
(4)測試結果
①這裏首先使用一個包含10000個(原本想再對10萬個,100萬個進行測試,可是太懶了,因此...)隨機數的int數組簡單進行了五次測試,平均耗時每次812ms。
public static void BubbleSortDemo() { int maxSize = 10000; int[] array = new int[maxSize]; Random random = new Random(); for (int i = 0; i < maxSize; i++) { array[i] = random.Next(1, 10001); } Console.WriteLine("Before Bubble Sort:"); SortHelper.PrintArray(array); Stopwatch watcher = new Stopwatch(); watcher.Start(); SortHelper.BubbleSort(array); watcher.Stop(); Console.WriteLine("------------------------------------------------------------"); Console.WriteLine("After Bubble Sort:"); SortHelper.PrintArray(array); Console.WriteLine("Total Elapsed Milliseconds:{0}ms", watcher.ElapsedMilliseconds); }
②這裏再使用一個包含10000個有序數據的int數組進行幾回測試,發現平均耗時均爲0ms。
(5)複雜度分析
①時間複雜度
若待排序文件的初始狀態是正序的,一趟掃描便可完成排序(這裏也解釋了咱們爲何剛剛在代碼中設置一個flag標誌)。所需的關鍵字比較次數C和記錄移動次數M均達到最小值:,
。因此,冒泡排序最好的時間複雜度爲
。
若待排序文件是反序的,須要進行 n - 1 趟排序。每趟排序要進行 n - i 次關鍵字的比較(1≤i≤n-1),且每次比較都必須移動記錄三次來達到交換記錄位置。在這種狀況下,比較和移動次數均達到最大值:
因此,冒泡排序的最壞時間複雜度爲。
綜上所述,冒泡排序總的平均時間複雜度爲。
②空間複雜度
由算法代碼能夠清晰地看出,額外的輔助空間只有一個temp,所以空間複雜度爲O(1)。
(1)基本概念
快速排序(Quick Sort)是對冒泡排序的一種改進,由C. A. R. Hoare在1962年提出。它採用了一種分治的策略,一般稱其爲分治法(Divide-and-ConquerMethod)。
它的基本思想是:經過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的全部數據都比另一部分的全部數據都要小,而後再按此方法對這兩部分數據分別進行快速排序,整個排序過程能夠遞歸進行,以此達到整個數據變成有序序列。
(2)算法過程
快速排序使用分治法(Divide and conquer)策略來把一個串行(list)分爲兩個子串行(sub-lists)。具體步驟爲:
圖2 快速排序過程模擬
(3)代碼實現
public static void QuickSort(int[] array, int low, int high) { if (low < high) { int index = Partition(array, low, high); QuickSort(array, low, index - 1); QuickSort(array, index + 1, high); } } public static int Partition(int[] array, int low, int high) { int i = low; int j = high; int temp = array[low]; while (i != j) { // 先判斷右半部分是否有小於temp的數,若是有則交換到array[i] while (i < j && temp < array[j]) { j--; } if (i < j) { array[i++] = array[j]; } // 在判斷左半部分是否有大於temp的數,若是有則交換到array[j] while (i < j && temp > array[i]) { i++; } if (i < j) { array[j--] = array[i]; } } array[i] = temp; return i; }
(4)測試結果
①這裏仍然使用一個包含10000個隨機數的int數組簡單進行了五次測試,平均耗時每次3ms。相比冒泡排序的平均耗時800+ms,快速排序果真名不虛傳,快的不是一點半點啊!
public static void QuickSortDemo() { int maxSize = 10000; int[] array = new int[maxSize]; Random random = new Random(); for (int i = 0; i < maxSize; i++) { array[i] = random.Next(1, 10001); } Console.WriteLine("Before Quick Sort:"); NewSortHelper.PrintArray(array); Stopwatch watcher = new Stopwatch(); watcher.Start(); NewSortHelper.RecursiveQuickSort(array, 0, array.Length - 1); watcher.Stop(); Console.WriteLine("------------------------------------------------------------"); Console.WriteLine("After Quick Sort:"); NewSortHelper.PrintArray(array); Console.WriteLine("Total Elapsed Milliseconds:{0}ms", watcher.ElapsedMilliseconds); }
②一樣,這裏再使用一個包含10000個有序數據的int數組進行五次測試,發現平均耗時爲343ms。這裏也能夠跟冒泡排序在此種情形下的耗時進行對比,發現快排在接近有序的情景時弱爆了。
(5)複雜度分析
①時間複雜度:
快速排序的時間主要耗費在劃分(Partition)操做上,對長度爲k的區間進行劃分,共需k-1次關鍵字的比較。
假設有1到8表明要排序的數,快速排序會遞歸log(8)=3次,每次對n個數進行一次處理,因此他的時間複雜度爲n*log n即O(n log n)。因此排序問題的時間複雜度能夠認爲是對排序數據的總的操做次數。
可是,好比一個序列5,4,3,2,1,要排爲1,2,3,4,5。按照快速排序方法,每次只會有一個數據進入正確順序,沒法把數據分紅大小至關的兩份,很明顯,排序的過程就成了一個歪脖子樹,樹的深度爲n,那時間複雜度就成了O(n2)。這也就解釋了爲何在剛剛的第二次有序數據測試時,快排仍然須要耗費一些時間了。
儘管快速排序的最壞時間爲O(n2),但就平均性能而言,它是基於關鍵字比較的內部排序算法中速度最快者,快速排序亦所以而得名。它的平均時間複雜度爲O(n log n)。
②空間複雜度:
這裏快速排序是以遞歸形式進行的,而遞歸又須要棧的輔助,所以它所須要的輔助空間比冒泡排序多,所以其空間複雜度爲O(log n)。這裏能夠看出,快速排序是典型的以空間換時間的經典案例。
順序查找是一種最基本最簡單的查找方法,它的基本思路是:從表的一段開始,順序掃描線性表,依次將掃描到的關鍵字與給定值K進行比較,若比較相等,則查找成功;若掃描結束後,仍未發現關鍵字等於K的記錄,則查找失敗。
其代碼實現也很簡單:
public static int SimpleSearch(int[] array, int key) { int result = -1; for (int i = 0; i < array.Length; i++) { if (array[i] == key) { result = i + 1; break; } } return result; }
優勢:最簡單,對元素排列次序無要求,插入新元素方便。
缺點:速度慢,平均查找長度爲(n+…+2+1)/n=(n+1)/2,約爲表長度一半。
二分查找又稱折半查找,它首先要求線性表是有序的,即表中記錄按關鍵字有序(好比:遞增有序或遞減有序)。
其基本思路是:設有序表A[0]~A[n-1]
①首先取中點元素A[mid]的關鍵字同給定值K進行比較,若相等則查找成功;不然,若K< A[mid].key,則在左子表中繼續進行二分查找;若K> A[mid].key,則在右子表中繼續進行二分查找;
②這樣,通過一次比較,就縮小一半查找空間,如此進行下去,直到查找成功,或者當前查找區間爲空時爲止(或區間的下界大於等於上界時爲止)。
經過基本思路寫出代碼實現:
public static int BinarySearch(int[] array, int key) { int low = 0; int high = array.Length - 1; int mid = -1; while (low <= high) { mid = (low + high) / 2; if (array[mid] > key) { high = mid - 1; } else if (array[mid] < key) { low = mid + 1; } else { return mid + 1; } } return -1; }
經過以上的分析,咱們也能夠方便地得出其優缺點以下:
優勢:時間複雜度爲O(logn),查找速度快。
缺點:須要創建有序表,而且插入和刪除會比較麻煩。另外,只適用於順序存儲的有序表,不適用於連接存儲的有序表。
這裏能夠閱讀Terry Lee的設計模式系列來理解學習一下
.NET設計模式(2):單件模式(Singleton Pattern)
http://terrylee.cnblogs.com/archive/2005/12/09/293509.html
.NET設計模式(3):抽象工廠模式(Abstract Factory)
http://terrylee.cnblogs.com/archive/2005/12/13/295965.html
.NET設計模式(19):觀察者模式(Observer Pattern)
http://www.cnblogs.com/Terrylee/archive/2006/10/23/Observer_Pattern.html
.NET設計模式(10):裝飾模式(Decorator Pattern)
http://terrylee.cnblogs.com/archive/2006/03/01/340592.html
.NET設計模式(8):適配器模式(Adapter Pattern)
http://terrylee.cnblogs.com/archive/2006/02/18/333000.html
.NET設計模式(12):外觀模式(Facade Pattern)
http://terrylee.cnblogs.com/archive/2006/03/17/352349.html
假設數據庫有一張Student表,其中有四個字段:S#-學號,Sname-姓名,Sage-年齡,Ssex-性別;咱們先新增一個頁面,取名爲AdoNetDemo,html中不添加任何內容;在.cs文件中,寫入如下代碼,經過ADO.Net訪問數據庫,並將性別爲男生的學生信息輸出到頁面中;
public partial class AdoNetDemo : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { BindDataInfos(); } } private void BindDataInfos() { string connstr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; using (SqlConnection con = new SqlConnection(connstr)) { con.Open(); using (SqlCommand cmd = con.CreateCommand()) { cmd.CommandText = "select * from Student where Ssex=@sex"; cmd.Parameters.Add(new SqlParameter("@sex", "男")); using(SqlDataAdapter adapter = new SqlDataAdapter(cmd)) { DataTable dt = new DataTable(); adapter.Fill(dt); if(dt != null) { foreach(DataRow row in dt.Rows) { Response.Write(string.Format("學號:{0},姓名:{1},年齡:{2}</br>", row["S#"].ToString(), row["Sname"].ToString(), row["Sage"].ToString())); } } } } } } }
這裏主要是看BindDataInfos這個方法,藉助ADO.Net中最基本的幾個對象(Connection、Command、Adapter等)實現對指定數據庫表的訪問,並將其取出放到DataTable中,再根據指定格式輸出到頁面中。這裏使用了using語句,其實質是幫咱們自動生成try-finally,在離開using語句塊後會自動調用Dispose方法釋放資源,由於像Connection、Command這種對象是非託管資源,GC沒法對其進行自動回收。
這裏封裝了一個最基本的SQLHelper,實現了ExecuteNonQuery、ExecuteScalar、ExecuteDataTable,以及對Object類寫了兩個擴展方法,用於在C#類型和數據庫類型之間的轉換。
public static class MsSqlHelper { public static readonly string connstr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; #region 00.OpenConnection public static SqlConnection OpenConnection() { SqlConnection con = new SqlConnection(connstr); con.Open(); return con; } #endregion #region 01.ExecuteNonQuery public static int ExecuteNonQuery(string cmdText, params SqlParameter[] parameters) { using (SqlConnection con = new SqlConnection(connstr)) { con.Open(); return ExecuteNonQuery(con, cmdText, parameters); } } public static int ExecuteNonQuery(SqlConnection con, string cmdText, params SqlParameter[] parameters) { using (SqlCommand cmd = con.CreateCommand()) { cmd.CommandText = cmdText; cmd.Parameters.AddRange(parameters); int result = cmd.ExecuteNonQuery(); return result; } } #endregion #region 03.ExecuteScalar public static object ExecuteScalar(string cmdText, params SqlParameter[] parameters) { using (SqlConnection con = new SqlConnection(connstr)) { con.Open(); return ExecuteScalar(con, cmdText, parameters); } } public static object ExecuteScalar(SqlConnection con, string cmdText, params SqlParameter[] parameters) { using (SqlCommand cmd = con.CreateCommand()) { cmd.CommandText = cmdText; cmd.Parameters.AddRange(parameters); object result = cmd.ExecuteScalar(); return result; } } #endregion #region 04.ExecuteDataTable public static DataTable ExecuteDataTable(string cmdText, params SqlParameter[] parameters) { using (SqlConnection con = new SqlConnection(connstr)) { con.Open(); return ExecuteDataTable(con, cmdText, parameters); } } public static DataTable ExecuteDataTable(SqlConnection con, string cmdText, params SqlParameter[] parameters) { using (SqlCommand cmd = con.CreateCommand()) { cmd.CommandText = cmdText; cmd.Parameters.AddRange(parameters); using (SqlDataAdapter adapter = new SqlDataAdapter(cmd)) { DataTable dt = new DataTable(); adapter.Fill(dt); return dt; } } } #endregion #region 05.ExtendMethod public static object ToDBValue(this object value) { return value == null ? DBNull.Value : value; } public static object FromDBValue(this object dbValue) { return dbValue == DBNull.Value ? null : DBNull.Value; } #endregion }
注意:這裏的問題沒有標準答案,你們能夠本身總結,有興趣的園友能夠搜搜相關內容,並能夠在留言中發起討論。
PS:簡歷上寫的必定要熟悉,提早準備好,涉及到的技術點必定要有所瞭解。
PS:客戶端緩存、頁面緩存、數據源控件緩存、ViewState處理、自定義緩存、IIS啓用內核模式緩存和用戶模式緩存、IIS啓用壓縮、服務器端應用和數據庫分離等等;
URL傳送門:http://www.cnblogs.com/bigmonster/archive/2011/05/14/2046427.html
URL傳送門:http://blog.zhaojie.me/2011/03/my-interview-questions-for-dotnet-programmers.html
URL傳送門:http://www.cnblogs.com/anders06/archive/2011/03/04/1971078.html
URL傳送門:http://www.cnblogs.com/Creator/archive/2011/06/07/2074607.html
URL傳送門:http://www.cnblogs.com/leotsai/p/aspnet-tech-test.html
(1)SQL調優之降龍十八掌系列—鋼鐵心臟:http://www.cnblogs.com/engine1984/p/3454499.html
(2)數據庫優化實踐系列—elysee:http://www.cnblogs.com/hnlshzx/p/3506593.html
URL傳送門:http://www.cnblogs.com/yanyangtian/archive/2010/07/16/1778986.html
URL傳送門:http://www.cnblogs.com/Terrylee/archive/2006/07/17/334911.html
URL傳送門:http://www.cnblogs.com/edisonchou/p/3773828.html
轉眼之間,又是9月份了,校園招聘的浪潮又要襲來,各位即將從學校畢業的園友們,大家準備好了嗎?其實,我我的是不建議也不喜歡刷面試題的,上面這些內容我也只看了一點,不過將一少部分面試題做爲複習驗收檢測以查漏補缺仍是有必定益處的。就如我開篇所說:就算你都學習了這些題目,甚至把這些題目的回答都記住了,你也不必定能拿到offer,技術學習不是死記硬背,重在理解與思路。自從進入園子之後,就看到各路大神的技術文章,對大神們頂禮膜拜,以爲之前把什麼XX倫、XX華、XX友、XX迅啊視爲偶像簡直就是弱爆了(這裏沒有其餘意思,就是一個自嘲,請各路fans一笑而過),如今你的偶像多是XX楠、趙X、X濤、XX軍、XX陽...。可是,你可想到這些大神的牛逼也並不是一日而就,Nothing can replaces hardwork,只有一步一步的繼續努力,不知足於現狀,堅持學習(好比要想當.Net大神還得深刻.Net內部原理,閱讀大牛的經典書籍並加以實踐),善於總結(學習並非盲目的,也不是拼數量的,高效地總結所學會事半功倍),樂於分享(把學習到的東東寫成一篇篇的博客發到園子裏就是一種分享)纔會當上CTO、贏取白富美、走上人生巔峯(這句話源自:萬萬沒想到)。
對於將來,我不想過多設想,由於我智商平平,學校很渣,技術也不算好,實習經歷也很渣,但我會踏實走好每一步:我會努力地工做,也會繼續活躍在博客園,爭取翻譯一些Code Project上比較好的技術文章(不得不認可,一些印度三哥的技術文章寫得真tmd好!),也要爭取寫一些有質量的原創文章發到首頁與各位園友分享。至於未來的目標,那就是向園子裏的各位大神看齊,向他們學習,使用技術改變生活(寫得了代碼作得好產品服務於客戶),同時也要熱愛生活(下得了廚房踢得了足球無愧於心裏)。最後,借用大神老趙的一句話來作結尾,也與各位即將從學校畢業的碼農朋友們共勉:「先作人,再作技術人員,最後作程序員」。