- 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/
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!