面试编程知识+算法题总结(一)

一、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个最大的

1. 直接排序,复杂度为nlogn
2. 每次从数组中取出最大,取k次,复杂度为N*K,可以看做上界

3. 利用快速排序的思想,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:

           1. Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数;
           2. Sa中元素的个数大于等于k,则返回Sa中的第k大数。
          利用快排的partion思想 T(n) = 2T(n/2) + O(1)   时间复杂度为O(n) 
4. 利用堆排序的思想,取大根堆的前k个数,时间复杂度为O(n)+k*O(logn)
————————————————

七、堆和栈的区别


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] = '-';       
    }
}

————————————————


九、将字符串中的某些子串替换


本题的考点就两条:先找所有待替换子串个数,预留出空间,然后从后往前替换


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值