- 博客(44)
- 资源 (3)
- 收藏
- 关注
原创 计算字符串的相似度
Int CalculateStringDistance(string strA, int pABegin, int pAEnd, string strB, int pBBegin, int pBEnd){if (pABegin > pAEnd){if (pBBegin > pBEnd)return 0;elsereturn pBEnd - pBBegin + 1;}
2015-04-27 22:25:03 384
原创 字符串移位包含的问题
题目描述: 给定两个字符串s1和s2,要求上是否能够通过s1作循环移位(rotate)得到的字符串包含。例如s1=AABCD和s2=CDAA,返回true,给定s1=ABCD和s2=ACBD,返回false.解法一: 可以使用最直接的方法对s1进行循环移位,再进行字符串包含的判断,从而遍历其所有的可能性。代码如下:char src[5] = "AABCD"
2015-04-27 21:33:38 668
原创 signal函数
调用POSIX sigaction函数的signal函数。#include "unp.h"Sigfunc* signal(int signo, Sigfunc * func)//第一个参数为信号名,第二个参数或为指向函数的指针,或为常值SIG_IGN或SIG_DFL.{struct sigaction act, oact;act.sa_handler = func;
2015-04-27 15:11:06 454
原创 求二叉树中节点的最大距离..........
题目描述: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义“距离”为两个节点之间的边的个数。写一个程序,求一颗二叉树中相距最远的两个节点之间的距离。分析与解答:根据相距最远的两个节点一定是叶子节点这个规律,我们可以进一步讨论。对于任意一个节点,以该节点为根,假设这个根有K个孩子结点,那么相距最远的两个节点U和V之间的路径与这
2015-04-27 14:21:44 801
原创 求上排的数在下排出现的次数
题目: 举一个例子: 数值:0,1,2,3,4,5,6,7,8,9 分配:6,2,1,0,0,0,1,0,0,0 0在下排出现了6次,1在下排出现了2次。 2在下排出现了一次,。。。。。 以此类推#include using namespace std;#define len 10cl
2015-04-27 14:14:04 658
原创 求最小的k个元素
题目: 输入n个整数,输出其中最小的k个。 例如:1,2,3,4,5,6,7,8 则最小的4个数为1,2,3,4,#includeusing namespace std;class MinK{public:MinK(int *arr, int si) :array(arr), size(si){}bool kmin(int k, in
2015-04-27 13:28:36 612
原创 TCp客户/服务器程序示例
1. TCP回射服务器程序:main函数#include "unp.h"int main(int argc, char **argv){int listenfd, connfd;pid_t childpid;socklen_t clilen;struct sockaddr_in cliaddr, servaddr;listenfd = Socket(AF_INET,
2015-04-26 15:17:34 847
原创 unix网络编程readn,writen,readline包裹函数
一、Readn包裹函数/* include readn */#include "unp.h"ssize_t /* Read "n" bytes from a descriptor. */readn(int fd, void *vptr, size_t n){size_t nleft;ssize_t nread;char *ptr;ptr = vptr;
2015-04-26 13:35:29 957
原创 数组分割
题目描述: 有一个没有排序,元素个数为2n的正整数数组,要求:如何能把这个数组分割为元素个数为n的两个数组,并使两个子数组的和最接近。 分析: 题目的本质就是要从2n个整数中找出n个,使得它们的和尽可能地靠近所有整数之和的一半。解法一和二:伪代码如下:定义:Heap[i]表示存储从arr中取i个数所能
2015-04-25 20:50:28 770
原创 判断是否为二叉树的后续遍历
题目要求: 判断整数序列是不是二元查找树的后续遍历结果。 输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。 如果返回true,否则返回false. 因此返回true.如果输入7,4,6,5,没有那棵树的后序遍历的结果是这个序列,因此返回false.解析: 这是二叉查找树树后序遍历重建问题
2015-04-24 22:08:17 614
原创 数组循环移位
题目描述: 设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。解法一: 可以每次将数组中的元素右移一位,循环K次。abcd1234-->4abcd123-->34abcd12-->234abcd1-->1234abcd.伪代码如下:RightShift(int *arr, int N, int K)
2015-04-24 21:30:23 599
原创 求数组中最长递增子序列
题目描述: 求一个一维数组(N个元素)中的最长递增子序列的长度。例如:在序列1,-1,2,-3,4,-5,6 ,-7中,其最长的递增子序列为1,2,4,6分析:解法一:无houxiao
2015-04-24 20:14:45 680
原创 socket的客户端-服务器程序
客户端程序: 通过服务器返回当前的时间和日期。#include "unp.h"#include "my_err.h"int main(int argc, char** argv){ int sockfd, n; char recvline[MAXLINE + 1]; struct sockaddr_in servaddr
2015-04-24 15:54:49 870
原创 求数组中的重复值
题目描述: 假设 你用一个1001个整数组的数组,这些整数是任意排列的,但是你知道所有的整数都在1到1000(包括1000)之间,此外,除一个数字出现两次外,其他所有数字只出现一次。假设你只能对这个整数做一次处理,用一种算法找出重复的那个数字。(不用辅助的存储方式)1.sum up all the number,then subtract the sum from 1001
2015-04-24 12:44:52 823
原创 readn,writen和readline函数
readn函数:从一个描述符读n字节#include "unp.h"ssize_t readn(int fd, void* vptr, size_t n){size_t nleft;ssize_t nread;char *ptr;ptr = vptr;nleft = n;while (nleft > 0){if ((nread = read(fd, pt
2015-04-24 09:16:11 1583
原创 子数组之和的最大值(二维)
解法一: 最直接的方法,枚举一个矩形区域,然后再求这个矩形区域中元素的和。int max(int x, int y){return (x > y) ? x : y;}//@parameters//n,行数//m,列数int MaxSum(int *A, int n, int m){maximum = -INF;for (i_min = 1;
2015-04-23 21:58:47 517
原创 求数组的子数组之和的最大值
解法一:先明确题意: 1.题目说的子数组,是连续的。 2.题目只需要求和,并不需要返回子数组的具体位置。 3.数组的元素是整数,所以数组可能只包含有正整数,零,负整数。举几个例子:数组:[1,-2,3,5,-3,2]应返回8.数组:[0,-2,3,5,-1,2]应返回9。数组:[-9,-2,-3,-5,-3]应返回-2。最直接的方法:
2015-04-23 20:35:12 463
原创 子数组的最大乘积
题目: 给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合乘积中最大的一组,并写出算法的时间复杂度。解法一:解法二:
2015-04-23 20:23:08 492
原创 网络编程之inet_pton,inet_ntop,sock_ntop函数
inet_pton inet_pton函数转换由strptr指针所指的字符串,并通过addrptr指针存放二进制结果。若成功则为1,若输入不是有效的表达式格式则为0,若出错则为-1;int inet_pton(int family, const char* strptr, void* addrptr){if (family == AF_INET){st
2015-04-23 14:19:20 6252
转载 字符串比较
题目:比较两个字符串,O(n)时间。int strcmp(char*p1, char*p2){while (*p1 != '\0'&&*p2 != '\0'&&*p1 == *p2){p1++; p2++;}if (*p1 == '\0'&&*p2 == '\0')return 0;if (*p1 == '\0')return -1;if (*p
2015-04-22 22:34:16 439
原创 快速寻找满足条件的两个数
题目: 能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的数字。解法一: 穷举法,从数组中任意取出两个数字。计算两者之和是否为给定的数字。其时间复杂度为N(N-1)/2,即O(N2).解法二:解法三: 直接对两个数字的和进行一个有序的遍历,从而降低算法的时间复杂度。 首先对数组进行排序,时间
2015-04-22 22:05:48 635 1
原创 寻找最近点对
解法一: 数组中总共包含N个数,把它们的两两差值求出来,就可以得到最小值对。时间复杂度为O(N2).N2值N的平方代码如下:double MinDifference(double arr[], int n){if (n return 0;double fMinDiff = fabs(arr[0] - arr[1]);for (int i = 0; i
2015-04-22 21:17:22 600
原创 寻找数组中的最大值最小值
解法一: 分别求出数组中的最大值和最小值。先扫描一遍数组,找出最大的数和最小的数。需要比较2*N次。解法二: 一般情况下,最大值和最小值不相同。所以把数组分成两部分,然后再从这两部分中分别找出最大值和最小值。 最后,从奇偶数位上分别求出Max=9,Min=3,各需要比较N/2次,整个算法共需要比较1.5*N次。解法三:
2015-04-22 20:12:09 1545
原创 颠倒句子中词的顺序
分析: 先颠倒整个句子,然后。颠倒词的顺序。例如: I am a teach. 颠倒后:teach a am i//Reverse the whole string,then reverse each word.char* reverseFixlen(char *str,int n){ char *p=str+n-1; char *start=str; while(
2015-04-20 22:26:37 2732
原创 斐波那契数列--之优化(Fibonacci)
斐波那契数列由如下递推关系式定义:代码如下:int Fibonacci(int n){ if(n<=0) return 0; else if(n==1) return 1; else return Fibonacci(n-1)+Fibonacci(n-2);}解法一:递推关系的优化解法二:求解通项公式 解
2015-04-20 21:39:11 501
原创 找符合条件的整数
题目: 任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式只含有1和0 。分析: 将问题“求一个最小的正整数M,使得N*M的十进制表示形式里只含有1和0”转换为求一个最小的正整数X,使得X的十进制表示形式里只含有1和0,并且X被N整除。
2015-04-20 21:23:18 837
原创 最大公约数问题
解法一: 辗转相除法,使用原理为f(x,y)表示x,y的最大公约数,取k=x/y,b=x%y,则x=ky+b,如果一个数能够同时整除x和y,则必能同时整除b和y,而能够同时整除b和y的数也必能同时整除x和y,即x和y的公约数与b和y的公约数相同的,其最大公约数也是相同的,则有f(x,y)=f(y,x%y)(y>0).具体代码如下:int gcd(int x,int y){
2015-04-20 20:09:53 604
原创 寻找最大的K个数
解法一: 利用快速排序的思想,假设N个数存储在数组S中,我们从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb,Sa中的元素大于等于X,Sb中的元素小于X。伪代码如下:Kbig(S,k) if(k if (length S return S(Sa,Sb)=Partition(S)return Kbig(S
2015-04-19 20:47:38 511
原创 统计1的个数
题目描述: 给定一个十进制数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数。例如:N=2;写下1,2。这样只出现了1个“1”N=12;我们会写下1,2,3,4,5,6,7,8,9,10,11,12.这样,1的个数为5问题:1.写一个函数f(N),返回1到N之间出现的“1”的个数。2.在32位整数范围内,满足条件”f(N)=N"
2015-04-19 19:28:06 509
原创 寻找发帖“水王”
题目描述: “水王”指发帖(和回帖)数超过贴子总数的一半。快速找出这个“水王”的算法解法一和解法二:解法三: 避免排序的方法,如果每次删除不同的ID,那么,在剩下的ID列表中,"水王"ID出现的次数仍然超过总数的一半。总的时间复杂度为O(n)。且只需要常数的额外内存。Type Find(Type* ID,int N){ Type can
2015-04-19 19:08:49 321
原创 颠倒字符串
题目:颠倒一个字符串,优化速度,优化空间。void reverse(char *str){reverseFixlen(str,strlen(str));}void reverseFixlen(char*str,int n){char* p=str+n-1;while (str{char c=*str;*str=*p;*p=c;++st
2015-04-19 11:41:14 586
原创 倒排链表(修订版)
题目:Node* reverse(Node* head){ if (head==NULL) return head; if(head->next==NULL) return head; Node* ph=reverse(head->next); head->next->next=head; head->next=NULL;
2015-04-18 22:30:18 1589 5
翻译 算法第9题
题目: 你让一些人为你工作了七天,你要用一根金条作为报酬。金条被分成七小块,每天给出一块。 如果你只能将金条切割两次,你怎样分给这些工人?分析: 不是给出去的就收不回来了,可以用交换的方法 把金条分成三段(就是分两次,或者切两刀),分别是整根金条的1/7、2/7 4/7 第一天:给1/7的, 第二天:给
2015-04-18 22:07:18 447
原创 算法题8
题目: 有两个房间,一个房间有3盏灯。但是没有开关。在另一个房间里控制着三盏灯的三个开关。这两个房间是分割开的,从一个房间看不到另一个房间的情况。要求受训者分别进房间一次,然后判断这三盏灯分别是由那个开关控制的。答案: 把开关编号为1,2,3。在3个开关房间里,打开开关1,开上几分钟,再关掉,打开开关2,马上进入3盏灯的房间,亮的灯当然是开关2控制,用手摸另
2015-04-18 21:56:42 414
原创 求二进制中1的个数
题目描述:对于一个字节(8bit)的变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能的高。解法一: 除以一个2,原来的数字将减少一个0,如果除的过程中有余,那么就表示当前位置有一个1.代码如下:int Count(int v){int num=0;while (v){ if (v%2==1) num++
2015-04-18 20:58:41 475
原创 算法100题(第7题)
题目:判断两个单链表是否相交给出两个单链表的头指针,比如h1,h2,判断这两个链表是否相交。为了简化问题,假设两个链表均不带环问题扩展:1.如果链表可能有环列。2.如果需要求出两个链表相交的第一个节点列?struct Node{int data; Node* next;};//if there is no cycleint isJoinedSi
2015-04-17 22:07:51 377
原创 iterator_traits大杂烩
templatestruct iterator_traits{typedef typename Iterator::iterator_category iterator_category;typedef typename Iterator::value_type value_type;typedef typename Iterator::difference_type diff
2015-04-17 20:14:59 416
原创 advance 源码
advance函数的实现:templatevoid advance_II(InputIterator& i,Distance n){ for (;n>0;--n,++i) {}}templatevoid advance_BI(BidirectionalIterator& i,Distance n){if (n>=0) for(;n>0;--n,++
2015-04-17 19:55:42 723
原创 反向复制reverse_copy
templateOutputIterator reverse_copy(BidirectionalIterator first,BidirectionalIterator last,OutputIterator result){while (first!=last){--last;*result=*last;++result;}return result;}
2015-04-16 22:23:56 1417
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人