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

来源:互联网 发布:淘宝卖家参加聚划算 编辑:程序博客网 时间:2024/05/16 04:57

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


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


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










原创粉丝点击