面试必会函数源代码

笔试面试必会代码


链表:

在链表中找到第一个含有某值的节点并删除该结点

从头到尾打印链表

合并两个排序链表

反转链表

链表中倒数第k个结点

O(1)时间删除链表结点

复杂链表的复制

两个链表的第一个公共结点

 

二叉树:

深度优先遍历

广度优先遍历

求二叉树的深度和宽度或者面积

重建二叉树

判断树a是不是树b的子结构

二叉树镜像

从上往下打印二叉树

二叉树的后序遍历序列

二叉树中和为某一值的路径

二叉搜索树变成双向链表

 

字符串:

Strstr(kmp)

Strcmp

Strcpy

Memcpy

字典树

线段树

后缀树判断最长重复子串

字符串中替换空格

字符串的全排列

翻转单词顺序/左旋转字符串

字符串转化成整数

 

其他数据结构:

两个栈实现队列

两个队列实现一个栈

包含min函数的栈

栈的压入弹出序列

 

算法:

Quick sort

二进制中1的个数

二维数组中的数的查找

旋转数组中的最小数字

打印1到最大n位数(数组模拟)

调整数组顺序使奇数位于偶数前面

顺时针打印矩阵

数组中次数超过一半的数字

最小的k个数

数组排成最小的数

丑数

数组中第一个只出现一个的字符

数组中的逆序对

数在数组中出现的次数

数组中一个只出现一次的数字(其他都出现两次)

数组中两个只出现一次的数字(其他都出现两次)

数组中三个只出现一次的数字(其他都出现两次)

数组中和威s额两个数字/和为s的连续正数序列

N个骰子的点数

扑克牌的顺子

圆圈中最后剩下的数字(约瑟夫环)

 

动态规划:

求一个序列的最大连续子序列乘积

连续数组的最大和

 

 

C++特性:

不用for while if else switch case 以及 ?: 求1+2+……+n的的和

深拷贝与浅拷贝

设计一个不能被继承的类

内存分配的代码

手动修改栈空间

不用sizeof如何判断操作系统是16位还是32位

大小端

不用+号进行加法运算

不用/号进行除法运算

 

设计模式:

实现一个单例模式


必看书籍


必看:

《剑指offer》 《编程之美》 《程序员面试笔试宝典》

选看:

《算法导论》 《tcp/ip详解 卷一》 《unix环境高级编程》 《算法导论》 《编程珠玑》

c++:

《effective C++》

java:

《effective java》 《java编程思想》

python:

《python基础教程》 《Head First Python》





一、写在前面

        继上一次发表了一片关于参加秋招的学弟学妹们如何准备找工作的博客之后,反响很大,顾在此整理一下,以便大家复习。好多源自july的这篇博客,也有很多是我自己整理的。希望大家能够一遍一遍的写,直到能够秒杀为止。


二、stl模板函数


    1、strcpy

  1. char * strcpy( char *strDest, const char *strSrc )          
  2. {         
  3.     if(strDest == strSrc) { return strDest; }      
  4.     assert( (strDest != NULL) && (strSrc != NULL) );         
  5.     char *address = strDest;          
  6.     while( (*strDest++ = * strSrc++) != '\0' );          
  7.     return address;         
  8. }    

    2、strncpy

  1. <span style="font-size:18px;">char *strncpy(char *strDes, const char *strSrc, unsigned int count)          
  2. {          
  3.     assert(strDes != NULL && strSrc != NULL);          
  4.     char *address = strDes;          
  5.     while (count-- && *strSrc != '\0')          
  6.         *strDes++ = *strSrc++;       
  7.     *strDes = '\0';      
  8.     return address;          
  9. } </span>  


    3、strcmp

  1. int strcmp(const char *s, const char *t)       
  2. {       
  3.     assert(s != NULL && t != NULL);       
  4.     while (*s && *t && *s == *t)       
  5.     {       
  6.         ++ s;       
  7.         ++ t;       
  8.     }       
  9.     return (*s - *t);       
  10. }   

    4、strcat

  1. char *strcat(char *strDes, const char *strSrc)       
  2. {       
  3.     assert((strDes != NULL) && (strSrc != NULL));       
  4.     char *address = strDes;       
  5.     while (*strDes != '\0')       
  6.         ++ strDes;       
  7.     while ((*strDes ++ = *strSrc ++) != '\0')       
  8.         NULL;       
  9.     return address;       
  10. }   

    5、strlen

  1. int strlen(const char *str)       
  2. {       
  3.     assert(str != NULL);       
  4.     int len = 0;       
  5.     while (*str ++ != '\0')       
  6.         ++ len;       
  7.     return len;       
  8. }    

    6、strstr

  1. char *strstr(const char *strSrc, const char *str)       
  2. {       
  3.     assert(strSrc != NULL && str != NULL);       
  4.     const char *s = strSrc;       
  5.     const char *t = str;       
  6.     for (; *strSrc != '\0'; ++ strSrc)       
  7.     {       
  8.         for (s = strSrc, t = str; *t != '\0' && *s == *t; ++s, ++t)       
  9.             NULL;       
  10.         if (*t == '\0')       
  11.             return (char *) strSrc;       
  12.     }       
  13.     return NULL;       
  14. }     

    7、strncat

  1. char *strncat(char *strDes, const char *strSrc, unsigned int count)       
  2. {       
  3.     assert((strDes != NULL) && (strSrc != NULL));       
  4.     char *address = strDes;       
  5.     while (*strDes != '\0')       
  6.         ++ strDes;       
  7.     while (count -- && *strSrc != '\0' )       
  8.         *strDes ++ = *strSrc ++;       
  9.     *strDes = '\0';       
  10.     return address;       
  11. }  

    8、strncmp

  1. int strncmp(const char *s, const char *t, unsigned int count)       
  2. {       
  3.     assert((s != NULL) && (t != NULL));       
  4.     while (*s && *t && *s == *t && count --)       
  5.     {       
  6.         ++ s;       
  7.         ++ t;       
  8.     }       
  9.     return (*s - *t);       
  10. }  

    9、memcpy

  1. void *memcpy(void *dest, const void *src, unsigned int count)       
  2. {       
  3.     assert((dest != NULL) && (src != NULL));       
  4.     void *address = dest;       
  5.     while (count --)       
  6.     {       
  7.         *(char *) dest = *(char *) src;       
  8.         dest = (char *) dest + 1;       
  9.         src = (char *) src + 1;       
  10.     }       
  11.     return address;       
  12. }   

    10、memccpy

  1. void *memccpy(void *dest, const void *src, int c, unsigned int count)       
  2. {       
  3.     assert((dest != NULL) && (src != NULL));       
  4.     while (count --)       
  5.     {       
  6.         *(char *) dest = *(char *) src;       
  7.         if (* (char *) src == (char) c)       
  8.             return ((char *)dest + 1);       
  9.         dest = (char *) dest + 1;       
  10.         src = (char *) src + 1;       
  11.     }       
  12.     return NULL;       
  13. }   

    11、memcmp

  1. int memcmp(const void *s, const void *t, unsigned int count)       
  2. {       
  3.     assert((s != NULL) && (t != NULL));       
  4.     while (*(char *) s && *(char *) t && *(char *) s == *(char *) t && count --)       
  5.     {       
  6.         s = (char *) s + 1;       
  7.         t = (char *) t + 1;       
  8.     }       
  9.     return (*(char *) s - *(char *) t);       
  10. }  

    12、memmove

  1. //@big:      
  2. //要处理src和dest有重叠的情况,不是从尾巴开始移动就没问题了。      
  3. //一种情况是dest小于src有重叠,这个时候要从头开始移动,      
  4. //另一种是dest大于src有重叠,这个时候要从尾开始移动。      
  5. void *memmove(void *dest, const void *src, unsigned int count)       
  6. {      
  7.     assert(dest != NULL && src != NULL);      
  8.     char* pdest = (char*) dest;      
  9.     char* psrc = (char*) src;      
  10.     
  11.     //pdest在psrc后面,且两者距离小于count时,从尾部开始移动. 其他情况从头部开始移动      
  12.     if (pdest > psrc && pdest - psrc < count)       
  13.     {      
  14.         while (count--)       
  15.         {      
  16.             *(pdest + count) = *(psrc + count);      
  17.         }      
  18.     } else       
  19.     {      
  20.         while (count--)       
  21.         {      
  22.             *pdest++ = *psrc++;      
  23.         }      
  24.     }      
  25.     return dest;      
  26. }    

    13、memset

  1. void *memset(void *str, int c, unsigned int count)       
  2. {       
  3.     assert(str != NULL);       
  4.     void *s = str;       
  5.     while (count --)       
  6.     {       
  7.         *(char *) s = (char) c;       
  8.         s = (char *) s + 1;       
  9.     }       
  10.     return str;       
  11. }  


三、atoi && itoa


    1、atoi

  1. //代码自己所写,不对地方请及时指正,谢谢!  
  2. //inf用来标记作为判断是否越界  
  3. //atoiFlag作为是否是正确结果的返回值  
  4. const __int64 inf = (0x7fffffff);  
  5. int atoiFlag;  
  6. int atoi(const char* ch)  
  7. {  
  8.     ASSERT(ch != NULL);  
  9.     atoiFlag = false;  
  10.     while (*ch == ' ' || *ch == '\t')  
  11.         ch ++;  
  12.     int isMinus = 1;  
  13.     if (*ch == '-')  
  14.     {  
  15.         isMinus = -1;  
  16.         ch ++;  
  17.     }  
  18.     else if (*ch == '+')  
  19.     {  
  20.         ch ++;  
  21.     }  
  22.     //判断非法  
  23.     if (!(*ch <= '9' && *ch >= '0'))  
  24.         return 0;  
  25.     __int64 ans = 0;  
  26.     while (*ch && *ch <= '9' && *ch >= '0')  
  27.     {  
  28.         ans *= 10;  
  29.         ans += *ch - '0';  
  30.         //判断越界  
  31.         if (ans > inf)  
  32.         {  
  33.             return inf;  
  34.         }  
  35.         ch ++;  
  36.     }  
  37.     ans *= isMinus;  
  38.     atoiFlag = true;  
  39.     return (int)ans;  
  40. }  
  41.   
  42. //如何使用  
  43. int main()  
  44. {  
  45.     char a[100];  
  46.     while (scanf("%s", a) != EOF)  
  47.     {  
  48.         int ans = atoi(a);  
  49.         if (atoiFlag)  
  50.             printf("%d\n", ans);  
  51.         else if (ans == inf)  
  52.             puts("The data of crossing the line");  
  53.         else  
  54.             puts("Not is a integer");  
  55.     }  
  56.     return 0;  
  57. }  



    2、itoa

  1. #include <stdlib.h>   
  2. #include <stdio.h>   
  3. char *myitoa(int num,char *str,int radix);  
  4. int main()   
  5. {   
  6.     int number = -123456;   
  7.     char string[25];   
  8.     myitoa(number, string, 16);   
  9.     printf("integer = %d string = %s\n", number, string);   
  10.     return 0;   
  11. }   
  12. /* 实现itoa函数的源代码 */   
  13. char *myitoa(int num,char *str,int radix)   
  14. {    
  15.     /* 索引表 */   
  16.     char index[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";   
  17.     unsigned unum; /* 中间变量 */   
  18.     int i=0,j,k;   
  19.     /* 确定unum的值 */   
  20.     if(radix==10&&num<0) /* 十进制负数 */   
  21.     {   
  22.         unum=(unsigned)-num;   
  23.         str[i++]='-';   
  24.     }   
  25.     else unum=(unsigned)num; /* 其他情况 */   
  26.     /* 逆序 */   
  27.     do    
  28.     {   
  29.         str[i++]=index[unum%(unsigned)radix];   
  30.         unum/=radix;   
  31.     }while(unum);   
  32.     str[i]='\0';   
  33.     /* 转换 */   
  34.     if(str[0]=='-') k=1; /* 十进制负数 */   
  35.     else k=0;   
  36.     /* 将原来的“/2”改为“/2.0”,保证当num在16~255之间,radix等于16时,也能得到正确结果 */   
  37.     char temp;   
  38.     for(j=k;j<=(i-k-1)/2.0;j++)   
  39.     {   
  40.         temp=str[j];   
  41.         str[j]=str[i-j-1];   
  42.         str[i-j-1]=temp;   
  43.     }   
  44.     return str;   
  45. }   


四、kmp  &&  quicksort


    1、kmp

  1. void getNext(const char* p, int next[])  
  2. {  
  3.     next[0] = -1;  
  4.     int index = 0;  
  5.     int p_l = strlen(p);  
  6.     for (int i=1; i<p_l; i++)  
  7.     {  
  8.         index = next[i-1];  
  9.         while (index >= 0 && p[index+1] != p[i])  
  10.         {  
  11.             index = next[index];  
  12.         }  
  13.         if (p[index+1] == p[i])  
  14.         {  
  15.             next[i] = index + 1;  
  16.         }  
  17.         else  
  18.         {  
  19.             next[i] = -1;  
  20.         }  
  21.     }  
  22. }  
  23.   
  24. int kmp(const char* t, const char* p)  
  25. {  
  26.     const int t_l = strlen(t);  
  27.     const int p_l = strlen(p);  
  28.     int Next = new int[p_l + 1];  
  29.     getNext(p, Next);  
  30.     int p_index = 0, t_index = 0;  
  31.       
  32.     int cnt = 0;  
  33.       
  34.     while (p_index < p_l && t_index < t_l)  
  35.     {  
  36.         if (t[t_index] == p[p_index])  
  37.         {  
  38.             t_index ++;  
  39.             p_index ++;  
  40.         }  
  41.         else if (p_index == 0)  
  42.         {  
  43.             t_index ++;  
  44.         }  
  45.         else  
  46.         {  
  47.             p_index = Next[p_index-1] + 1;  
  48.         }  
  49.         if (p_index == p_l)  
  50.         {  
  51.             cnt ++;  
  52.             p_index = Next[p_index-1] + 1;  
  53.         }  
  54.     }  
  55.     delete[] Next;  
  56.     return cnt;  
  57. }  



    2、quicksort


  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <time.h>  
  4.   
  5. int partion(int a[], int p, int r)  
  6. {  
  7.     srand((unsigned)time(NULL));  
  8.     int e = rand()%(r-p+1)+p;  
  9.     int tmp = a[e];  
  10.     a[e] = a[r];  
  11.     a[r] = tmp;  
  12.     int x = a[r];  
  13.     int i, j;  
  14.     i = p;  
  15.     for (j=p; j<r; j++)  
  16.     {  
  17.         if (a[j] <= x)  
  18.         {  
  19.             tmp = a[i];  
  20.             a[i] = a[j];  
  21.             a[j] = tmp;  
  22.             i ++;  
  23.         }  
  24.     }  
  25.     tmp = a[r];  
  26.     a[r] = a[i];  
  27.     a[i] = tmp;  
  28.     return i;  
  29. }  
  30.   
  31. void QuickSort(int a[], int p, int r)  
  32. {  
  33.     if (p < r)  
  34.     {  
  35.         int q = partion(a, p, r);  
  36.         QuickSort(a, p, q-1);  
  37.         QuickSort(a, q+1, r);  
  38.     }  
  39. }  
  40.   
  41. int main()  
  42. {  
  43.     int a[] = {1,2,3,-1,5,-9,10,33,0};  
  44.     QuickSort(a, 0, 8);  
  45.     for (int i=0; i<9; i++)  
  46.     {  
  47.         printf("%d\t", a[i]);  
  48.     }  
  49.     return 0;  
  50. }  



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值