
程序设计
文章平均质量分 61
bertzhang
这个作者很懒,什么都没留下…
展开
-
技术文章的收集
《系统程序员成长计划》原创 2011-08-24 14:36:25 · 643 阅读 · 0 评论 -
求最大公约数
1、辗转相除法,因为(x,y)的公约数可以通过下面的分析求得,x可以表示为ky + b,那么(x,y)的公约数可以表示为(ky+b,y)的公约数,也就变成(b,y)的公约数,而b=x % y,且b 2、既然ky+b 与y有相同的最大公约数,那么如果x>y,(x-y,y)和(x,y)的最大公约数也是相同的,这样不断递归下去直到x==y,可以求得最大公约数代码如下:#include in原创 2012-02-11 11:29:40 · 2077 阅读 · 0 评论 -
斐波那契数列
f(n) = f(n -1) + f(n-2)f(0) = 0;f(1) = 1;通常问题是求最快的计算方法:1、循环;2求通项公式;3其他相关问题:上楼有两种上法,每次上一级或每次上量级,问如果楼梯有n级总共有多少种上楼方法考察上到第n曾楼梯的方法有两种,一种是从n-1层上来,还有一种是从n-2层上来,因此到n层的方法是f(n) = f(n-1) + f(n-2)下面给出原创 2012-02-13 17:37:58 · 878 阅读 · 0 评论 -
求1到N的数中1出现的个数
方法1:将从1到N的所有数枚举出来,每个数都计算一下出现了多少个1,最后相加就可以得到结果,复杂度是O(n*lnn)方法2:通过每一个位上1出现的次数来计算总的出现次数,举例来说512,各位出现1的数包括:1 (1)11, 21,31,..91 (9)101,121,131,...191(10)201,211,221...291(10)301,311,321,...3原创 2012-02-14 18:41:07 · 1553 阅读 · 0 评论 -
数组循环移位
abcd1234 -> 右移2位 -> 34abcd12解法:abcd1234 -> abcd12 | 34 -> 21dcba | 43 ->34abcd12程序如下:#include templatevoid ArrayReverse(T array[], int start, int end) { T tmp; while (start < end) {原创 2012-02-14 19:47:45 · 760 阅读 · 0 评论 -
寻找最近点对
题目:平面中有若干个点,寻找距离最近的两个点。分析:方法1:两两点比较,寻找最近的两个点对,复杂度O(N^2),优点代码简单不容易出错方法2:观察两两比较的方法,发现有很多无用的比较,对于每一个点只要计算到它最近的点的距离就可以了,枚举所有的点,最后得出距离最近的一对点,但对于一个给定的点,如何找到距离它最近的点呢?可以使用一些启发式规则,减少比较的次数,例如:对于(x,y)取x轴投影原创 2012-02-15 12:50:41 · 6773 阅读 · 0 评论 -
区间重合判断(区间覆盖问题)
题目:给定一些无序区间,判断某个给定的特定区间是否在这些无序的区间内。这个题目比较简单,首先将给定的区间排序,在对重合的区间进行排序,使得区间变成递增且不重叠的若干个区间,对于给定的区间在已经处理好的区间内进行二分查找,完成区间覆盖的判断。程序如下:#include #include #include class Interval { public: Interval(in原创 2012-02-15 15:34:55 · 6955 阅读 · 0 评论 -
面试题目资源列表
http://blog.youkuaiyun.com/lzc52151/article/details/6221852 http://zhedahht.blog.163.com/blog/#m=0http://blog.youkuaiyun.com/v_JULY_v/article/category/767340 http://www.cnblogs.com/miloyip/archive/2010/02原创 2012-02-15 17:51:48 · 834 阅读 · 0 评论 -
送货站选址问题
题目:有n个商店,分布在x[i]位置上,每个商店每天需要进货w[i]吨,问送货站建在哪里,代价最小?分析:进货量:w[0] w[1] w[2] ... w[i] w[i+1] w[i+2] ... w[n]位 置:x[0] x[1] x[2] ... x[i] x[i+1] x[i+2] ... x[n]送货站:原创 2012-02-08 16:29:03 · 916 阅读 · 0 评论 -
寻找第K大的数
#include #include int Left(int parent) { return parent * 2 + 1;}int Right(int parent) { return (parent + 1) * 2;}int Parent(int child) { return (child - 1) / 2;}templatevoid Swap(T& lef原创 2012-02-10 19:10:38 · 1178 阅读 · 0 评论 -
itoa函数的编写
itoa函数的编写主要考虑一下几个方面的因素:1)数字的正负号2)如果是0时,影响value/radix的判断,所以要用do while循环来计算3)如何反转转换后的数据,首尾两指针交换数据4)扩展性方面使用radix5)使用character数组来,实现转换,有利于扩展到16进制的情况具体代码如下:std::string Itoa(int value, int rad原创 2012-02-25 15:02:26 · 1230 阅读 · 0 评论 -
字符串移位包含的问题
两种思考方法:1、和正常的字符串比较没有什么区别,只是比较到数组的末尾时,需要从头开始在比较,也就是说如果超出数组的长度时,取一下模可以得到正确的坐标,继续比较就可以了。2、将数组复制一边,再在复制后的数据上查找目标字符串。代码如下:#include #include bool RotateFind(const std::string& src, const std::stri原创 2012-02-20 18:55:02 · 838 阅读 · 0 评论 -
最短摘要生成
题目:抽象点说,就是在一个字符串中,找一些目标字符串,找到包含所有目标字符串的最小字符串。题目虽然叫做最短摘要生成,但和实际的搜索snippet的计算还是有比较大的差距的。解法:文献[1]给出了一种比较好的解法,策略还是使用双指针,双指针对于很多算法设计很有价值,算法的思想是采用两个指针,开始两个指针都指向缓冲区的头部,尾指针向后扫描,直到头指针和尾指针中间包含了全部的关键字,那么头指针向后移原创 2012-02-21 12:26:13 · 4137 阅读 · 0 评论 -
关于memcpy、memove的故事
关于memcpy和memmove的故事很多,但相关的主要有一下几个方面:1、memcpy和memmove的差别:memcpy当地址出现重叠时,操作的效果是未定义的,而memmove则处理了这种情况,也就是说如果src地址小,我们就从后向前拷贝,如果src地址大,怎从前向后拷贝。[1]2、通常实现时每次拷贝一个byte,加速的办法是copy4个byte,不足的部分再按照byte拷贝[2]原创 2012-02-29 12:18:21 · 1445 阅读 · 0 评论 -
从无头单链表中删除节点
题目:在一个给定的单向链表中,如何遍历一次删除特定的节点解法:这是一个典型的逆向思维问题,正常的删除需要把当前节点的前面节点和后面节点链接起来,再删除当前节点,完成任务。当前节点的后续节点比较容易得到,但困难的是无法得到当前节点的前面节点,逆向思维的结果是不删除当前节点,而是将后面节点的数据拷贝到当前节点,转而删除当前节点的后面节点,从而完成删除操作。代码如下:#include原创 2012-02-20 19:42:00 · 2495 阅读 · 0 评论 -
寻找数组中最大值和最小值
最简单的方法就是N中的每个数分别和max,min比较,看似2N次比较,其实大于max的就不必和min比较,小于min的也不必和max比较,因此比较的次数不足2N次,程序如下:bool MaxMin(std::vector array, T* max, T* min) { if (array.size() < 1) { return false; } *max = array原创 2012-02-13 19:36:50 · 12619 阅读 · 0 评论 -
队列中取最大值操作问题
问题:设计一个队列能够在O(1)时间内取得队列的最大值。分析:这个问题和设计一个在O(1)时间内取最大值的堆栈看似比较相似,但实现难度要比最大值的堆栈困难一些,开始想模仿最大值堆栈的思想来设计取最大值的堆栈都失败了。实际上这个问题可以拆分成两个问题: 1)设计一个在O(1)时间内取最大值的堆栈; 2)如何使用堆栈来实现一个队列;如果这两个问题解决了,O(1)时间取最大值的队列也原创 2012-02-21 14:47:24 · 5774 阅读 · 4 评论 -
循环队列(circular queue)
循环队列是非常有用的一个数据结构,在单读、单写入的情况下可以不必对共享的队列数据进行加锁,非常有利于提升并发的性能。下面是一个实例程序:#include #include templateclass CircularQueue {public: CircularQueue(const size_t& size) : size_(size + 1), read_index_(0),原创 2012-01-30 19:25:29 · 5888 阅读 · 1 评论 -
多线程基础(单读、单写、循环队列、无锁、lockfree)
有了前面线程创建和循环队列的基础,我们再来看一个单度、单写利用循环队列的例子,代码如下:#include #include #include #include "circular_queue.h"class ThreadBase { public: virtual ~ThreadBase() {} void SetMessage(const char* message)原创 2012-01-30 20:11:46 · 3764 阅读 · 0 评论 -
core dump的简单测试
用C++编写的程序在运行出错时,系统会生成core dump文件,如果系统没有生成可以通过命令 ulimit -c unlimited使系统生成产生core文件,这样就可以利用core文件查看程序是在哪一行出现错误了,具体的方法如下:1、程序编译时要加-g选项,保证debug信息生成在应用程序当中2、如果运行过程中出错,执行下面命令查看程序哪里出现错误:gdb a.out co原创 2012-01-30 10:24:46 · 2776 阅读 · 0 评论 -
多线程编程基础(线程创建)
1、多线程的创建线程的创建比较简单,先举一个例子热热身:#include #include void* Handler(void* param) { char* message = static_cast(param); printf("%s\n", message);}int main(int argc, char** argv) { pthread_t thre原创 2012-01-30 16:53:44 · 1424 阅读 · 0 评论 -
求子数组之和最大值(包括循环)
编程珠玑中给出了n*logn的解法,很有参考价值。O(n)的扫描方法,用到了前面分析的若干策略:1) 从某个位置开始,到i位置结束的sum的计算方法是max_ending_here + array[i]2)以往的最大值是max_sofar,要和到当前结束点的最大值进行比较取其大者3)如果max_ending_here + array[i]的值小于array[i]的值,说明max_end原创 2012-02-08 15:07:59 · 1995 阅读 · 1 评论 -
求二进制数中1的个数
很多方法,详细见编程之美p119,比较不容易想到的是查表法。这里实现一个移位法,实现的过程中,没有使用if判断比较有价值,效率更高。#include int main(int argc, char** argv) { char var = 7; int counter = 0; while (var) { counter += (var & 0x1);原创 2012-02-09 17:18:50 · 650 阅读 · 0 评论 -
快速寻找满足条件的两个数(两数之和为给定值)
首先递增排序,首尾指针相加,大于目标数,尾指针前移,小于目标数,首指针后移,继续比较,直到两指针相遇。程序如下,借用这个问题,练习一下MergeSort#include #include void FindTargetSum(int array[], int begin, int end, int target_value) { int min = begin; int m原创 2012-02-08 10:32:55 · 1158 阅读 · 0 评论 -
数据结构和算法书推荐
http://www.docin.com/p-6351439.html转载 2012-02-08 15:22:39 · 936 阅读 · 0 评论 -
求N!阶乘中结尾0的个数,或结果的二进制表示中最后一个1所在的位置
问题1:阶乘结尾0的个数要想阶乘的结尾是0,那么这个0已经通过5的倍数乘以另一个数获得,例如:5,10,15,20,25...,同时可以注意到这样一个规律,5,10,15,20,30,35,40与某个数相乘后可以贡献1个0,而25,50,75,100...与某个数相乘可以贡献2个0,5^3, 2* 5^3, 3*5^3与某个数相乘时贡献了3个0,依次类推。同时我们注意到,在统计5,10,15,原创 2012-02-10 10:13:19 · 4476 阅读 · 0 评论 -
一个数拆分成连续自然数的和(只考加法的面试题)
题目:给定一个自然数,如何将它拆分成几个连续的自然数的和的形式,例如:9 = 4 + 5,12 = 3 + 4 + 5等,有哪些数不能分解成这样的形式,例如4,8等分析:通过上面的几个例子可以发现一下规律:1)所有的奇数n都可以分解成(n/2) + (n/2 +1)2)偶数有点麻烦,先对部分例子进行计算,比如6 = 1 + 2 + 3,10 = 1 + 2 + 3 + 4, 12 =原创 2012-02-17 10:55:08 · 7191 阅读 · 0 评论