笔试
yanjiangbo
后端开发工程师(PHP PYTHON GO)
展开
-
求数组中连续子数组的最大值
问题: 求解数组中连续一段子数组和的最大值。例如:{31,-41,59,26,-53,58,97,-93,-23,84},最大值为59+26-53+58+97=187思路: 计算出任意i到j之间连续子数组的和再比较必然能得到最大值,但时间复杂度为O(n^2),我们希望能找出线性时间的算法。 我们注意到,假如数组中全为正数,那么最大和必然为全部数相加;如果原创 2013-08-23 18:37:50 · 1126 阅读 · 1 评论 -
【链表】反转单链表
比如单链表A -> B -> C -> D -> E -> F -> NULL 反转得到 F -> E -> D -> C -> B -> A -> NULL 【算法一】最通用的算法,对于当前要反转的节点,在反转过程中牵扯到3个节点:前继节点(pPre)、当前节点(pCur)、后继结点(pNext),当然在算法实现的过程中有时候多增加一些变量能带来事半功倍的效果,在这里我们额外定义一原创 2012-07-05 10:53:30 · 619 阅读 · 0 评论 -
【链表】merge两个非递减的链表为一个非递减的链表
void MergeList(LinkList *la, LinkList *lb, LinkList *lc){ LinkList *pa,*pb,*pc; lc = pc = la; pa = la->next; pb = lb->next; while(pa != NULL && pb !=NULL) { if(pa->data data) { pc->nex原创 2013-08-23 14:27:39 · 923 阅读 · 0 评论 -
二路归并排序
#include void MergeArray(int a[],int s,int m,int t){ int i = s; int j = m+1; int tmp[t+1]; int k=0; while(i<=m && j<=t) { if(a[i] <= a[j]) { tm原创 2013-10-10 10:47:49 · 699 阅读 · 0 评论 -
二分查找算法
BinarySearch原创 2011-07-08 15:48:12 · 502 阅读 · 0 评论 -
一些字符串及内存操作函数的实现
#include char *_strcpy(char *dest, const char *src){ //assert(dest != NULL && src != NULL); char *p = dest; while(*src != '\0') { *dest++ = *src++; } return p;}原创 2013-10-12 17:11:54 · 942 阅读 · 0 评论 -
字符串 --- 循环移位问题
字符串循环移位问题是面试中比较容易遇到的,就是输入一个字符串和一个整数,原地输出移位后的字符串。不同的考官可能对程序的具体要求不同,这里要求空间复杂度为O(1)。这里给出两种解答方法。(1)将移动n位看做“每次移动一位,共操作n次”,这是一种化整为零的思维方法。只要能想到这一步,相信下面的代码就不难写出了: 1 void shift_1(char* str)原创 2013-10-15 16:50:25 · 939 阅读 · 0 评论 -
辗转相除法求两个数的最大公约数
int gcd(int a,int b){ int m = a > b ? a : b; int n = a > b ? b : a; int r = m % n; while(r != 0) { m = n; n = r; r = m % n; } return n;}原创 2013-10-16 16:44:10 · 665 阅读 · 0 评论 -
求整型数组中只出现1次的数字
//一个整型数组里除了1个数字之外,其他的数字都出现了两次。请写程序找出只出现一次的数字。//要求时间复杂度是O(n),空间复杂度是O(1)。int FindOne(int a[],int len){ /* 异或的基本性质: 1. 2个相同的数异或等于0 2. 任何数与0异或都等于其本身 */ int ret = 0; in原创 2013-10-24 13:25:06 · 721 阅读 · 0 评论 -
KMP算法
串匹配先来回忆一下串匹配场景,不外乎是给定两个字符串 S 和 T ,然后在 S 串中查找 T 串,如果查找成功就是匹配,否则就是不匹配。比如:S = "abababaababacb";T = “ababacb”; C = “abcc” ;那么结果就是 T 匹配 S ,而 C 不能匹配 S 。朴素的串匹配算法再来回顾一下朴素的匹配思想,从 S[i] 开始,逐个检查 S[i+pos]原创 2013-10-28 17:50:21 · 770 阅读 · 0 评论 -
数组中只出现1次的两个数字
// 一个整型数组里除了2个数字分别出现1次之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。// 要求时间复杂度是O(n),空间复杂度是O(1)。//如果我们能把问题中的数组分成2个子数组,使得每个子数组中都只有一个唯一的元素以及很多成对的元素,那么我们就可以求出每个子数组中唯一的元素,最终就可以得到原数组中2个出现次数唯一的元素。方法是这样的:1. 首先数组中所有元素依原创 2013-10-24 13:50:40 · 782 阅读 · 0 评论 -
【二叉树】求二叉树中两个节点的最近公共父节点
BTNode *pResult = null;int GetFirstCommonFather(BTNode *root,BTNode *p1,BTNode *p2){ if(pResult != null) return 0; //如果result所指向的不为null,说明已经找到。 if(root == null) return 0; int sum = 0;原创 2013-10-30 15:03:24 · 1089 阅读 · 0 评论 -
【链表】判断单链表是否有环
【算法】设一快一慢两个指针(pFast、pSlow)同时从链表头节点开始遍历,其中快指针步长为2,慢指针的步长为1,若有环,则在慢指针遍历到尾节点时或之前,快指针必然与之进行第一次重合(需要数学证明)。原创 2012-07-05 13:40:04 · 526 阅读 · 0 评论 -
寻找数组中频率超过一半的数字
http://www.cnblogs.com/jy02414216/archive/2011/03/04/1970497.html延伸问题:寻找数组中出现频率最高的数字原创 2013-08-23 18:56:42 · 915 阅读 · 0 评论 -
strcpy与memcpy
char *strncpy(char *dest, const char *src, size_t count);char *strcpy(char *dest, const char *src){ if((dest == NULL) || (src == NULL)) { return NULL; } char *strDest = dest; while(*src !=原创 2013-08-22 14:26:30 · 589 阅读 · 0 评论 -
【链表】判断两个单链表是否相交
【算法】如果两个单链表相交,则至少有一个共同的节点(尾节点),那么这两个链表看上去像一个左倾斜45度的Y,分别遍历至两个单链表的尾节点,判断尾节点地址(指针值)是否相等,如果相等则相交,如果不相等,则不相交。假设链表1的长度为n,链表2的长度为m,那么总的时间复杂度为O(n+m)。原创 2012-07-04 14:54:13 · 594 阅读 · 0 评论 -
【链表】若单链表存在环,如何找到环的入口点。
【算法】这个完全是通过数学推导出来的,设一快、一慢两个指针,快指针的步长为2,慢指针为1,假设链表起点到环入口点之间的距离为x,环入口点到重合点的距离为y,假设在相遇之前慢指针走的s,则快指针必然走2s,所以有如下公式:s = x + y2s = nr + s(假设环的周长为r,在相遇前快指针走了n圈)由公式2推导出s = nr,带入公式1得到nr = x + y ===> x原创 2012-07-05 14:12:52 · 833 阅读 · 0 评论 -
【链表】得到单链表中倒数第k个结点
【算法一】假设单链表有n个节点,如果尾节点为倒数第1个节点,那么则为正向的第n个,有对应关系为(倒数 => 正数):1 => n2 => n-13 => n-2k => n-k+1那么求倒数第k个节点转变为求正数第n-k+1个节点。首先我们需要知道有多少个节点(遍历一次),在找正向的第n-K+1个节点(再遍历一次),总的时间复杂度是O(2n)。【算法二】设2原创 2012-07-04 17:14:29 · 1096 阅读 · 0 评论 -
不用任何全局及局部变量实现strlen
int strlen(char *str){ return *str == '\0' ? 0 : 1+strlen(str+1);}原创 2012-09-10 13:10:18 · 653 阅读 · 0 评论 -
不用任何四则运算符实现swap
void swap(char a,char b){ printf("%c,%c\n",a,b); a = a^b; b = a^b; a = a^b; printf("%c,%c\n",a,b);}原创 2012-09-10 13:19:59 · 648 阅读 · 0 评论 -
【二叉树】判断一棵二叉树是否是平衡二叉树
//是否是平衡二叉树int IsBalanceTree(bnode *root){ if(root == NULL) { return 1; } int leftDepth = GetDepth(root->pLeft); int rightDepth = GetDepth(root->pRight); int distanc原创 2013-10-15 12:32:55 · 1102 阅读 · 0 评论