c++後臺開發面試備戰筆記 (網絡上的素材.整理)

  • i++和++i的區別        略
  • new和malloc的區別   略
  • c++的多態性是如何實現的?虛函數表是什麼?       

https://www.cnblogs.com/cxq0017/p/6074247.html

個人認爲模板函數/函數重載也有點相似把.

  • c++繼承中,父類和子類的構造函數和析構函數的調用順序

構造先父後子,析構相反.

  • c++內存分爲哪幾塊,分別存儲什麼變量
1、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。 
2、堆區(heap) — 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表,呵呵。 
3、全局區(靜態區)(static)—,全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。 - 程序結束後有系統釋放 
4、文字常量區—常量字符串就是放在這裏的。 程序結束後由系統釋放 
5、程序代碼區—存放函數體的二進制代碼。 
  • 解釋一下智能指針是什麼?功能?

  • c++的STL中,有哪幾種容器?

map,set,queue,stack,priority_queue,list,vector......

 

  • 棧和隊列的區別

  • 平衡二叉樹如何構造

如果是平衡二叉搜索樹的話,旋轉

  • 鏈表中刪除一個結點操作

  • 個人對於數據結構的認識,可以結合實際談談

  • (數據庫)索引是什麼,作用以及採用的數據結構

https://www.cnblogs.com/tgycoder/p/5410057.html

  • 數據庫優化的方法

3、分析下面代碼有什麼問題。如果讓你修改,你會怎麼改。

class A
{
public:
    A(int x)
    {
        p=new int(x);
    }
    ~A()
    {
        delete p;
    }
private:
    int *p;
};
A& f(A &a)
{
    return a;
}
int main()
{
    A a(10);
    A b=f(a);
    return 0;
}

答:沒有定義賦值構造函數,使用默認的賦值構造函數會導致p指針沒有被賦予空間.

修改:定義賦值構造函數

#include<bits/stdc++.h>
using namespace std;
class A
{
public:
    A(int x)
    {
        p=new int(x);
        cout<<"create"<<x<<endl;
    }
    A(A& a)
    {
        p=new int(*a.p);
        cout<<"copy"<<*p<<endl;
    }
    ~A()
    {
        cout<<"delete"<<*p<<endl;
        delete p;
    }
private:
    int *p;
};
A& f(A &a)
{
    return a;
}
int main()
{
    A a(10);
    A b=f(a);
    return 0;
}

給你一些不確定數量(n個)的排序好的數組,數組長度爲k,怎樣把他們合併成一個有序數組,時間複雜度是多少?

歸併排序的思路, 不過這是多路歸併,,使用堆來維護所有數列第一個數字的大小順序.n*k次入堆,n*k次出堆所以複雜度爲n*klog(n*k).

#include<bits/stdc++.h>
using namespace std;
int const maxn=1000;
int const maxk=1000;
int co[maxn][maxk];
int ptr[maxn];
struct node{
    int i,v;
};
bool operator<(node a,node b)
{
    return a.v>b.v;
}
int ans[maxn*maxk];
int main()
{
    int n,k;
    cin>>n>>k;
    if(n*k==0)
    {
        return 0;
    }
    priority_queue<node>que;
    while(que.empty()==0)
        que.pop();
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<k;j++)
        {
            scanf("%d",&co[i][j]);
        }
        ptr[i]=1;
    }
    node t;
    for(int i=0;i<n;i++)
    {
        t.v=co[i][0];
        t.i=i;
        que.push(t);
    }
    int p=0;
    while(que.empty()==0)
    {
        t=que.top();
        que.pop();
        cout<<"pop  v:"<<t.v<<" i:"<<t.i<<endl;
        ans[p++]=t.v;
        if(ptr[t.i]<k)
        {
            t.v=co[t.i][ptr[t.i]++];
            cout<<"push v:"<<t.v<<" i:"<<t.i<<endl;
            que.push(t);
        }
    }
    for(int i=n*k-1;i>=0;i--)
    {
        printf("%d ",ans[i]);
    }
    cout<<endl;
}















extern "C"是什麼意思   詳解:https://blog.csdn.net/gao1440156051/article/details/52073925 

C++11有哪兒些智能指針? 智能指針的基本用法 筆記   還有unique_ptr

1.世界盃開幕式會在球場C舉行,球場C的球迷看臺可以容納M*N個球迷。在球場售票完成後,現官方想統計此次開幕式一共有多少個球隊球迷羣體,最大的球隊球迷羣體有多少人。

經調研發現,球迷羣體在選座時有以下特性:

同球隊的球迷羣體會選擇相鄰座位,不同球隊的球迷羣體會選擇不相鄰的座位(註解:相鄰包括前後相鄰,左右相鄰,斜對角相鄰)

給定一個M*N的二維球場,0代表該位置沒有坐人,1代表該位置已有選擇,希望輸出球隊羣體個數P,最大的球隊羣體人數Q

輸入描述:

第一行,2個數字,M及N,使用英文逗號分隔

接下來M行,每行N的數字,使用英文逗號分隔

輸出描述:

一行,2個數字,P及Q,使用英文逗號分隔

其中P表示球隊羣體個數,Q表示最大的球隊羣體人數

例:輸入

10,10

0,0,0,0,0,0,0,0,0,0

0,0,0,1,1,0,1,0,0,0

0,1,0,0,0,0,0,1,0,1

1,0,0,0,0,0,0,0,1,1

0,0,0,1,1,1,0,0,0,1

0,0,0,0,0,0,1,0,1,1

0,1,1,0,0,0,0,0,0,0

0,0,0,1,0,1,0,0,0,0

0,0,1,0,0,1,0,0,0,0

0,1,0,0,0,0,0,0,0,0

輸出:6,8
參考答案: BFS/DFS,,,另外幷查集也可以做

DFS/BFS跟計算聯通塊個數一樣,遍歷矩陣,遇到隊員就進行搜索,標記已經被搜索過的(不重複搜索).同時記錄個數就好了.

代碼略,參考這個題:

https://vjudge.net/contest/283019#problem/A(如果不可用請用下面的鏈接)

http://acm.hdu.edu.cn/showproblem.php?pid=1241

2.爲了提高文章質量,每一篇文章(假設全部都是英文)都會有m民編輯進行審覈,每個編輯獨立工作,會把覺得有問題的句子通過下表記錄下來,比如[1,10],1表示病句的第一個字符,10表示病句的最後一個字符。也就是從1到10着10個字符組成的句子,是有問題的。

現在需要把多名編輯有問題的句子合併起來,送個總編輯進行最終的審覈。比如編輯A指出的病句是[1,10],[32,45];編輯B指出的病句是[5,16],[78,94]那麼[1,10]和[5,16]是有交叉的,可以合併成[1,16][32,45][78,94]

輸入描述:

編輯數量m,之後每行是每個編輯的標記的下表組合,第一個和最後一個下標用英文逗號分隔,每組下標之間用分號分隔

輸出描述:

合併後的下標集合,第一個和最後一個下標用英文逗號分隔,每組下標之間用分號分隔。返回結果是從小到大遞增排列

例:輸入

3

1,10;32,45

78,94;5,16

80,100;200,220;16,32

輸出: 1,45;78,100;200,220
 

參考答案: 貪心... 經典的線段重合問題.

按照左端點排序, 我們拿出最左端的線段作爲基準(稱爲A線段).左端點小於等於A.右端點的線段一定跟他重合,否則一定不重合.

然後取A和跟它重合的線段的右端點最大值就是合併後線段的右端點. 

排序O(nlogn),合併O(n) , 所以最終O(nlogn).

代碼略.

 

  

 

n個整數的無序數組,找到每個元素後面比它大的第一個數,要求時間複雜度爲O(N),

經典的單調棧.......難度有點高吧,要不是恰好學過單調棧豈不是涼涼.

#include<bits/stdc++.h>
using namespace std;
int const maxn=1e8;
int main()
{
    int co[]={1,2,3,1,9,21,7,3,4,2,6,INT_MAX};
    int n=sizeof(co)/sizeof(int);
    stack<int>que;
    stack<int>idx;
    que.push(INT_MAX);
    idx.push(-1);
    int ans[100];

    for(int i=0;i<n;i++)
    {
        while(que.top()<co[i])
        {
            ans[idx.top()]=i;
            idx.pop();
            que.pop();
        }
        que.push(co[i]);
        idx.push(i);
    }
    for(int i=0;i<n-1;i++)
    {
        printf("%3d ",co[i]);
    }
    cout<<endl;
    for(int i=0;i<n-1;i++)
    {
        if(co[ans[i]]==INT_MAX)
        {
            cout<<"non ";
        }
        else printf("%3d ",co[ans[i]]);
    }
    cout<<endl;
}

單鏈表,判環,計算環周長,判環入口

求二叉樹:二叉樹最近公共祖先(LCA)問題 和 /節點最大距離問題.

 

7、進程間通信方式和線程間通信方式

答:(1)進程間通信方式:

# 管道( pipe ):管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關係的進程間使用。進程的親緣關係通常是指父子進程關係。

# 信號量( semophore ) : 信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作爲一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作爲進程間以及同一進程內不同線程之間的同步手段。


# 消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩衝區大小受限等缺點。

# 共享內存( shared memory ) :共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號兩,配合使用,來實現進程間的同步和通信。


# 套接字( socket ) : 套解口也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同及其間的進程通信。

(2)線程間通信方式:

#全局變量;

#Messages消息機制;

#CEvent對象(MFC中的一種線程通信對象,通過其觸發狀態的改變實現同步與通信)。
--------------------- 
作者:空山明月_Blog 
來源:CSDN 
原文:https://blog.csdn.net/xiongchao99/article/details/73381280/ 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

 

 

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