![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
july程序员编程艺术自写
文章平均质量分 58
v_yang_guang_v
hello world!
展开
-
一.字符串左旋转问题
举个例子,abcef向左旋转两位得到cefab#includeusing namespace std;char* invert(char* start,char* end){ char *temp=start; char t; while(start<end&&start!=NULL&&end!=NULL) { t=*start; *start=*end;原创 2015-06-26 11:01:45 · 321 阅读 · 0 评论 -
提取访问百度次数最多的ip
先遍历一遍ip,将ip按照前多少位进行分段,比如前5位,则会产生32个ip文件,统计每个文件的最大次数,最后比较32个文件的最大次数就得到了想要的结果。怎样判断海量数据中是否有某一个数呢?用位图的方法将遍历海量数据将对应的位置1,如果要查询的数标志位为1,则有这个数,反之则无。原创 2015-06-30 18:28:20 · 406 阅读 · 0 评论 -
位图排序1000万的无序数(内存小于1M)
#include #include #include #include using namespace std; const int max_each_scan = 5000000; int main() { clock_t begin = clock(); bitset bit_map; bit_map.rese原创 2015-06-29 17:29:55 · 440 阅读 · 0 评论 -
c语言常见函数自编写
//1.子字符串查找,如果找到返回第一个字符下标,找不到返回-1 复杂度O(m*n)int strfind(const char * str,const char* substr){ if(str==NULL||substr==NULL) { return -1; } int len1=strlen(str); int len2=strlen(substr); if(len原创 2015-06-28 11:40:33 · 385 阅读 · 0 评论 -
判断两链表相交的问题(分有环和无环,以及求第一个相交结点)
首先用一个函数判断两个链表是否有环 1.如果两个链表都没有环,则判断最后一个结点是否相等,如果相等,则相交,如果不等,则不想交 2.如果只有一个有环,则不相交 3.如果两个都有环,则看其中一个环里的点在另一个环里是否出现,如果出现则相交,否则不相交//判断是否有环,如果有返回true和环中结点,无返回false和最后一个结点typedef ElemType int原创 2015-06-29 16:33:51 · 460 阅读 · 0 评论 -
求数组中和为某个值的一个组合
#include#includeusing namespace std;//给定一个和,求数组中和为这个值的一组数,O(n)bool findTwoNumOfSum(int a[],int n,int sum,int &num1,int &num2){ int i=0,j=n-1; while(i<j) { if(a[i]+a[j]>sum) j--; if(a[原创 2015-06-28 15:54:00 · 906 阅读 · 0 评论 -
多路归并对1000 万无序数排序(外排序)
算法思路:首先根据内存要求将排序文件分成k份,然后循环读这k个文件分别进行排序。 然后用同时打开这k个文件,读出每个文件的第一个数字,找出其中最小的数字写到result.txt文件中并且让这个具有最小数字的文件读取下一个数字,继续找k个文件中的最小数字,直到k个文件都被读取完为止,result 中就是最后排完序的结果。多路归并,时间复杂度为O(k*n/k*logn/k )这种方法由于频繁进行原创 2015-06-29 18:03:56 · 565 阅读 · 0 评论 -
如何产生1000万个无序数
#include #include #include using namespace std; const int size = 10000000; int num[size]; int main() { int n; FILE *fp = fopen("data.txt", "w"); assert(fp);原创 2015-06-29 17:22:54 · 366 阅读 · 0 评论 -
求子数组最大和
#includeusing namespace std;#define INF 9999;int method1(int a[],int n){ int max=-INF; int sum=0; for(int i=0;i<n;i++) { for(int j=i;j<n;j++) { for(int k=i;k<=j;k++) sum+=a[k];原创 2015-06-29 11:07:59 · 320 阅读 · 0 评论 -
四.求一组数据中最大的K个数
和上篇求最小的K个数有所区别的是,本篇用的是最小堆,其他类似。时间复杂度同样为n*logK;#includeusing namespace std;void adjustHeap(int b[],int s,int k){ int temp=b[s]; for(int i=2*s+1;i<=k;i=i*2+1) { if((i+1)b[i+1]) i++;原创 2015-06-27 10:37:19 · 355 阅读 · 0 评论 -
二.用最小堆方法找出海量数据中最小的k个数
思路:用数组b模拟海量数据的数组,数组a存放最小的k个数,首先将数组b的前k个数赋值给a,对a建最大堆,则此时a[0]存放a的最大元素,然后遍历b中k以后的数据和a[0]比较,如果比a[0]小,则赋值给a[0],并且对a进行重新的调整是a[0]仍然最大,这样知道把b遍历完为止。调整堆用时logk,遍历b用时n,时间复杂度nlogb#includeusing names原创 2015-06-26 12:21:20 · 453 阅读 · 0 评论 -
三.最小堆统计文章中频率前K个最高的词汇
算法思路:首先将文章中的单词进行哈希函数计算映射到哈希表,哈希表的每个节点包含了关键词以及出现次数,将哈希表记录成文件的形式。接着把哈希表前K个关键字按出现频率构成一个最小堆,然后遍历哈希表,当哈希表中元素的计数大于堆顶元素时,将其赋值给堆顶,同时调整最小堆,直到哈希表被遍历完,这样最终最小堆里面存储的关键词就是出现频率最高的Top K流程图如下:#include #原创 2015-06-26 16:19:10 · 602 阅读 · 0 评论 -
判断回文的方法总结
什么是回文? 回文就是一个字符串正反两种读取方式结果都一样。判断回文的方法:1.两个指针分别指向字符串的首和尾,看两端所指内容是否相等,如过一直相等,则是回文。时间O(n),空间O(1)2.使用一个链表,通过快慢指针找到中点和尾部,将后半部分链表逆转,然后从头和中间遍历链表,如果一直相等则是回文。3.使用栈,先将回文入栈,然后出栈和 原字符串比较,如果相等则是原创 2015-06-30 18:08:51 · 957 阅读 · 0 评论