摘要:
题目:一个单词单词字母交换,可得另一个单词,如army->mary,成为兄弟单词。提供一个单词,在字典中找到它的兄弟。描述数据结构和查询过程。解法一:使用hash_map和链表(1)首先定义一个key,使得兄弟单词有相同的key,不是兄弟的单词有不同的key。例如,将单词按字母从小到大重新排序后作为其key,比如bad的key为abd,good的key为dgoo。 (2)使用链表将所有兄弟单词串在一起,hash_map的key为单词的key,value为链表的起始地址。 (3)开始时,先遍历字典,将每个单词都按照key加入到对应的链表当中。(4)当需要找兄弟单词时,只需求取这个单词的ke 阅读全文
摘要:
Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量(semaphore),信号(signal),套接字(Socket) (1) 管道(pipe):管道允许一个进程和另一个与它有共同祖先的进程之间进行通信; (2) 命名管道(FIFO):类似于管道,但是它可以用于任何两个进程之间的通信,命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建; (3) 信号(signal):信号是比较复杂的通信方式,用于通... 阅读全文
摘要:
当一个应用的数据量大的时候,我们用单表和单库来存储会严重影响操作速度,如mysql的myisam存储,我们经过测试,200w以下的时候,mysql的访问速度都很快,但是如果超过200w以上的数据,他的访问速度会急剧下降,影响到我们webapp的访问速度,而且数据量太大的话,如果用单表存储,就会使得系统相当的不稳定,mysql服务很容易挂掉。所以当数据量超过200w的时候,建议系统工程师还是考虑分表.以下是几种常见的分表算法: 1.按自然时间来分表/分库; 如一个应用的数据在一年后数据量会达到200w左右,那么我们就可以考虑用一年的数据来做为一个表或者库来存储,例如,表名为app,那... 阅读全文
摘要:
相同点:(1)都是申请内存,释放内存,free和delete可以释放NULL指针;(2)都必须配对使用,这里的配对使用,可不能理解为一个new/malloc就对应一个delete/free,而是指在作用域内,new/malloc所申请的内存,必须被有效释放,否则将会导致内存泄露。 new/delete的功能完全覆盖了malloc/free,为什么C++还保留malloc/free呢?因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc.. 阅读全文
摘要:
/**原型:extern char *strcpy(char *dest,const char *src);*用法:#include <string.h>*功能:把src所指由NULL结束的字符串复制到dest所指的数组中。*说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。*返回指向dest的指针。*编程实现strcpy*/#include<cstdio>#include<cassert>char * _strcpy(char * dest,const char * src){ if((dest != NULL)| 阅读全文
摘要:
方法一:初始化最大值为a[0],次大值为a[1],遍历一次,每次比较并更新最大值和次大值,最后就可以得到次大值。代码如下:#include<stdio.h>#include<stdlib.h>int findSecond(int *a,int size){ int i,max,s_max; max=a[0]; //最大值 s_max=a[1]; //次大值 for(i=0;i<size;i++) { if(a[i]>max) { s_max=max; //更新最大值和次大值 max=... 阅读全文
摘要:
第一种方法(可能越界):a=a+b;b=a-b;a=a-b;第二种写法(只适用于整数):解决方法:(a、b异或的结果 ,和a异或得b ,和b异或得a)a=a^b;b=a^b;a=a^b;写成宏替换法:#define swap(a,b) (a)^=(b)^=(a)^=(b) 阅读全文
摘要:
题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。 关于中位数:数据排序后,位置在最中间的数值。即将数据分成两部分,一部分大于该数值,一部分小于该数值。中位数的位置:当样本数为奇数时,中位数=(N+1)/2 ; 当样本数为偶数时,中位数为N/2与1+N/2的均值(那么10G个数的中位数,就第5G大的数与第5G+1大的数的均值了)。分析:明显是一道工程性很强的题目,和一般的查找中位数的题目有几点不同。 1. 原数据不能读进内存,不然可以用快... 阅读全文
摘要:
atoi()函数原型:int atoi(const char *nptr) 用法:#include <stdlib.h> 功能:将字符串转换成整型数;atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串时('\0')才结束转化,并将结果返回。 说明:atoi()函数返回转换后的整型数。用法如下:#include<stdio.h> #include<stdlib.h> int main() { char a[] = "-100"; char b[] = " 阅读全文
摘要:
题目:给定一个数组a[N],我们希望构造数组b[N],其中b[i]=a[0]*a[1]*...*a[N-1]/a[i]。在构造过程:不允许使用除法;要求:O(1)空间复杂度和O(n)时间复杂度;除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、对空间和全局静态变量等);请用程序实现并简单描述。方法一:首先进行一次迭代:i:1-n-1b[i]=b[i-1]*a[i-1];这样下去就是:b[1] = a[0]b[2] = a[0]a[1]…b[i] = a[0]a[1]a[2]…a[i-1]…b[n-1] = a[0]a[1]…a[n-2]…b[i] = a[0]a[1]a[2 阅读全文