代码改变世界

删除字符串中的数字并压缩字符串

2013-08-31 20:27 by youxin, 2140 阅读, 0 推荐, 收藏,
摘要:题目:删除字符串中的数字并压缩字符串 。如字符串”abc123de4fg56”处理后变为”abcdefg”。注意空间和效率。分析:可用两个索引指向字符串的开头,一个向后推进作为循环条件,另一个跨过数据向后推进。达到消除数据及压缩操作。 一快一慢,可称为快慢消除法。/***************************************************************************************删除字符串中的数字并压缩字符串题目:删除字符串中的数字并压缩字符串 。如字符串”abc123de4fg56”处理后变为”abcdefg”。注意空间和效率... 阅读全文

排列 或组合问题的解法(包含回溯法)

2013-08-31 20:15 by youxin, 2940 阅读, 0 推荐, 收藏,
摘要:排列:(A、B、C、D)的全排列为1、A后面跟(B、C、D)的全排列2、B后面跟(A、C、D)的全排列3、C后面跟(A、B、D)的全排列4、D后面跟(A、B、C)的全排列void permutation(int a[], int m, int k) { if (k>m) { ... 阅读全文

卡特兰数(Catalan)简介

2013-08-31 18:04 by youxin, 3629 阅读, 2 推荐, 收藏,
摘要:Catalan序列是一个整数序列,其通项公式是h(n)=C(2n,n)/(n+1) (n=0,1,2,...)其前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452(从0开始)递推:令h(0)=1,h(1)=1 阅读全文

编程之美-分层遍历二叉树

2013-08-30 17:45 by youxin, 450 阅读, 0 推荐, 收藏,
摘要:问题1:给定一颗二叉树,要求按分层遍历该二叉树,即从上到下按层访问该二叉树(每一层将单独输出一行),每一层要求访问的顺序为从左到右,并将节点依次编号,那么分层变量如图的二叉树:输出应为:输出:12 34 5 67 8问题2:写另外一个函数,打印二叉树中某层次的节点(从左到右),其中根节点为第0层,函数原型为int printNodeAtLevel(Node* root,int level),成功返回0,失败返回0.仔细看2个问题,我们发现解决了第二个问题,第一个问题也迎刃而解,要想打印第k层,我们只需要打印k-1层的孩子即可。依此递减。typedef struct Node{ Node*... 阅读全文

12个高矮不同的人,排成两排(catalan数)

2013-08-30 16:08 by youxin, 1348 阅读, 0 推荐, 收藏,
摘要:问题描述:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?这个笔试题,很YD,因为把某个递归关系隐藏得很深.问题分析:我们先把这12个人从低到高排列,然后,选择6个人排在第一排,那么剩下的6个肯定是在第二排.用0表示对应的人在第一排,用1表示对应的人在第二排,那么含有6个0,6个1的序列,就对应一种方案.比如000000111111就对应着第一排:0 1 2 3 4 5第二排:6 7 8 9 10 11010101010101就对应着第一排:0 2 4 6 8 10第二排:1 3 5 7 9 11( 012346 5 7891011 0 阅读全文

四人过桥、三盏灯 三个开关 的答案

2013-08-30 16:04 by youxin, 1874 阅读, 0 推荐, 收藏,
摘要:题目都还是比较老了,再来温习下吧: 1. 有两个房间,其中一间房里有三盏灯,另一间房里有控制这三盏灯的开关。这两间房是相对独立、相对封闭的,没有空 上的直接联系;三盏灯与三个开关也没有顺序上的必然联系。现在只允许你分别进入这两个房间一次,然后判断三盏灯分别是由哪个开关控制的 2. 四人组合的2x合唱团赶往演唱会场,途中必需经过一座桥,天色很暗,而他们只有一只手电筒。一次时最多 有两人一起过桥,而过桥的时候必须持有手电筒,所以就得有人把手电筒带来带去,来回于桥的两端。手电筒是不能用丢的方式来传递的。四个人的步行速度各不同,若两人同行则以较慢者的速度为准。A需花1分钟过桥,B需花2分钟过桥,C需花 阅读全文

给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。

2013-08-30 14:06 by youxin, 2163 阅读, 0 推荐, 收藏,
摘要:题目:给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。要求:空间复杂度O(1),时间复杂度为O(n)。分析:分别从数组两端向中间推进。推出条件为左右相撞 当左端值为偶数,并且右端值为奇数时交换二值,用到一个临时空间。 当左端值为奇数,向右推进一个单位 当右端值为偶数,向左推进一个单位我最开始写的代码:void order(int* arr,int n){ int i=0,j=n-1; while(iusing namespace std;#define odd(s) (s%2)?1:0 //奇数#define even(s) (s%2... 阅读全文

一个int 数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。

2013-08-30 13:39 by youxin, 1132 阅读, 0 推荐, 收藏,
摘要:一个int数组, 比如 array[],里面数据无任何限制,要求求出所有这样的数array[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。分析:这题很直观的一个算法是,挨个的查找各个元素是否满足条件,算法的复杂度是O(n^2),太过复杂。但如果我们在从左到右扫描数组的时候,能够维护一个candidate的数组, 该数组的元素满足: 到目前为止,这些元素都大于等于它前面的元素,而小于等于到目前为止扫描到的它右边的所有元素。 容易证明, candidate数组中的元素是按照非递减顺序排列的,即对任意的iusing namespace std;int f 阅读全文

二分检索(查找)的各种变种

2013-08-29 16:35 by youxin, 1192 阅读, 0 推荐, 收藏,
摘要:其实,二分法真的不那么简单,尤其是二分法的各个变种。 最最简单的二分法,就是从一个排好序的数组之查找一个key值。 如下面的程序:int search(int *arr, int n, int key){ int left = 0, right = n-1; while(left key) right = mid - 1; else left = mid + 1; } return -1;}这个程序,相信只要是一个合格的程序员应该都会写。 稍微注意一点, 每次移动left和right指针的时候,需要在mid的基础上+1或者-1, 防止出现死循环, 程序也就... 阅读全文

排序算法稳定性

2013-08-29 16:01 by youxin, 1032 阅读, 0 推荐, 收藏,
摘要:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。编辑本段判断方法对于不稳定的排序算法,只要举出一个实例,即可说明它的不稳定性;而对于稳定的排序算法,必须对算法进行分析从而得到稳定的特性。需要注意的是,排序算法是否为稳定的是由具体算法决定的,不稳定的算法在某种条件下可以变为稳定的算法,而稳定的算法在某种条件下也可以变为不稳定的算法。例如,对于如下起泡排序算法,原本是稳定的排序算法,如果将记录交换的条件改成r[j]>= 阅读全文
上一页 1 ··· 134 135 136 137 138 139 140 141 142 ··· 269 下一页