1. 程式人生 > >專注於機器學習,深度學習,人臉識別領域。

專注於機器學習,深度學習,人臉識別領域。

劍指offer是比較經典的面試題目,我決定在牛客網上做一下,把沒做好的題記錄下來。

1.請實現一個函式,將一個字串中的空格替換成“%20”。例如,當字串為We Are Happy.則經過替換之後的字串為We%20Are%20Happy。

class Solution {
public:
    void replaceSpace(char *str,int length) {
        if(length<=0||str==NULL) return;
        char* temp=str;
        int lenori=0;int num=0;
        while
(*temp!='\0'){ lenori++; if(*temp==' ') num++; temp++; } int lennew=num*2+lenori; if(lennew>length) return; int indexnew=lennew; int indexold=lenori; while(indexold>=0){ if(str[indexold]==' '){ str
[indexnew--]='0'; str[indexnew--]='2'; str[indexnew--]='%'; } else { str[indexnew--]=str[indexold]; } indexold--; } } };

2.輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        return buildtree(pre,vin,0,pre.size()-1);
    }
    TreeNode* buildtree(vector<int>& pre,vector<int>& vin,int first,int end){
        if(pre.empty()||first>end) return NULL;
        int val=pre.front();
        auto mid=pre.begin();
        pre.erase(mid);
        auto it=vin.begin()+first;
        for(;it!=vin.begin()+end+1;it++){
            if(*it==val) break;
        }        
        TreeNode* root=new TreeNode(val);
        root->left=buildtree(pre,vin,first,it-vin.begin()-1);
        root->right=buildtree(pre,vin,it-vin.begin()+1,end);
        return root;

    }
};

3.輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示。

雖然這道題我ac了,但是還是值得分享一下,主要是竟然連負數也可以不斷地去掉最後一個1,這個演算法還是挺牛逼的。

class Solution {
public:
     int  NumberOf1(int n) {
         //if(n>0){
             int num=0;
             while(n){
                 n=n&(n-1);
                 num++;
             }
         //}
         return num;

     }
};

4.我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?

class Solution {
public:
    int rectCover(int number) {
        if(number<3) return number;
        int first=1,second=2,val=0;//斐波那契數列
        for(int i=3;i<=number;i++){
            val=first+second;
            first=second;
            second=val;
        }        
        return val;




    }
};

4.輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下矩陣: 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.
發現這種題還是不怎麼會做

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {

        vector<int > res;
        if(matrix.empty()||matrix[0].empty()) return res;
        int m=matrix.size();
        int n=matrix[0].size();
        int c=m>n?(n+1)/2:(m+1)/2;
        int p=m,q=n;
        for(int i=0;i<c;i++,q-=2,p-=2)
        {
            for(int col=i;col<i+q;col++)
                res.push_back(matrix[i][col]);
            for(int row=i+1;row<i+p;row++)
                res.push_back(matrix[row][i+q-1]);
            if(p==1||q==1) break;
            for(int col=i+q-2;col>=i;col--)
                res.push_back(matrix[i+p-1][col]);
            for(int row=i+p-2;row>i;row--)
                res.push_back(matrix[row][i]);
        }
        return res;
    }
};

5.定義棧的資料結構,請在該型別中實現一個能夠得到棧最小元素的min函式。
第二個棧存當前最小值,再次壓進去

#include<algorithm>
class Solution {
public:
    void push(int value) {
        minvalue=std::min(value,minvalue);
        stack1.push(value);
        stack2.push(minvalue);
    }
    void pop() {
        stack1.pop();
        stack2.pop();        
    }
    int top() {
        return stack1.top();
    }
    int min() {
        return stack2.top();
    }
private:
    stack<int> stack1;
    stack<int> stack2;
    int minvalue=INT_MAX;
};

6.輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點),返回結果為複製後複雜連結串列的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)

這道題的陷阱是 一定要把原來的連結串列恢復原狀,不能損壞原來的連結串列。

/*
struct RandomListNode {
    int label;
    struct RandomListNode *next, *random;
    RandomListNode(int x) :
            label(x), next(NULL), random(NULL) {
    }
};
*/
class Solution {
public:
    RandomListNode* Clone(RandomListNode* pHead)
    {
        if(!pHead) return pHead;        

        RandomListNode* step=pHead;
        while(step){
            RandomListNode* node=new RandomListNode(step->label);
            RandomListNode* nextnode=step->next;
            step->next=node;
            node->next=nextnode;
            step=nextnode;            
        }

        step=pHead;
        while(step){
            if(step->random)step->next->random=step->random->next;
            else step->next->random=NULL;
            step=step->next->next;

        }

        step=pHead;
        RandomListNode* newhead=new RandomListNode(0);
        RandomListNode* now=newhead;
        while(step){            
            now->next=step->next;
            if(now->next)step->next=now->next->next;//千萬注意,一定要把原來的連結串列恢復原狀,不能損壞原來的連結串列。
            now=now->next;
            step=step->next;
        }

        return newhead->next;




    }
};

7.輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。
這道題就是要調,維護一個vector 存最小的k個數,然後按照順序更新就行。

class Solution {
public:
    vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
        if(k>input.size()) return {};
        vector<int> res(k,0);
        int i=0;
        for(;i<k;i++){
            res[i]=input[i];
        }
        sort(res.begin(),res.end());
        for(;i<input.size();i++){
            int j=0;
            for(;j<k;j++){
                if(input[i]<=res[j])
                    break;
            }
            if(j<k){
                int m=0;
                for(m=k-1;m>j;m--){
                    res[m]=res[m-1];
                }
                res[j]=input[i];
            }
        }
        return res;



    }
};

8.請實現一個函式,用來判斷一顆二叉樹是不是對稱的。注意,如果一個二叉樹同此二叉樹的映象是同樣的,定義其為對稱的。

這道題不難,核心是遞迴函式的輸入時兩個,是左右。左的左,右的右。右的左,左的右。

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    bool isSymmetrical(TreeNode* pRoot)
    {
        if(!pRoot) return true;
        return solve(pRoot->left,pRoot->right);

    }
    bool solve(TreeNode* left,TreeNode* right){
        if((!left)&&(!right)) return true;
        if((left==NULL)||(right==NULL)) return false;
        if(left->val!=right->val) return false;
        return solve(left->left,right->right)&&solve(left->right,right->left);
    }

};

9.在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->4->5 處理後為 1->2->5

這道題最重要的是處理邊界條件,比較消耗時間。經驗就是凡是要考慮->next的屬性,如->next->next或者->next->val的,都要考慮->next存不存在。

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        ListNode* newhead=new ListNode(0);
        ListNode* first=pHead;
        ListNode* now=newhead;
        while(first){
            while(first&&first->next&&first->next->val==first->val){
                int mid=first->val;
                while(first&&mid==first->val)
                    first=first->next;
            }
            now->next=first;
            if(first)first=first->next;
            now=now->next;
        }
        return newhead->next;


    }
};

相關推薦

專注機器學習深度學習人臉識別領域

劍指offer是比較經典的面試題目,我決定在牛客網上做一下,把沒做好的題記錄下來。 1.請實現一個函式,將一個字串中的空格替換成“%20”。例如,當字串為We Are Happy.則經過替換之後的字串為We%20Are%20Happy。 class So

大數據、人工智能、機器學習深度學習這些到底在說什麽?

大數據 大數據學習 編程語言 大數據開發 1,大數據、人工智能、機器學習、深度學習的關系。 大數據,或者說大數據分析平臺,更具體一點就是大數據分析PaaS平臺,其實是一種針對需要處理海量數據統計分析的PaaS雲平臺。 大數據學習可以加群:199427210 如果你正在學習大數據 ,小編歡迎

讀懂人工智慧、機器學習深度學習、大資料自然語言處理……

從機器學習談起   在本篇文章中,我將對機器學習做個概要的介紹。本文的目的是能讓即便完全不瞭解機器學習的人也能瞭解機器學習,並且上手相關的實踐。這篇文件也算是EasyPR開發的番外篇,從這裡開始,必須對機器學習瞭解才能進一步介紹EasyPR的核心。當然,本文也面對一般讀者,不會

人工智慧機器學習神經網路深度學習的關係

目錄 機器學習 有監督學習和無監督學習 神經網路 剛剛接觸人工智慧的內容時,經常性的會看到人工智慧,機器學習,深度學習還有神經網路的不同的術語,一個個都很高冷,以致於傻傻分不清到底它們之間是什麼樣的關係,很多時候都認為是一個東西的不同表達而已,看了一些具體的介紹後才漸漸有了一個大

38套大資料雲端計算架構資料分析師HadoopSparkStormKafka人工智慧機器學習深度學習專案實戰視訊教程

38套大資料,雲端計算,架構,資料分析師,Hadoop,Spark,Storm,Kafka,人工智慧,機器學習,深度學習,專案實戰視訊教程 視訊課程包含: 38套大資料和人工智慧高階課包含:大資料,雲端計算,架構,資料探勘實戰,實時推薦系統實戰,電視收視率專案實戰,實時流統計專案實戰,離線電

機器學習 vs 深度學習到底有啥區別為什麼更多人選擇機器學習

機器學習和深度學習有什麼區別?讓我們從本文中尋找答案。 目標 本文中,我們將深度學習與機器學習作比較。我們將逐一瞭解他們。我們還會討論他們在各個方面的不同點。除了深度學習和機器學習的比較,我們還將研究它們未來的趨勢。 對比介紹深度學習和機器學習 一. 什麼是機器學習? 通常

機器學習深度學習系列連載: 第二部分 深度學習(十六)迴圈神經網路 4(BiDirectional RNN Highway network Grid-LSTM)

深度學習(十六)迴圈神經網路 4(BiDirectional RNN, Highway network, Grid-LSTM) RNN處理時間序列資料的時候,不僅可以正序,也可以正序+逆序(雙向)。下面顯示的RNN模型,不僅僅是simple RNN,可以是LSTM,或者GRU 1 B

機器學習深度學習系列連載: 第二部分 深度學習(十二)卷積神經網路 3 經典的模型(LeNet-5AlexNet VGGNetGoogLeNetResNet)

卷積神經網路 3 經典的模型 經典的卷積神經網路模型是我們學習CNN的利器,不光是學習原理、架構、而且經典模型的超引數、引數,都是我們做遷移學習最好的源材料之一。 1. LeNet-5 [LeCun et al., 1998] 我們還是從CNN之父,LeCun大神在98年提出的模

未明學院:機器學習vs深度學習如何規劃學習與就業路徑

自2016年以來,業界掀起一股人工智慧的熱潮。 2017年初,AlphaGo化身網路棋手Master擊敗聶衛平、柯潔、樸廷桓、井山裕太在內的數十位中日韓圍棋高手,在30秒一手的快棋對決中,無一落敗,拿下全勝,在棋界和科技界引發劇震。這使人們認識到AI(Artifical Intelligence

Java大資料機器學習深度學習學習資源

Java,大資料,機器學習,深度學習,學習資源 Java 基礎 Java 程式設計思想 Java Web 和大資料 Spark 中文文件 Storm 中文文件 Kafka 中文文件 Flink 中文文件 Beam 中

深度學習周志華機器學習西瓜書TensorFlowGoogle吳軍數學之美李航統計學習方法吳恩達深度學習筆記pdf下載

1. 機器學習入門經典,李航《統計學習方法》 2. 周志華的《機器學習》pdf 3.《數學之美》吳軍博士著pdf 4. Tensorflow 實戰Google深度學習框架.pdf 5.《TensorFlow實戰》黃文堅 高清完整PDF  6. 復旦大

人工智慧深度學習計算機視覺自然語言處理機器學習百度網盤視訊教程

人工智慧,深度學習,計算機視覺,自然語言處理,機器學習視訊教程下載: 1. CS224D 2. NLP到Word2vec 3. Opencv3影象處理 4. Tensorflow 5. 機器學習 6. 人工智慧課程 7. 聊天機器人視訊教程 8. 自然語言處理 獲取檔案下載連結

人工智能神經網絡算法機器學習深度學習三者關系

per mach sed 效果 gist 集成 支持向量機 事先 clas 對於很多初入學習人工智能的學習者來說,對人工智能、機器學習、深度學習的概念和區別還不是很了解,有可能你每天都能聽到這個概念,也經常提這個概念,但是你真的懂它們之間的關系嗎?那麽接下來就給大家從概念和

人工智慧神經網路演算法機器學習深度學習三者關係

對於很多初入學習人工智慧的學習者來說,對人工智慧、機器學習、深度學習的概念和區別還不是很瞭解,有可能你每天都能聽到這個概念,也經常提這個概念,但是你真的懂它們之間的關係嗎?那麼接下來就給大家從概念和特點上進行闡述。先看下三者的關係。   人工智慧包括了機器學習和深度學習,機器學習包括了

人工智慧機器學習深度學習之間主要有什麼差異?

如果你在科技領域,你經常會聽到人工智慧,機器學習,甚至是深度學習。怎樣才可以在正確的時間正確的使用這些詞?他們都是一樣的意思嗎?然而更多時候,人們總是混淆的使用它們。 人工智慧,機器學習和深度學習都是屬於一個領域的一個子集。但是人工智慧是機器學習的首要範疇。機器學習是深度學習的首要範疇。

機器學習大資料深度學習 競賽網站學習網站演算法刷題網站

資料競賽類網站 Kaggle 阿里巴巴天池大資料比賽 DataCastle CCF大資料與計算智慧大賽 DataFountain Di-Tech演算法大賽 KDD-Cup KDnuggets Competition 全國高校雲端計算應用創

人工智慧機器學習深度學習到底是什麼關係

一、人工智慧 人工智慧(Artificial Intelligence),英文縮寫為AI。它是研究、開發用於模擬、延伸和擴充套件人的智慧的理論、方法、技術及應用系統的一門新的技術科學。 人工智慧是電腦科學的一個分支,它企圖瞭解智慧的實質,並生產出一種新的能以人類智慧相似的

機器學習深度學習免費資料集彙總

【第一波】 目前系統整理了一些網上開放的免費科研資料集,以下是分類列表以及下載地址,供高校和科研機構免費下載和使用。 金融 美國勞工部統計局官方釋出資料 上證A股日線資料,1999.12.09 至 2016.06.08,前復權,1095支股票 深證A股日線資料,1999

人工智慧機器學習深度學習的關係;智慧演算法

人工智慧:                 是一個泛稱,包括自然學科和社會學科,以機器學習為基礎 機器學習: 是一門多領域交叉學科,涉及概

淺談數學、數學建模與人工智慧(機器學習深度學習)之間的關係?

前言:        說來也巧合,我在大學裡加入的第一個社團就是數學建模,各種各樣的社團對我沒有完全沒有吸引力,什麼舞蹈、愛心、創業、英語等,加入數學建模的原因有二:一是可以參加比賽,二是可以認識更多