一、C++中引用和指针的区别
1. 指针是一个变量,存储的是一个地址,指向内存的一个存储单元;而引用跟原变量本质是一样的,只不过是原变量的一个别名
2. 指针可以为const;引用不可为const
3. 指针可以为多级;引用不可为多级;
4. 指针可以为空;引用不可为空,并且定义的时候必须初始化
5. 指针在初始化后可以改变;引用在初始化后不可改变
6. sizeof引用得到的是对象的大小;而sizeof指针是指针的大小
7. 指针和引用的自增++意义不一样
8. 指针传递的是参数的地址,可以改变实参,但不能改变指针;引用传递的是实参本身,可以同时修改引用
————————————————
二、C和C++对常量的定义区别
C++用const;C用宏定义#define
const有数据类型,编译时会做语法检查;#define只进行字符替换,没有类型检查和语法检查
————————————————
三、类和结构体的区别
C与C++中的区别:
1. C的结构体中不允许有函数出现;C++的类可以,且允许虚函数,构造函数,析构函数,this指针
2. C的结构体默认public;C++允许public,protected,private三种
3. C的结构体不可继承;C++可以继承
C++中类与结构体的区别
1. C++结构体默认public;类默认private
2. C++结构体继承默认是public;类继承默认private
————————————————
四、单链表的反转
链表节点定义:
struct ListNode{
int value;
ListNode* next;
};
反转思路1:直接操作
ListNode invert(ListNode head)
{
if (head == NULL || head -> next == NULL)
return head;
ListNode p = head -> next;
ListNode pnext = p -> next;
while(pnext != NULL){
tmp = pnext -> next;
pnext -> next = p;
p = pnext;
pnext = tmp;
}
head -> next = p;
return head;
}
反转思路2:建立新链表
ListNode invert(ListNode head)
{
if (head == NULL || head -> next == NULL)
return head;
ListNode newhead, tmp, p;
newhead -> next = head -> next;
while(head -> next != NULL){
p = head -> next;
tmp = newhead -> next;
newhead -> next = p;
newhead -> next -> next = tmp;
head -> next = p -> next;
}
delete(head)
return newhead;
}
————————————————
五、拷贝一个字符串
妈的这个给劳资死记硬背住
char * strcpy(char *dst,const char *src)
{
assert(dst != NULL && src != NULL);
char *ret = dst;
while ((*dst++=*src++)!='\0');
return ret;
}
————————————————
*六、从N个数中取出前k个最大的
3. 利用快速排序的思想,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:
七、堆和栈的区别
1.堆栈空间分配
①栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
②堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
2.堆栈缓存方式
①栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。
②堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
3.堆栈数据结构区别
①堆(数据结构):堆可以被看成是一棵树,如:堆排序。
②栈(数据结构):一种先进后出的数据结构。
————————————————
八、字符串转换为整型数
也就是atoi
保存首位的正负号
乘十+数字
int str2int(const char *str)
{
int temp = 0;
const char *ptr = str;
if (*str == '-' || *str == '+')
{
str++;
}
while(*str != 0)
{
if ((*str < '0') || (*str > '9'))
{
break;
}
temp = temp * 10 + (*str - '0');
str++;
}
if (*ptr == '-')
{
temp = -temp;
}
return temp;
}
itoa 多一位存负号,模十+0
void int2str(int n, char *str)
{
char buf[10] = "";
int i = 0;
int len = 0;
int temp = n < 0 ? -n: n;
if (str == NULL)
{
return;
}
while(temp)
{
buf[i++] = (temp % 10) + '0';
temp = temp / 10;
}
len = n < 0 ? ++i: i;
str[i] = 0;
while(1)
{
i--;
if (buf[len-i-1] ==0)
{
break;
}
str[i] = buf[len-i-1];
}
if (i == 0 )
{
str[i] = '-';
}
}
————————————————
九、将字符串中的某些子串替换
本题的考点就两条:先找所有待替换子串个数,预留出空间,然后从后往前替换