算法面試題


上一篇博客中有原有提到分享一下面試題,最近也是才能新公司入職沒多久,忙着熟悉環境,加上前不久出去玩了一趟(順便寫了篇游記,感興趣的可以看一看)。所以一直沒時間整理博客,這段時間周末終於閑下來,就趁着周末就記錄了幾個面試過程中碰到的算法題。

本篇博客不打算介紹那些高逼格的算法(如winnow,bagging,ada boost等等),就講講最近在面試過程中遇到的算法題以及面試的時候給出的答案(出場率比較高的算法題我都列出來了,其他的就不說了)。算法可以說是解決所有問題的基石。很多東西都可以轉換為算法問題,學習算法最大的作用就是更清楚地了解了很多東西。正所謂是,知其然更知其所以然。很多人都覺得程序就是數據結構+算法+適當的注釋。不學算法,那就不要學編程了。雖然說可能沒這么誇張,因為實際上還是有很多小項目是不需要太多算法的,都是代碼一個勁的往上疊加就行了。但是就算沒那么誇張,但是作為一個程序員,邏輯思維就是算法的思路還是很重要的。---這段話是某公司一個面試官說的。

算法面試題

v寫在前面

再次重申一下,這里只是列出一些最近遇到的算法面試題,拿出來給大家分享一下面試經歷(僅是常見算法方面的經歷,還有一些不常見的就懶得列舉了,技術方向的不介紹)。還有就是我的答案。ps:無論是算法題還是答案都不具任何代表性也並非是正確答案,僅僅是我面試的時候給出的答案,只是分享而已。另外,對於我所列出的問題以及給出的答案,如果有園友有疑議或者是更好的解決辦法,那就分享出來! 寫算法是一個非常過癮的享受!

順便說一嘴,因為有一次面試面試官是在倫敦,所以只能遠程面試,我們是用collabedit,這個東東還是很受用的。 

v算法百科

----算法百科摘自百度百科(ps:不摘點介紹性的文字在這,直接開門見山的來題目。感覺有點duangduang的。性急的可以直接跳過此處!)

算法(Algorithm)是指解題方案的准確而完整的描述,是一系列解決問題的清晰指令,算法代表着用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規范的輸入,在有限時間內獲得所要求的輸出。如果一個算法有缺陷,或不適合於某個問題,執行這個算法將不會解決這個問題。不同的算法可能用不同的時間、空間或效率來完成同樣的任務。一個算法的優劣可以用空間復雜度與時間復雜度來衡量。 算法中的指令描述的是一個計算,當其運行時能從一個初始狀態和(可能為空的)初始輸入開始,經過一系列有限而清晰定義的狀態,最終產生輸出並停止於一個終態。一個狀態到另一個狀態的轉移不一定是確定的。隨機化算法在內的一些算法,包含了一些隨機輸入。 形式化算法的概念部分源自嘗試解決希爾伯特提出的判定問題,並在其后嘗試定義有效計算性或者有效方法中成形。這些嘗試包括庫爾特·哥德爾、Jacques Herbrand和斯蒂芬·科爾·克萊尼分別於1930年、1934年和1935年提出的遞歸函數,阿隆佐·邱奇於1936年提出的λ演算,1936年Emil Leon Post的Formulation 1和艾倫·圖靈1937年提出的圖靈機。即使在當前,依然常有直覺想法難以定義為形式化算法的情況。

v算法題目

  • 第一題:在一個已經排序的Int數組中,查找某個number,如果存在這個number,返回在數組的位置,反之返回-1 查看博主面試答案
  • 第二題:{"12,bob","3,sky","6,cool","1,good","22,go"},按元素第一列排序 查看博主面試答案
  • 第三題:字符串數組去除重復項 查看博主面試答案
  • 第四題:將一個未排序的整形數組進行歸置,數組中的負數移動到數組的左邊,正數移動到數組的右邊。0不動(ps:我一開做這題就打算用無腦排序搞定,結果我才開始寫,面試官就說了"這里需要提示一下,移動后的數組只是負數在左,正數在右。不一定非要用傳統的排序,如果不是傳統的排序可以加分。") 查看博主面試答案

所有答案僅供參考,並非標准或者正確答案,只是在面試的時候給出的答案而已,所以歡迎大家給出更好的答案

所有答案都是面試的時候notepad寫的,回來以后我沒有double check,直接貼出了代碼,其中有一部分我后面附加了圖。如果大家有興趣,我也建議大家可以先用notepad寫寫看,因為算法這種東西本身就是一個思路而已。沒必要用vs。

v參考答案

第一題

//------------------------------------------------------------------------------
// <copyright file="Runner.cs" company="CNBlogs Corporation" owner="請叫我頭頭哥">
//     Copyright (C) 2015-2016 All Rights Reserved
//     原博文地址: http://www.cnblogs.com/toutou/
// </copyright> 
//------------------------------------------------------------------------------
namespace TestApp
{
    using System;
    using System.Collections.Generic;
    using System.Text.RegularExpressions;
    class Runner
    {
        static void Main(string[] args)
        {
            int[] arr = { 3, 5, 6, 7, 8, 9, 14, 23, 45, 56, 63, 72, 87, 91, 92, 93, 95, 97, 98, 534, 555, 676, 878, 988, 1365 };
            int number = 555;
            int result = Search(arr, number);
            Console.WriteLine(result);
            Console.ReadKey();
        }
        public static int Search(int[] arr, int number)
        {
            int result = 0;
            if (arr == null || arr.Length == 0 || number > arr[arr.Length - 1] || number < arr[0])
            {
                result = -1;
            }
            else
            {
                result = Bisearch(arr.Length - 1, arr, number);
            }
            return result;
        }
        public static int Bisearch(int endIndex, int[] arr, int number, int startIndex = 0)
        {
            int result = 0;
            if ((endIndex - startIndex) < 2)
            {
                for (int i = startIndex; i <= endIndex; i++)
                {
                    if (arr[i] == number)
                    {
                        result = i;
                        break;
                    }
                    else
                    {
                        result = -1;
                    }
                }
            }
            else
            {
                if (arr[startIndex] <= number && number <= arr[(endIndex + startIndex) / 2])
                {
                    Bisearch((endIndex + startIndex) / 2, arr, number, startIndex);
                }
                else
                {
                    Bisearch(endIndex, arr, number, (endIndex + startIndex) / 2 + 1);
                }
            }
            return result;
        }
    }
}
關於這題我在面試回來的路上,構思了一下思路,大致是這樣的:
算法面試題
當然,我這個肯定不是最好的solution。

返回題庫第一題我有不一樣的看法

第二題

namespace TestApp
{
    using System;
    using System.Text.RegularExpressions;
    class Program
    {
        static void Main(string[] args)
        {
            string[] source = new string[] { "12,bob", "3,sky", "6,cool", "1,good", "22,go" };
            for (int i = 0; i < source.Length; i++)
            {
                for (int j = i; j < source.Length; j++)
                {
                    if (Convert.ToInt32(Regex.Match(source[i], @"\d+").Value) > Convert.ToInt32(Regex.Match(source[j], @"\d+").Value))
                    {
                        string temp = source[i];
                        source[i] = source[j];
                        source[j] = temp;
                    }
                }
            }
            for (int i = 0; i < source.Length; i++)
            {
                Console.WriteLine(source[i]);
            }
        }
    }
}
這一題我選擇的是用比較笨的正則取出數字,然后用冒泡排序完成的算法。后來回來想了想,實在是不應該啊!這里就上一張傳統的冒泡排序視覺效果圖。
算法面試題

返回題庫第二題我有不一樣的看法

第三題

namespace TestApp
{
    using System;
    class Program
    {
        static void Main(string[] args)
        {
            string[] source = { "aaa", "bbb", "aaa", "ccc", "bbb", "ddadd", "ccc", "aaa", "bbb", "ddd" };
            foreach (var item in ArrDistinct(source))
            {
                Console.WriteLine(item);
            }
        }
        public static String[] ArrDistinct(string[] source)
        {
            if (source != null && source.Length > 0)
            {
                Array.Sort(source); 
                int size = 1; 
                for (int i = 1; i < source.Length; i++)
                    if (source[i] != source[i - 1])
                        size++;
                string[] tempArr = new string[size];
                int j = 0;
                tempArr[j++] = source[0];
                for (int i = 1; i < source.Length; i++) 
                    if (source[i] != source[i - 1])
                        tempArr[j++] = source[i];
                return tempArr;
            }
            return source;
        }
    }
}
//因為這題的主要考點在字符串數組去重,所以排序我就沒太在意,直接用的系統排序。當然,這樣是很不專業的。不過如果有必要的話,這里也可以先用算法排序字符串,然后再用我這個辦法。 至於算法排序字符串,我能想到的比較"卑鄙"的辦法就只有先將字符串數組轉成char再轉成int數組,
Array.ConvertAll<string, int>(strArray, s => int.Parse(s));
//再排序,大神你有更好的辦法?有就不要藏着掖着了,來吧!

返回題庫第三題我有不一樣的看法

第四題

public int[] IntArrSort(int[] source)
        {
            if (source == null || source.Length == 0)
                return source;
            int rightIndex = source.Length - 1, tempNumber = 0;
            for (int i = 0; i < source.Length; i++)
            {
                if (i > rightIndex)
                    break;
                if (source[i] <= 0)
                {
                    continue;
                }
                else if (source[i] > 0)
                {
                    for (int j = rightIndex; j >= 0; j--)
                    {
                        if (source[j] < 0)
                        {
                            tempNumber = source[j];
                            source[j] = source[i];
                            source[i] = tempNumber;
                            rightIndex = j;
                            break;
                        }
                    }
                }
            }
            return source;
        }
算法面試題

返回題庫第四題我有不一樣的看法

v博客總結

 各位道友,以上所有的算法面試題都是我平常在面試中積累下來的,出場率比較高的我都列出來了(出場率只是相對我面試的經歷而言)。

另外:特別說明一下,我給出的算法面試題答案可能也有錯誤的,只是給出我的參考意見,算法這種東西本身就沒有什么標准答案可言,而且可能有些題目我的思路或者解題方式也不一樣對。歡迎各位道友給出更好的答案或者解題思路,共同進步!


作  者:請叫我頭頭哥
出  處:http://www.cnblogs.com/toutou/
關於作者:專注於基礎平台的項目開發。如有問題或建議,請多多賜教!
版權聲明:本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
特此聲明:所有評論和私信都會在第一時間回復。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信
聲援博主:如果您覺得文章對您有幫助,可以點擊文章右下角推薦一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM