摘要:
要想把字符串S1变成S2,可以经过若干次下列原子操作:1.删除一个字符2.增加一个字符3.更改一个字符字符串S1和S2的编辑距离定义为从S1变成S2所需要原子操作的最少次数。解法跟上面的最长公共子序列十分相似,都是动态规划,把一个问题转换为若干个规模更小的子问题,并且都借助于一个二维矩阵来实现计算。约定:字符串S去掉最后一个字符T后为S',T1和T2分别是S1和S2的最后一个字符。则dist(S1,S2)是下列4个值的最小者:1.dist(S1',S2')--当T1==T22.1+dist(S1',S2)--当T1!=T2,并且删除S1的最后一个字符T13.1+ 阅读全文
摘要:
题目:二叉树的结点定义如下:struct TreeNode{int m_nvalue;TreeNode* m_pLeft;TreeNode* m_pRight;};输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。解法:要想找到两个节点的最低共同父结点,其实就是找一个节点,使得它的左子树包含两个结点中的一个结点,右子树包含另外一个节点。该算法的C代码可以写成如下:View Code Node * pResult = null; int GetChildNode(Node * pRoot, Node * node_1, Node * node_2) { if (null... 阅读全文
摘要:
问题背景:有一副牌假设有N张,请设计一个随机洗牌算法。解决方案:这里只给出一个可以使用数学证明每张牌出现在任何位置概率为1/N的算法。Poker[N]for (i = 0; i < N; ++i){k = rand() % ( i + 1)if (i != k){switch(Poker[k], Poker[i]);}}分析:第一次取第一张牌(i=0)保持位置不变。第二次取第二张牌(i=1),随机生成0-1的随机数k,如果随机生成数不为1,则交换下标为k和i的牌,否则不进行交换。假设现在取第Z张牌(i = Z - 1), k= rand()%Z, 如果k!=i则交换下标为k和i的两张牌。 阅读全文
摘要:
一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。解法:1> 求出5个数值中的最大和最小值 Max, Min.2> 如果Min = Max = 0, 则是连续的。3> 遍历整数数据将所有在Min 和 Max之间的数值求和sum, 包括min 和Max本身。4> 如果sum的与5个元素的和相等,则说明5个元素是相邻连续的。算法时间复杂度为O(N), 空间复杂度为O(1) 阅读全文
摘要:
问题:给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数。解答:假设我们要等概率生成一个3位的10进制数(000 - 999),我们可以在 随机生成整数0到9的函数 基础上,随机生成3个数字组成三位数就得到了结果。这里类似,我们首先必须认识到:任何一个数都可以用5进制的数来表示,如12 = 5进制(22) = 2*5 + 2。因此假设我们要随机生成[0,444]范围的数,我们只要随机生成3个5进制的数字组合就可以。这里的主要问题是:7不是5的幂次方。但是我们可以将某一个5的幂次方均分成 7 段(分别为0 - 6,等概率的落到每一段),利用5进制随机成一个数,看这个数在哪一个段,就代 阅读全文