程序員面試題精選100題:51-63解題報告

程序員面試題精選100題(51)-順時針打印矩陣[算法]  

題目:輸入一個矩陣,按照從外向裏以順時針的順序依次打印出每一個數字。

例如:如果輸入如下矩陣:

1              2              3              4
5              6              7              8
9              10           11           12
13           14           15           16

則依次打印出數字1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9,5, 6, 7, 11, 10。

這題好難好麻煩的說。。。。我很難寫對。。。。

===========================================================================

程序員面試題精選100題(52)-C++面試題(1)  

毀三觀的題啊,需要看看深入C++對象了。。。。

===========================================================================

程序員面試題精選100題(55)-不用+、-、×、÷做加法[算法]  

位操作,異或模擬加法。。。。我想到的是用匯編。

===========================================================================

程序員面試題精選100題(57)-O(n)時間的排序[算法]  

計數排序。。。

===========================================================================

程序員面試題精選100題(58)-八皇后問題[算法]  

題目:在8×8的國際象棋上擺放八個皇后,使其不能相互攻擊,即任意兩個皇后不得處在同一行、同一列或者同一對角斜線上。下圖中的每個黑色格子表示一個皇后,這就是一種符合條件的擺放方法。請求出總共有多少種擺法。

 

分析:是N!種情況,不是8^8種,全排列問題,遞歸解決。。。

非遞歸:回溯???

===========================================================================

程序員面試題精選100題(59)-字符串的組合[算法]  

28題擴展裏討論過了,還是遞歸。。。。

答案的函數定義比較高端,C(n,m)形式,然後for獲取所有結果,我直接所有01情況。。。

===========================================================================

程序員面試題精選100題(60)-判斷二叉樹是不是平衡[數據結構]  

題目:輸入一棵二叉樹的根結點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意結點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。例如下圖中的二叉樹就是一棵平衡二叉樹:

 

本系列博客的第27,我們曾介紹過如何求二叉樹的深度。有了求二叉樹的深度的經驗之後再解決這個問題,我們很容易就能想到一個思路:在遍歷樹的每個結點的時候,調用函數TreeDepth得到它的左右子樹的深度。如果每個結點的左右子樹的深度相差都不超過1,按照定義它就是一棵平衡的二叉樹。這種思路對應的代碼如下:

bool IsBalanced(BinaryTreeNode*pRoot)

{

    if(pRoot== NULL)

        return true;

 

    int left =TreeDepth(pRoot->m_pLeft);

    int right =TreeDepth(pRoot->m_pRight);

    int diff = left -right;

    if(diff> 1 || diff < -1)

        return false;

 

    return IsBalanced(pRoot->m_pLeft)&& IsBalanced(pRoot->m_pRight);

}

這種遞歸會有大量重複計算,子樹深度會重複計算。

將判斷是否平衡和返回深度結合到一個函數中,只遍歷一遍求深度,相當於只求根的深度,從低向根返回。。。。,而且子樹不平衡直接返回false,避免了一些節點的計算。。。

bool IsBalanced(BinaryTreeNode*pRoot, int*pDepth)

{

    if(pRoot== NULL)

    {

        *pDepth = 0;

        return true;

    }

 

    int left, right;

    if(IsBalanced(pRoot->m_pLeft,&left)

        &&IsBalanced(pRoot->m_pRight, &right))

    {

        int diff = left -right;

        if(diff<= 1 && diff >= -1)

        {

            *pDepth = 1 + (left > right ? left: right);

            return true;

        }

    }

 

    return false;

}

===========================================================================

程序員面試題精選100題(61)-數對之差的最大值[算法]  

題目:在數組中,數字減去它右邊的數字得到一個數對之差。求所有數對之差的最大值。例如在數組{2, 4, 1, 16, 7, 5, 11, 9}中,數對之差的最大值是11,是16減去5的結果。

1.      暴力O(n^2)

2.      動態規劃。自己寫了個,分的情況太細了,雖說也對但蠻煩了。答案說的就蠻好的。

DP[i]定義爲以i爲減數的最大插值。

DP[i]=DP[i-1]+a[i-1]-a[i],i之前的最大值爲DP[i-1]+a[i-1]或者DP[i]=a[i-1]-a[i],a[i-1]爲i之前的最大值。

初始DP[0]=-無窮,

結果爲max{DP[i]}0<=i<=n

3.      分治,我發現我總是想不到,智商拙計,複雜度爲O(nlogn),不是O(n),O(t)=2O(t/2)+O(n),答案錯的。。。

4.      轉換爲最大連續和問題,想不到誒。。。。

===========================================================================

程序員面試題精選100題(63)-數組中三個只出現一次的數字[算法]  

題目:一個數組中有三個數字a、b、c只出現一次,其他數字都出現了兩次。請找出三個只出現一次的數字。

上面題的擴展,找方法三分數組。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章