题目都是我自己写的,所以也不一定是完全正确的,因为能有很多细节没有考虑,如果大家发现了希望指正
(1)完美世界2017 删除vector中所有偶数(最想去的地方呀。。。)
void deleteEven(vector<int>& v2)
{
vector<int>::iterator Iter = v2.begin();
for (Iter; Iter != v2.end();)
{
if (*Iter == 0)
{
Iter = v2.erase(Iter);
}
else if ((*Iter) % 2 == 0)
{
Iter = v2.erase(Iter);
}
else
{
Iter++;
}
}
}
(2) 编写类String的构造函数,析构函数,拷贝构造,复制函数
已知String的原型为:
class String{
public:
String(const char* str = NULL);
~String();
String(const String& other);
String& operator = (const String& other);
private:
char* m_data;
}
代码实现如下
class String {
public:
String(const char* str = NULL)
{
if (str == NULL)
{
m_data = NULL;
return;
}
int size = strlen(str);
if (size == 0)
{
m_data = NULL;
}
else
{
m_data = (char*)malloc(size+1);
for (int i = 0; i < size; ++i)
{
m_data[i] = str[i];
}
m_data[size] = '\0';
}
}
String& operator = (const String& other)
{
int size = strlen(other.m_data);
if (size == 0)
{
m_data = NULL;
}
else
{
m_data = (char*)malloc(size + 1);
for (int i = 0; i < size; ++i)
{
m_data[i] = other.m_data[i];
}
m_data[size] = '\0';
}
return *this;
}
String(const String& other)
{
int size = strlen(other.m_data);
if (size == 0)
{
m_data = NULL;
}
else
{
m_data = (char*)malloc(size + 1);
for (int i = 0; i < size; ++i)
{
m_data[i] = other.m_data[i];
}
m_data[size] = '\0';
}
}
~String()
{
free(m_data);
}
void Show()
{
cout << m_data<<endl;
}
private:
char* m_data;
};
(3)如何判断一个链表是否有环以及返回他的出口
bool Circle(Node* list,Node** In)
{
Node* tmp1 = list->next;
Node* tmp2 = list->next;
while (tmp1!=NULL&&tmp1->next!=NULL&&tmp2!=NULL)
{
tmp1 = tmp1->next;
tmp2 = tmp2->next->next;
if (tmp1 == tmp2)
{
break;
}
}
if (tmp1 == NULL || tmp1->next == NULL || tmp2 == NULL)
{
In = NULL;
return false;
}
tmp1 = list->next;
while (tmp1 != tmp2)
{
tmp1 = tmp1->next;
tmp2 = tmp2->next;
}
*In = tmp1;
return true;
}
(4)三种页面调度算法
FIFO:先进先出页面置换算法,创建一个FIFO队列来管理内存中的所有页。
LRU:是最近最少使用页面置换算法(Least Recently Used),也就是首先淘汰最长时间未被使用的页面
LFU:是最近最不常用页面置换算法(Least Frequently Used),也就是淘汰一定时期内被访问次数最少的页
(5)写出至少三种常见的设计模式,并简单介绍其用法或目的:
1)观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象,在它的状态发生变化时,会通知所有的观察者。
2)代理模式:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
3)模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
(6)三种排序
快速排序:选择数组的第一个数作为主元,把所有比它小的数移到它的左边,所有比它大的数移到它的右边。以此递归该操作,直到整个数组有序。
归并排序:将数组划分为两半,对每一半递归地进行归并排序,当两个子列表都已排序完毕,将它们合并为一个有序列表。
堆排序:堆排序的过程是先建立一个大根堆,大根堆的要求是每个节点的值都不大于其父节点的值。然后把根节点与最后一个叶子节点互换,再重新建立最大堆。递归执行,直到遍历完整个数组。
快速排序适用于原数组是无序、随机分布的,归并排序适用于要求排序稳定的场景,堆排序的最差情况下复杂度也为O(nlgn),适用于对最差情况下复杂度有要求的场景。