菜鸡自己写的答案,可能答案不是特别的精确,如有大佬路过,请进行指正!
1、h头文件中的ifndef/define/endif的作用?
使用#ifndef、#define和#endif能够避免头文件的被重复定义,以便于提高编译效率
2、new delete 与malloc free 的联系和区别?
new delete与malloc free均是动态申请空间和释放内存,其中new delete是能够进C++中的分配和释放内存,malloc free再C++中也能够使用,其主要目的是兼容c语法
区别:
1new delete是操作符,malloc free 是函数
2new申请的空间是能够进行初始化,malloc申请的空间是不会初始化
3使用malloc时,需要程序员指定动态分配内存的大小,而new在只当指针类型以后,可以自动分配内存
- 已知类String的原型为:
Class String
{
Public:
String(const char* str=NULL); //普通构造函数
String(const String& rhs); //拷贝构造函数
~String(void); //析构函数
String& operator=(const String& rhs); //赋值操作符
Private:
char* m_data; //用于保存字符串
};
请编写String类的上述4个函数。
//普通构造函数
String::String(const char *str){
if (str == NULL){
m_data = new char[1];
*m_data = '\0';
}
else{
int len = strlen(str);
m_data = new char[len + 1];
strcpy(m_data, str);
}
}
//String拷贝函数
String::String(const String &other){
int len = strlen(other.m_data);
m_data = new char[len + 1];
strcpy(m_data, other.m_data);
}
//String析构函数
String::~String(void){
delete m_data;
}
//String赋值函数:
String & String::operator = (const String &other){
if (this == &other)
return *this;
if (m_data)
delete[] m_data;
int len = strlen(other.m_data);
m_data = new char[len + 1];
strcpy(m_data, other.m_data);
return *this;
}
编程1、在全球范围内,划有10000个不同大小的多边形区域。同时,我们有大量坐标点,如何高效判断坐标点所归属的区域?请写出主要思路。
思路:
利用数据结构中的图的深度遍历算法(DFS)对不同大小的区域进行遍历,以便于高效判断坐标点所归属的区域
由于有大量的坐标点,可以使用邻接矩阵存储数据,且坐标点是唯一的,初始化邻接矩阵为全-1矩阵,对10000个划分的不同区域进行深度遍历,同时对初始化的邻接矩阵的每个点的值进行修改,确定每个坐标点在哪个区域。
编程2、有n个人围成一圈,顺序排号。要求从其中淘汰掉m人,从第一个人开始循环报数(1到3报数),凡报到3的人退出圈子,直到剩余n-m人。请编写算法代码(链表实现),输出剩余人员在圈中的次序。
#include <iostream>
using namespace std;
struct ListNode {
int val; //存储数据
ListNode *next; //next指针
ListNode() : val(0), next(NULL) {} //类似构造函数
ListNode(int x) : val(x), next(NULL) {}
};
int main()
{
int count,num,delNum = 0,flag = 0;
//创建链表
ListNode *head = new ListNode();
ListNode *p=head;
cin >> count;
cin >> num;
int i=1;
while(i<count){
ListNode *node = new ListNode(i); // 初始化一个节点
node->val = i;
p->next = node;
p=p->next;
i++;
}
p->next=NULL;//最后一个节点的指针指向空
p=head;
p->val += 1;
while(p->next){
p->next->val += 1;
p = p->next;
}
while(num - delNum){
//cout<< "还有的数据需要删除:"<<num - delNum<<endl;
p = head;
while(p->next&& delNum < num){
flag++;
if((flag % 2) == 0){
ListNode *tem=p->next;
p->next=p->next->next;
//cout << "此时删除的值是:"<<tem->val<<endl;
delete tem;
delNum++;
//cout <<"已经完成删除的数据"<< delNum<<endl;
}
p=p->next;
if(p == NULL){
flag = 0;
p = head;
//cout<<"flag : " <<num - delNum<<endl;
}
}
}
网络题目1、通过信号量能沟通控制应用程序只能启动1个实例吗?为什么?控制只能启动3个如何实现?
可以只启动一个实例,因为信号量能够实现进程间的同步与互斥。
其余不会
网络题目2、简述TCP和UDP的区别。试举出几种Windows Socket的编程模型及适用场景。
TCP:是一种面向连接的、可靠的、基于字节流的传输层通信协议
UDP:是一种无连接的、不可靠的、基于报文的传输层通信协议