~$ 存档

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

2016年3月14日

摘要: 另一种解法:将数组全部置1,累计相加到报数,则将该位置置为0,意为该位出列,如此反复。关键在于:把数组作环状处理,这个手法已经演练很多遍了! 阅读全文
posted @ 2016-03-14 09:16 LuoTian 阅读(316) 评论(0) 推荐(0)

摘要: /* 此解法有一bug,假如有8个人,从第一个人开始数,每说到1就删除,相当于自删除,程序崩溃 */约瑟夫问题,有n个人,编号为1,2,...,n,围成一个圆圈,按照顺时针方向从编号为k的人从1开始报数,报数为m的人出列,如此重复下去,直到所有的人都出列。编写一个算法,要求输入n,k,m,按照出列的 阅读全文
posted @ 2016-03-14 07:09 LuoTian 阅读(1994) 评论(0) 推荐(0)

摘要: 创建不带头结点,只有head指针(n个结点): 阅读全文
posted @ 2016-03-14 06:20 LuoTian 阅读(225) 评论(0) 推荐(0)

摘要: 这题看似简单,但是琢磨一下,还是挺有意思! 阅读全文
posted @ 2016-03-14 01:30 LuoTian 阅读(554) 评论(0) 推荐(0)

2016年3月12日

摘要: /* 完整代码@映雪 */ #include <iostream> using namespace std; #define change(x,y); \ a[x]=a[x]+a[y];\ a[y]=a[x]-a[y];\ a[x]=a[x]-a[y]; void f(int a[],int l,i 阅读全文
posted @ 2016-03-12 02:24 LuoTian 阅读(1163) 评论(0) 推荐(0)

摘要: /*网络摘录加工*/尾部递归是一种编程技巧。递归函数是指一些会在函数内调用自己的函数,如果在递归函数中,递归调用返回的结果总被直接返回,则称为尾部递归。尾部递归的函数有助将算法转化成函数编程语言,而且从编译器角度来说,亦容易优化成为普通循环。这是因为从电脑的基本面来说,所有的循环都是利用重复移跳到代 阅读全文
posted @ 2016-03-12 00:39 LuoTian 阅读(423) 评论(0) 推荐(0)

2016年3月11日

摘要: 问题提出:求数组A={1,5,7,22,9}中的最大值。这种递归非常绕,需要简化来看,比如拿只含两个元素的数组带进去观察。如A={12,25},把问题简化到最简单。 另一种精简的算法,来源于《算法:C语言实现》117页 这种思路简化说明:把一个数组不停的二分对切,只到不能再切为止(切到只有一个元素时 阅读全文
posted @ 2016-03-11 22:02 LuoTian 阅读(734) 评论(0) 推荐(0)

摘要: 计算1+2+3+4+5第一种,从后往前加。 第二种,从两边对加,例:(1+5)+(2+4)+3,需要判定,假如元素个数为偶,则左边+1==右边,如果为奇数,则左边==右边: 阅读全文
posted @ 2016-03-11 21:28 LuoTian 阅读(671) 评论(0) 推荐(0)

摘要: 有一个背包最多可装重量8千克的物品,假设要用该背包装如下水果,要求使背包中装的物品的价值最大,应该装下列哪些物品才能达到要求? 解题思路:首先穷举所有组合可能,有5种物品,一共组合32-1种可能。然后排除超重的可能,在不大于8千克的前提下,再计算各种可能的总价值,最后,比较这些组合的价值,得到最大值 阅读全文
posted @ 2016-03-11 07:44 LuoTian 阅读(4905) 评论(0) 推荐(0)

2016年3月10日

摘要: 阅读全文
posted @ 2016-03-10 17:52 LuoTian 阅读(222) 评论(0) 推荐(0)

摘要: 选择排序的基本思想:对n个记录进行扫描,选择最小的记录,将其输出,接着在剩下的n-1个记录中扫描,选择最小的记录将其输出,不断重复这个过程,直到只剩一个记录为止... 简单选择排序法类似人的排序习惯:从数据中选择最小(或最大)的一个数据,然后将该数与第1个数交换,接下来从剩下数据中选择最小(或最大) 阅读全文
posted @ 2016-03-10 16:16 LuoTian 阅读(234) 评论(0) 推荐(0)

摘要: 冒泡排序法是一种相邻数据交换的排序方法。基本思想是:对待排序记录关键字从后往前(逆序)进行多遍扫描,当发现相邻两个关键字的次序与排序要求的规则不符时,就将这两个记录进行交换。这样,关键字较小的记录将逐渐从后面向前面移动,就像气泡在水中向上浮一样。 改进算法:设置一个标志变量flag,在每一遍扫描之前 阅读全文
posted @ 2016-03-10 15:25 LuoTian 阅读(362) 评论(0) 推荐(0)

摘要: 【补充另一种方法:】http://www.cnblogs.com/tinaluo/p/5249195.html看笛卡尔积时突然想到的问题,现有集合A={1,5,7,10,12},集合B={5,10,12},检测集合A从前往后的有序方向是否包含集合B的每一个元素?经过计算,发现使用队列比较合适,如图: 阅读全文
posted @ 2016-03-10 02:20 LuoTian 阅读(505) 评论(0) 推荐(0)

2016年3月9日

摘要: 补充:(改进:一种递归方法)http://www.cnblogs.com/tinaluo/p/5294341.html已知集合S,S的幂集合是指集合S所有子集的集合,用P(S)来表示,例如: 这让我想起二进制模拟,假如现在用算法模拟打印幂集合(空集除外),该怎么办呢?二进制模拟起到很好的作用,首先来 阅读全文
posted @ 2016-03-09 23:46 LuoTian 阅读(1336) 评论(0) 推荐(0)

2016年3月8日

摘要: 根据书上描述,共享栈的特点是:两个栈顶,置放在数组两头,入栈迎面相向,相遇时栈满,看图示: 主要处理两步工作:第一,栈空的标志。这里沿用前面的约定,左栈用-1,而右栈用MAXSIZE,也就是放在数组的最左右两端。第二,判满。这里采用左栈+1=右栈表明栈满。 此外,还需要一个状态标志flag,让用户选 阅读全文
posted @ 2016-03-08 19:15 LuoTian 阅读(1977) 评论(0) 推荐(0)

摘要: 对于数组(也可为线性表),逆置就是首尾数据两两交换,首先计算交换的次数: 交换次数=(len-1)/2 第二种,单链表,这个困难很多,因为链表只有一个头指针,要依赖这个指针对整个链条进行操作,需要很高的技巧!首先观察链表: 如果逆置(反序),交换数据是不可能的,只有换种思路,把结点之间的指针指向反转 阅读全文
posted @ 2016-03-08 03:00 LuoTian 阅读(571) 评论(0) 推荐(0)

2016年3月7日

摘要: 《编程之美》221页,问题:字符串scr=“AABCD”,字符串des="CDAA",循环移位src,是否包含串des? 首先考虑的是移位的问题,有两种可能,要么左移,要么右移,书中采用的是左移的方式。在移动AABCD之后,得到 ABCDA,问题就在于这个最先移动的A放在哪?根据前面的学习,马上可以 阅读全文
posted @ 2016-03-07 20:26 LuoTian 阅读(346) 评论(0) 推荐(0)

摘要: 除此之外,并集的这个思路还可以求两个集合的相同元素,例,A={1,3,5,7},B={2,3,7},求两数组的相同元素 阅读全文
posted @ 2016-03-07 00:41 LuoTian 阅读(479) 评论(0) 推荐(0)

2016年3月6日

摘要: #include using namespace std; void draw(int n,int x) { if(x0) { draw(n-1); draw(n,1); cout using namespace std; int main() { for(int i=1;i<=9;i++) { ... 阅读全文
posted @ 2016-03-06 22:37 LuoTian 阅读(336) 评论(0) 推荐(0)

摘要: 首先,把书上的算法简化一下,直接用数组研究更直观。 定义一个数组: 它假设第一个元素是有序的,然后用第二个元素(下一个元素)和它进行比较,通过循环移动判定,得到一个有序列。得到一个有序列之后,再用下一个元素和这个有序列进行比较,这里的比较,就是局部比较,采用的是尾插法,从后往前。 比如,前两个元素排 阅读全文
posted @ 2016-03-06 18:42 LuoTian 阅读(324) 评论(0) 推荐(0)