摘要:有一组数字,从1到n中减少了一个数,顺序也被打乱了,放在一个n-1的数组里,请找出丢失的数字。 用1+2+...+n(即n(n+1)/2)减去当前输入数据的总和。时间复杂度为O(n),空间复杂度O(1),缺点是容易溢出。缓解溢出的方法,求1+2+...+n的时候,边加边减。假如数组为a,那么这可以这么计算1-a[0]+2-a[1]+...+(n-1)-a[n-2]+n。 用1*2*...*n除...
阅读全文
摘要:给定一个一个数,找出二进制表示有相同数量1的最大的和最小的数。 分析:首先考虑正数,我们将1尽可能放到高位(除符号位)。对于负数,就稍微复杂一点,因为在我们计算机上,负数是用补码表示的,对于补码,1应该竟可能放到低位(除符号位)。知道这些,就很容写出代码来了,下面是参考代码。 #include using namespace std;// 1的个数int ones(unsigne...
阅读全文
摘要:今天将firefox升级到了4.0,有一些改变,非常好,但是也有一些插件不能用。有的插件倒无所谓,但是Gmarks不能用了,我不能接受,我所有的书签都是靠这个插件来管理的,不能用的话,非常不习惯。上网搜了搜,最后的解决办法是,有人升级了该插件,放到了google code上,地址如下:http://code.google.com/p/gmarks/,喜欢firefox 4又在使用Gmarks的朋友...
阅读全文
摘要:今天无意间看到ACE的博客,发现apt-get有加速工具apt-fast,apt-fast的加速原理就是利用axel来取代wget。想当初我就想想办法将apt-get的下载工具改成axel,但是由于自己水平有限,一直没有实现。原来早有大牛已经实现。 下面讲一下安装的过程:1 sudo add-apt-repository ppa:tldm217/tahutek.net2 sudo apt-get ...
阅读全文
摘要:实现一个挺高级的字符匹配算法:给一串很长字符串,要求找到符合要求的字符串,例如目的串:1231******3***2 ,12*****3 这些都要找出来其实就是类似一些和谐系统。。。。。 这题的真正意思就是,给你一个目标串,如“123”,只要一个字符串里面同时包含1、2和3,那么这个字符串就匹配了。系统越和谐,说明错杀的可能行也就越大。加入目标串的长度为m,模式串的长度为n,我们很容易想到O(...
阅读全文
摘要:#####ubuntu10.04#####deb http://mirror.dlut.edu.cn/ubuntu/ lucid main restricteddeb-src http://mirror.dlut.edu.cn/ubuntu/ lucid main restricteddeb http://mirror.dlut.edu.cn/ubuntu/ lucid-updates main ...
阅读全文
摘要:有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小。例如:var a=[100,99,98,1,2, 3];var b=[1, 2, 3, 4,5,40]; ———————————————————— 2011年3月23日更新 感谢lambda2fei同学的提醒,下面的介绍的贪心方法,对于有的测试...
阅读全文
摘要:个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。可能大家都见识过找出一个只出现一次的数,直接把所有的数异或就可以了,最终的结果就是这个数了。但是如果出现两个这样的数,那又将如何呢? 假如这两个数为a和b,那么将所有的数异或得到的数必定为a^b。由于a和b不相等,那么a^b != 0,也就是说在a^b中必定至少...
阅读全文
摘要:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。这题跟之前的排好序列求和有点类似。我们可以永类似于快速排序的方法来做:用一个头指针和一个尾指针,向中间扫描,前面遇到偶数,后面遇到奇数暂停,交换这两个指针的指向,接着向中间扫描,直到两个指针相遇。 代码实现如下:代码 1 /* 2 * File: main.cpp ...
阅读全文
摘要:输入一个正数n,输出所有和为n连续正数序列。 例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。 这题还比较简单,从头开始,少了就往后加,多了就往前减。代码如下: #include using namespace std; void print(const int &start, const int &end) { cou...
阅读全文
摘要:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。 如果按照常规的思路来解决这个问题:首先考虑如何计算一个数n中1的个数,我们可以采用类似于求二进制1的个数的求法,每次除,并取余,看看余是不是1来确定。这样总共的时间复杂度将是O(n),这样是有些慢的。 考虑,如果知道了n的1...
阅读全文
摘要:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。因为可以有如下的push和pop序列:push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop...
阅读全文
摘要:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间复杂度。 首先我们考虑最简单的情况。如果只有1级台阶,那显然只有一种跳法。如果有2级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1级;另外一种就是一次跳2级。现在我们再来讨论一般情况。我们把n级台阶时的跳法看成是n的函数,记为f(n)。当n>2时,第一次跳的时候就有两种不同的选择:一是第一次只跳1级...
阅读全文
摘要:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。 这个题非常简单,考的是位运算,我们每次向左移1位,判断最后一位是不是1就可以了。不多说了,代码如下:#include int count_one(int x){ int count = 0; while (x != 0) { if (x&1 == 1) count...
阅读全文
摘要:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。 将一个字符串分成两部分和两个部分,在字符串上定义反转的操作,即把的所有字符反转(如,那),那么我们可以得到下面的结论:。显然我们这就可以转化为字符串的反转的问题了。 代...
阅读全文
摘要:我们很容易想到递归和循环的方法,最快是O(n)的 对于O(lgn)的解法,我们要用到公式: f(n) f(n-1) 1 1 (n-1)f(n-1) f(n-2) = 1 0 a^n = a^(n/2)*a^(n/2) 或 a^[(n-1)/2]*a^[(n+1)/2] 代码就不写了,很水的
阅读全文
摘要:小儿科,学C++的时候,老师就教过了,从略。
阅读全文
摘要:题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。这题最简单的办法就是暴力法了。除了暴力法,就是找规律了,找规律的过程有点负责,最终的规律是:f(n,m) = [f(n-1,m) + m] % n 有了这个...
阅读全文
摘要:题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。这是一道超级大水题,注意英文字符的话,最多只有256个,这样咱就可以很简单地统计每个字符出现的次数,其实对于这题来讲的话,咱其实都不用去统计出现的次数,每个字符用两个位来记录其状态就可以了。但是为了程序的简单,我们这里使用int来计数。 代码:View Code #include using namespace s...
阅读全文
摘要:题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。例如输入 8 / 6 10 / / 5 7 9 11输出8 6 10 5 7 9 11。这题太水了,层次遍历,一个队列搞定,代码就不写了
阅读全文
摘要:题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。例如输入: 8 / 6 10 / / 5 7 9 11输出: 8 / 10 6 / / 11 9 7 5这题相对很简单,没什么说的,直接代码了核心代码void BSTree::mir...
阅读全文
摘要:题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。仔细想想,你会发现对于排好序的数组来说,直接贪心就可以了。最初我们找到数组的第一个数字和最后一个数字。当两个数字的和大于输入的数字时...
阅读全文
摘要:题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。 这题可以使用两个指针,第一指针首先向后找k个节点,然后两外一个指针同步开始向后,当第一个到最后时,第二个指针就指向了倒数第k个节点。 废话少说,上码:View Code #pragma once#include using namespace std;template class List;template ...
阅读全文
摘要:题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。通常求1+2+…+n除了用公式n(n+1)/2之外,无外乎循环和递归两种思路。由于已经明确限制for和while的使用,循环已经不能再用了。同样,递归函数也需要用if语句或者条件判断语句来判断是继续递归下去还是终止递归,但现在题目已经不允许使用这两种语句了。...
阅读全文
摘要:题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / 6 10 / / 5 7 9 11因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。 这题其实很简单,我...
阅读全文
摘要:题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。不多说了,这个题是一个老题了,最简单的办法就是用大顶堆了,每次遍历数组与堆顶元素进行比较,如果比堆顶小,就替换堆顶,继续调整为大顶堆。 代码如下:View Code #pragma once#include using namespace std;template class...
阅读全文
摘要:题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数22和如下二元树 10 / 5 12 / 4 7则打印出两条路径:10, 12和10, 5, 7。想想其实把所有的路径找出来,然后求和去算就可以解决。但是针对这题,有些路径可以在完全找出来之前就否定了……所以需要剪枝。利用递归的思想:...
阅读全文
摘要:题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。 请参考:http://www.cnblogs.com/youwang/arc...
阅读全文
摘要:题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。 分析:这题的主要限制在时间复杂度为O(1),首先想到的肯定是以空间换时间。这里我们给栈里面的每个元素,若是最小元素,就让他带一个指向上一个最小元素的域,这样就很容易就实现了。 以下是代码View Code #pragma oncetemplate class stac...
阅读全文