C++
文章平均质量分 57
Fivesplus
这个作者很懒,什么都没留下…
展开
-
void const f() vs void f() const
void const f() is equivilent to const void f(), which means the return type (in this case a void) is const. This is totally meaningless not only because it's a void (there is nothing there that need转载 2015-04-10 20:36:49 · 487 阅读 · 0 评论 -
最大公约数
求两个正整数的最大公约数 方法一: 辗转相除法 假设两个正整数x,y ,令x/y=p ,x%y=q 即 x=p* y +q 则 如果一个数能整除x,y 则一定能够整出y 和q 如果一个数能够整除y和q 则一定能够整除x,y ,所以x,y和y ,q具有相同的公约数 gcd(x,y)=gcd(y,x%y).... 比如 x=18 y=12 gcd(18,12)=gcd(12原创 2015-05-19 16:48:33 · 452 阅读 · 0 评论 -
objective-c类初始化
并不一定要要为自己的类创建初始化函数。如果不需要设置任何状态 或者alloc方法将内存清零的默认行为相当不错 则不必去在意init方法 如果创建了一个指定初始化函数 则一定要在自己的指定的初始化函数中调用超类的指定初始化函数 如果初始化函数不止一个 则需要选择一个指定初始化函数 被选定的初始化函数应当调用超类的指定初始化函数 要按照指定初始化函数的形式实现所有的初始化函数 @proper原创 2015-06-30 15:57:53 · 488 阅读 · 0 评论 -
求数组的字数组之和的最大值
先看一维数组的情况: 方法1: 遍历所有可能的sum:时间复杂度为O(N*N*N) int maxsum1(int *a,int n) { int M=-100000; int s=0; for (int i=0;i<n;i++) { for(int j=i;j<n;j++) { for(int k=i;k<j;k++) { s=s+a[k]; }原创 2015-05-19 11:39:42 · 569 阅读 · 0 评论 -
分治算法 求数组逆序数
http://blog.csdn.net/xiaofengsheng/article/details/5491090 int Meg(int *t,int *a,int x,int y,int m,int n) { int k=0; int order=0; int i=x; int j=m; for(i=x;i { while(ja[j]) j++; ord原创 2015-05-14 21:57:59 · 1095 阅读 · 0 评论 -
判断两个链表是否相交
给出两个单行链表的头指针 判断这两个链表是否相交 为了简化 这里假设两个链表均不带环 方法1: 判断第一个链表的每个节点是否在第二个链表中 这种方法的时间复杂度为O(lenth(l1)*lenth(l2)) 方法2: 如果两个链表相交 那么这两个链表就会有共同的节点 而节点地址又是节点的唯一标识 所以我们能够判断两个链表是否有存在地址一致的节点 就可以判断两个链表是否相交原创 2015-05-21 16:54:11 · 397 阅读 · 0 评论 -
快速寻找满足条件的两个数
快速找出一个数组中的两个数字 让这两个数字之和等于一个给定的数字(假设这个数组中肯定存在这样一组或以上的数 方法一: 穷举法: for(int i=0;i<n;i++) { for(int j=i;j<n;j++) { if (a[i]+a[j]==m) cout<<a[i]<<' '<<a[j]<<endl; } } 算法时间复杂度为O(N*N)原创 2015-05-19 15:25:03 · 614 阅读 · 0 评论 -
最长递增子序列
找出一维数组中的最长递增子序列 也就是找到一个标号的序列b[0],b[1],...b[m](0 方法一: 从i开始 遍历先前所有的递增子序列 判断当前的a[i] 与最长子序列中的每一个元素的大小 如果满足递增则将i加入 int *LS=new int[n]; for(int i=0;i<n;i++) { LS[i]=1; for(int j=0;j<i;j++) {原创 2015-05-19 09:49:48 · 297 阅读 · 0 评论 -
快速找出故障机器
假设一个机器仅存储一个标号为ID的记录(假设ID是小于10忆的整数) 假设每份数据保存两个备份 这样就有两个机器存储了同样的数据 1.在某个时间 如果得到一个数据文件ID的列表 是否能够快速找出这个表中仅出现一次的ID 2.如果已经知道只有一台机器死机(也就是说只有一个备份丢失)?如果两台机器死机(假设同一个数据的两个备份不会同时丢失)? 问题1: 直接遍历表 利用一个数组记录下每原创 2015-05-30 22:14:41 · 294 阅读 · 0 评论 -
寻找数组中的最大值和最小值
同时找出一个数组的最大和最小的数 对于一个由N个整数组成的数组 需要比较多少次才能把最大和最小的数找出来 面试的时候面试官有闻过此题 但是我一直不明白当时问的是什么意思 没有考虑到比较次数 以为时间复杂度为O(N)了还想怎么样,Naive、、、直到在书上看见此题。。。 比较次数 最直接的是比较2N次 ,找最大最小数各比较N 一般最大数和最小数不会是同一个 可以考虑将数组分成两原创 2015-05-19 16:15:24 · 610 阅读 · 0 评论 -
编程之美-电梯调度算法
1、简单的双重循环可以解决O(N ) 2、书中提出另一种想法 假设电梯停在i层 爬楼梯的总数为Y 若电梯停在i-1层 则i层以上的N3人 需要多爬一层 i层的N2也需多爬一层 i-1层的N1人则少爬一层 所以总共走的数目为 Y-N1+N2+N3 即 Y-(N1-N2-N3) 若在i+1层停下 则i+1层的N3人少一层 i层和i-1层多走N2+N1 总的数目为Y-N3+N1+N2 即原创 2015-05-15 13:07:01 · 1001 阅读 · 0 评论 -
一摞烙饼的排序
假设有n块大小不一的烙饼 那最少要翻几次 才能达到最后大小有序的结果? 为了把最大的烙饼摆在最下面 先把最上面的烙饼和最大的烙饼之间的烙饼翻转 这样最大的烙饼就在最上面了 接着 把所有烙饼翻转 最大的烙饼就摆在了最下面 之后我们队上面n-1、n-2个饼重复这个过程 两次翻转就可以把最大的烙饼翻转到最下面 最多需要把上面的n-1个烙饼一次翻转两次 因此 最多需要2(n-1)次翻原创 2015-05-30 22:13:15 · 491 阅读 · 0 评论 -
求解最长回文子串 之Manacher算法
回文串包括奇数长的和偶数长的,一般求的时候都要分情况讨论,这个算法做了个简单的处理把奇偶情况统一了。算法的基本思路是这样的,把原串每个字符中间用一个串中没出现过的字符分隔开来(统一奇偶),用一个数组p[ i ]记录以 str[ i ] 为中间字符的回文串向右能匹配的长度。 原串:w a a b w s w f d 新串: # w # a转载 2015-04-13 11:09:47 · 485 阅读 · 0 评论 -
KMP算法
问题描述:有一个文本串S,和一个模式串P,查找P在S中的位置 暴力破解法: int ViolentMatch(char* s, char* p) { int sLen = strlen(s); int pLen = strlen(p); int i = 0; int j = 0; while转载 2015-04-12 16:08:46 · 420 阅读 · 0 评论 -
STL sort排序多维数组
将数组转换为结构体 编写cmp函数~原创 2015-04-21 15:42:16 · 791 阅读 · 0 评论 -
hiho1039字符消除
http://hihocoder.com/problemset/problem/1039 没有想到什么好的方法 列出所有情况 然后对每一种情况求解 最后求出最大值原创 2015-04-17 18:01:42 · 432 阅读 · 0 评论 -
区间重叠
给定一个源区间【x,y】(y>=x) 和N个 无序的目标区间[x1,y1] [x2,y2] ....[xn,yn] 判断源区间[x,y]是不是在目标区间内 方法1: 一个直接的思路即将源区间[x,y]和N个无序的目标区间逐个投影到坐标轴上 只考察源区间未被覆盖的部分 如果所有的目标区间全部投影完毕 仍有源区间没有被覆盖 那么源区间就不在目标区间之间 方法2: 对现有原创 2015-05-21 16:20:47 · 540 阅读 · 0 评论 -
数组循环位移
设计一个算法 把一个含有N个元素的数组循环右移K位 要求时间复杂度为O(N ) 且只允许使用两个附加变量 方法1: 将长度为N的数组 每次移动一位 移动k次 如abc移动三次 为abc ->cab->bca->abc. 当移动为N此时 与原数组相同 因此 当k>N 时 移动结果与 k%N 相同 for (int i=0;i<k%N;i++) { char t=a[0];原创 2015-05-21 09:59:31 · 471 阅读 · 0 评论 -
数组分割
有一个没有排序、元素个数为2n的正整数数组 要求如何能把这个数组分割为元素个数为n的两个数组 并使两个字数组的和最接近 方法1: 将数组的所有元素排序为a1 将它们划分为两个数组s1=[a1,a3....a2n-1] ,s2=[a0,a2,....a2n] 从s1和s2中找出一对数进行交换 是的sum(s1) 和sum(s2)之间的值尽可能的小 直到无法交换 这种想法的缺陷是s1和s2原创 2015-05-21 11:20:08 · 371 阅读 · 0 评论 -
字符串移位包含
给定两个字符串s1和s2 要求判定s2是否能够被通过s1作循环移位 得到的字符串包含 假设给定s1=AABCD s2=CDAA 返回true 给定s1=ABCD s2=ACBD false 方法1:穷举法 将长度为N的s1移动N次 每次移动1为 查看是否包含s2 方法2: 将长度为N的s1移动N次 保留每次前面移动的数据 如s1=ABCD ABCD->ABCD原创 2015-05-21 16:40:29 · 367 阅读 · 0 评论