一面
代码题:括号匹配(LeetCode原题)( LeetCode 20 )
//自己写的~
#include <algorithm>
#include <iostream>
#include <stack>
#include <string>
using namespace std;
bool isvalid(string &s)
{
stack<char> stk;
for(int i = 0 ; i < s.size(); i++)
{
if(stk.empty() || s[i] =='(')
{
stk.push(s[i]);
}
else if(s[i] == ')')
{
if(stk.top() != '(')
{
return false;
}
else
stk.pop();
}
}
return stk.empty();
}
int main()
{
string s;
cin >> s;
bool flag = isvalid(s);
if(flag)
cout << "true"<<endl;
else
{
cout << "false"<<endl;
}
return 0;
}
项目详细介绍
select和epoll的区别?
select底层是用数组实现,有最大文件描述符限制,而epoll底层使用红黑树实现,突破了最大文件描述符的限制。
select采用轮询的方式,而epoll则使用回调的方式…
二面
代码题1:生成一个m到n的随机数
int get_random(int m, int n)
{
int t = rand();
if(t < m)
{
return (t + m)%m + m;
}
else if(t > n)
{
return (t % n) + m;
}
else return t;
}
代码题2:斐波那契数列递归写法
int f(int n)
{
if(n == 1)
return 1;
if(n == 2)
return 1;
return f(n-1)+f(n-2);
}
代码题3:实现一个string类,构造函数,拷贝构造函数,拷贝赋值运算符
//这个好像写的不太好,但也能跑通...
class String{
public:
String(int n=1);
String(const char *s);
String(const String &s);
~String();
// private:
char *m_char;
};
String::String(int n)
{
if(n == 1)
{
m_char = new char[1];
m_char[0]='\0';
}
else
{
m_char = new char[n+1];
}
}
String::String(const char *s)
{
int len = strlen(s);
m_char = new char[len+1];
for(int i = 0; i <= len; i++)
m_char[i] = s[i];
}
String::String(const String &s)
{
if(s.m_char == NULL)
return ;
int len = strlen(s.m_char);
m_char = new char[len+1];
strcpy(m_char, s.m_char);
}
String::~String()
{
delete[] m_char;
}
C++重载和重写的区别
重载overload:在同一个类中,函数名相同,参数列表不同,编译器会根据这些函数的不同参数列表,将同名的函数名称做修饰,从而生成一些不同名称的预处理函数,未体现多态。
重写override:也叫覆盖,子类重新定义父类中有相同名称相同参数的虚函数,主要是在继承关系中出现的,被重写的函数必须是virtual的,重写函数的访问修饰符可以不同,尽管virtual是private的,子类中重写函数改为public,protected也可以,体现了多态。
拓展:隐藏
重定义redefining:也叫隐藏,子类重新定义父类中有相同名称的非虚函数,参数列表可以相同可以不同,会覆盖其父类的方法,未体现多态。
a如果派生类的函数和基类的函数同名,但是参数不同,此时,不管有无virtual,基类的函数被隐藏。
b如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有vitual关键字,此时,基类的函数被隐藏。(如果有virtual就成重写了)
C++智能指针
shared_ptr:允许多个指针指向同一个对象。每个shared_ptr都要一个关联的计数器,称为引用计数。无论何时,我们拷贝一个shared_ptr,计数器都会递增。当我们给shared_ptr赋予一个新值或是shared_ptr被销毁时,计数器就会递减。一旦计数器变成0,就会自动释放自己所管理的对象。
unique_ptr则独占所指向的对象。某个时刻只能有一个unique_ptr指向一个给定对象。当unique_ptr被销毁时,它所指向的对象也被销毁。当我们定义一个unique_ptr时,需将其绑定到一个new返回的指针上,直接初始化。
weak_ptr伴随类,是一种弱引用,指向shared_ptr所管理的对象。不会改变shared_ptr的引用计数。