![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
每周一道算法
文章平均质量分 65
大冰的小屋
这个作者很懒,什么都没留下…
展开
-
编程之美1.1让CPU占用率曲线听你指挥
题目要求:写一个程序,让用户来决定Windows任务管理器的CPU占用率。程序越精简越好,计算机语言不限。例如可以实现下面三种情况:1. CPU的占用率固定在50%,为一条直线;2. CPU 的占用率为一条直线,具体占用率有命令行参数决定(1-100);3. CPU 的占用率状态是一条正弦曲线。 要操纵CPU的使用率曲线,就需要使CPU在一段时间内是busy状态,一段时原创 2013-06-29 18:53:09 · 1002 阅读 · 0 评论 -
写一个函数,打印二叉树中某层的所有结点
二叉树结点定义: struct Node { int v; Node* left; Node* right; };函数原型: void print_node_at_level(Node* node, int level);说明: 将level层的结点中所保存的值打印在同一行。 思路: 可以利用递归方法,打印no原创 2014-04-01 20:43:11 · 3205 阅读 · 0 评论 -
删除二叉树中的度数为1的所有结点
要求:结点删除后其唯一的子节点代替它的位置。这里用到了递归的方法,不断遍历每个节点的左右子树,将度数为一的结点删除。#include using namespace std;struct Node{ int v; Node* left; Node* right;};void print_div(int p){ for(int i=0; i < p; i++) {原创 2014-04-02 15:09:01 · 1756 阅读 · 1 评论 -
用C/C++实现一个存储整形数据的栈数据结构
要求实现以下功能:(1)入栈操作push(2)出栈操作pop(3)栈大小操作size(4)栈中最小元素min 主要考虑的是怎样记录栈的最小元素,尤其在某些元素出栈以后,由于不能遍历栈中的元素,因此可以利用另外一个辅助的栈来存放栈中现有所有元素的最小值,即在每次入栈的元素和当前辅助栈的栈顶元素比较,如果入栈元素小与等于辅助栈栈顶元素,则将入栈元素也压入辅助栈,如果入栈原创 2014-04-02 16:03:17 · 1355 阅读 · 0 评论 -
二叉树的相等比较
当二叉树每个节点中的值对应相等时,二叉树相等,否则不相等。struct BTreeNode { int v; BTreeNode* left; BTreeNode* right; }; 函数原型: bool BTreeCompare(BTreeNode* b1, BTreeNode* b2);两种实现方式:递归实现和利用层次遍历的方法实现。层次遍原创 2014-04-02 16:59:29 · 1097 阅读 · 0 评论 -
用动态规划算法求解钢条切割问题
分治方法将问题划分为互不相交的子问题,递归地求解子问题,再将它们组合起来,求出原问题的解。与之相反,动态规划应用于子问题重叠的情况,即不同的子问题具有公共的子子问题。原创 2014-05-16 15:48:42 · 1111 阅读 · 0 评论 -
计数排序
计数排序的基本思想:对原创 2014-05-11 17:04:13 · 690 阅读 · 0 评论 -
查找无序序列中第i小的元素
在一个无序的序列中原创 2014-05-12 17:19:07 · 1775 阅读 · 0 评论 -
从N个人中每数m个人就退出该人的一类笔试题
今天去做了个笔试题原创 2014-05-13 22:08:30 · 1000 阅读 · 0 评论 -
对于实现栈中min成员函数的算法设计的改进
一个栈,可以知道它在原创 2014-06-27 16:14:26 · 724 阅读 · 0 评论 -
选择排序和插入排序
选择排序的基本思想:每趟(如第i趟, i = 0, 1, 2,....n-2)后面的n-i个带排列的数据元素中选出关键字最小的元素,作为有序元素序列的第i个元素。#include void swarp(int array1[], int i, int j){ int temp = array1[i]; array1[i] = array1[j]; array1[j] = temp;原创 2013-11-21 22:28:38 · 906 阅读 · 0 评论 -
希尔排序算法---优化了的插入排序
基本思想:创造一些条件,使序列基本有序:小的关键字基本在前面,大的关键字基本在后面,不大不小的基本在中间。这样再进行直接插入排序时就会减少许多的移动操作。实现方式是将序列分成若干个子序列,此时对每个子序列进行直接插入排序,当整个序列都基本有序时,再对全体序列进行一次直接插入排序。 这里子序列的选取是通过一个跳跃分割的方式:将相距某个增量的记录组成一个子序列,(如每相距3个距离的记录组原创 2013-11-24 21:54:27 · 882 阅读 · 0 评论 -
判断一棵树是不是平衡二叉树
平衡二叉树的定义:原创 2014-06-12 10:57:06 · 798 阅读 · 0 评论 -
关于字符串处理的一系列类似算法
在32位机器上,字符是一个长度为8原创 2014-06-11 10:42:00 · 696 阅读 · 0 评论 -
旋转数组中查找某个元素
在一个排序的数组中,如原创 2014-09-06 20:03:39 · 1798 阅读 · 0 评论 -
找出一个整形数组的所有元素除了一个、两个、三个元素外,其余全是成对出现的,找出这些元素
这是常见的一种面试题,其关键思想是利用位操作的异或,同数异或为0, 而0和任何数异或都是它本身: 0^1 = 1; 0^0 = 0; 1^1 = 0;而且满足交换律和结合律 对于只有一个元素不成对的值,只要将数组的每一个元素都异或操作,结果就是那个不成对的元素int FindOne( int a[], int len){ int ret = -1;原创 2013-12-09 22:53:22 · 1040 阅读 · 0 评论 -
合并两个排序了的链表
合并原创 2014-08-16 22:25:17 · 859 阅读 · 0 评论 -
最大子序列和问题 分治算法
问题:给定整数A1,A2,·······,An,求该序列中所有子序列(包括本序列)中的元素和最大值,如果所有整数均为负数,则最大子序列和为0算法一:穷举法。运行时间为O(N3)代码:int MaxSubsequenceSum(const int A[], int N){ int ThisSum, MaxSum, i,j,k; MaxSum = 0; for(i = 0; i<原创 2013-06-29 22:40:35 · 1626 阅读 · 0 评论 -
查找二维排序数组中是否含有某个元素
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下的顺序排序。请实现一个函数用于判断数组中是否含有指定的数。函数原型: bool find_in_matrix(int matrix[N][M], int value);查找成功时返回true, 失败时返回false.例如对于该二维数组的矩阵,观察有上角元素的特点是大于它所在行的其他所有元素,小于它所在列的其他原创 2014-04-01 15:42:13 · 1416 阅读 · 0 评论 -
哈希算法--暴雪的mpq技术
摘自论坛:http://bbs.csdn.net/topics/300172062,先保存下来 强烈的推荐你使用暴雪的mpq技术我在个人机器上实现过4000万条字符串存储,碰撞很小需要代码的话,请留下你的邮箱这里留下我以前用过的一个小程序,稍做修给后应该可以满足你的要求:#include using namespace std; #define nTableSize原创 2014-03-11 13:23:01 · 3030 阅读 · 0 评论 -
编程之美_买书问题
对于买的不同的书越多,打的折扣也就越大,由此想到可用贪心算法,将每一组尽可能多的包含不同的书,这样的折扣就越大,花的钱就越少。然而,在这里贪心算法却出现了反例,当买8本书时,分组为5+3的贪心算法却不如分组为4+4的算法花的钱少:5+3: 5*8*0.75 + 3*8*0.9 = 51.6, 4+4: 2 * 4*8*0.8 = 51.2。这是因为买三本不同的书的折扣为10%,而买4本不同的书原创 2013-07-15 16:56:36 · 991 阅读 · 0 评论 -
关于幂运算的算法
今天看到一个关于求x的n次方幂的运算的递归算法和迭代算法,特意记录下来: 递归算法:int fun(int x, int n){ int val; val = 1; if(n>0) { if(n%2 == 1) val = val * x; val = val * fun(x*x, n/2)原创 2013-10-30 20:43:57 · 1886 阅读 · 0 评论 -
利用回溯的八皇后问题
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。原创 2013-11-17 11:38:31 · 854 阅读 · 0 评论 -
递归实现的字符全排列
题目要求:用C++写一个函数, 如 Foo(const char *str), 打印出 str 的全排列,如 abc 的全排列: abc, acb, bca, dac, cab, cba 通过观察可以发现全排列的方式:把每个元素依次放到第一个位置,剩下的元素再全排列,直到最后一个元素进行全排列(即它本身),所以可以用递归实现。 如a,b,c的全排列:Foo("abc")原创 2013-11-17 16:23:36 · 798 阅读 · 0 评论 -
使用两个队列实现一个栈,使用两个栈实现一个队列!
文章出处:http://blog.csdn.net/begginghard/article/details/6988904 1、这里所说的都是STL中的queue,stack 其中queue的特点是先进先出,它所具有的函数有: queue void push(int elem) //向队列中添加元转载 2013-11-18 20:43:02 · 862 阅读 · 0 评论 -
冒泡排序算法
基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序为止。 对于有n个元素的序列,最坏情况是要冒n-1趟,每趟选出一个最大的元素放在序列的末尾, 或最小的元素放在序列的头部,剩下的元素再次冒泡。 #include void swarp(int array1[], int i, int j){ int temp = array1[i]; array1[i]原创 2013-11-21 22:05:34 · 870 阅读 · 0 评论 -
快速排序算法---20世纪十大算法之一
基本思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行递归排序,以达到整个序列有序的目的。即任取待排记录的某一个记录(如第一个记录)作为基准,按照该记录的关键字大小将整个序列划分成左右两个子序列: 左侧的子序列中的所有记录的关键字都小于或等于基准记录的关键字 右侧的子序列中的所有记录的关键原创 2013-11-25 19:39:46 · 1187 阅读 · 0 评论 -
汉诺塔递归方法的实现
汉诺塔问题:汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 递归实现的思路:假设三根柱子一次是A, B,C;将n快圆盘按由大到小的顺序从底原创 2013-11-12 21:23:53 · 1006 阅读 · 0 评论 -
查找之二分法查找
基本思想: 首先将查找表进行排序 取中间数据元素进行比较 当给定值与中间数据元素的关键字相等时,查找成功 当给定值小于中间元素时, 在中间元素的左区间进行二分查找 当给定值大于中间元素时,在中间元素的右区间进行二分查找 当任意区间均无记录时,查找失败原创 2013-12-09 17:14:05 · 968 阅读 · 0 评论 -
归并排序算法
归并排序就是利用归并的思想实现的排序方法。原理如图所示: #include #include void println( int a[], int len ){ int i = 0; for( i=0; i < len; i++ ) { printf("%d ", a[i]); } printf("\n");}void swap( int a[],原创 2013-12-12 20:58:21 · 723 阅读 · 0 评论 -
堆排序
堆排序是对简单选择排序的一种改进。堆排序可以做到每次在选择到最记录的同时,并根据比较结果对其他记录做出相应的调整,使得排序的总体效率非常高。而简单选择排序的每次比较都没保存下来。将待排序的序列的每个元素从1开始编号到N,将这些编号了的元素按层次遍历的方式组织成一个完全二叉树,例如一个序列是{50, 10, 90, 30, 70, 40, 80, 60, 20}构成的完全二叉树为:原创 2013-12-13 10:55:25 · 723 阅读 · 0 评论 -
合并两个排序的链表
合并两个排序的链表如:链表1:1->3->5->7; 链表2: 2->4->6->8; 合并结果为:1->2->3->4->5->6->7->8;其合并策略类似于归并排序,这里实现了递归和非递归两种方式:非递归合并:ListNode* Merge(ListNode* pHead1, ListNode* pHead2){ if( pHead1 == NULL ) return原创 2013-12-30 11:43:56 · 1061 阅读 · 0 评论 -
利用栈检查程序中成对符号使用的正确性
算法思路: 从第一个字符开始扫描, 当遇到普通字符时忽略,当遇到左符号时压入栈中; 当遇到右符号时从栈中弹出栈顶符号,并和右符号进行匹配: 匹配成功:继续读入下一个字符 匹配失败:立即停止,并报错 结束: 成功:所有字符扫描完毕,且栈为空原创 2013-12-16 21:00:19 · 935 阅读 · 0 评论 -
将二叉搜索树转换成排序的双向链表
按照中序遍历的顺序,当遍历转换到根结点(10)时,它的左子树已经转换成一个排序的链表了,并且处在链表中的最后一个结点是当前值最大的结点(8)。我们把值为8的结点和根结点(10)接起来,此时链表中的最后一个节点就是10了。接着去遍历转换右子树,并把根结点和右子树中最小的结点(12)链接起来。对于怎么转换左右子树,可以用递归实现。 这里利用了二叉搜索树包括它的所有子树: 最小值是最左原创 2014-01-03 13:37:25 · 858 阅读 · 0 评论 -
查找排序数组中数字出现的次数
例如输入数组{1,2,3,3,3,3,4,5,6}中查找3出现的次数。最为简单的方法就是从头遍历这个数组,统计3出现的次数,可是这样没有利用这是一个排序了的数组这个条件,时间复杂度O(n)。另一种方法就是利用二分查找的算法找到一个3,然后分别向左和向右查找第一个和最后一个3所在的位置,这样虽然比第一种方法效率提高了,但是当最坏的情况时,即数组中所有的元素都是3时,这样时间复杂度依然为O(0.5n)原创 2014-01-07 11:40:33 · 846 阅读 · 0 评论 -
两个字符串 char* a, char* b,输出b在a中的位置次序
void output_postion(const char* a, const char* b);如:a = "abdbcc" b = "abc" b 在 a 中的位置次序为 014 015 034 035 这原创 2014-03-04 20:55:50 · 1356 阅读 · 0 评论 -
给你一个由n-1个整数组成的未排序的序列,其元素都是1到n中的不同的整数。请写出一个寻找序列中缺失整数的线性时间算法。
如题:给你一个由n-1个整数组成的未排序的序列,其元素都是1到n中的不同的整数。请写出一个寻找序列中缺失整数的线性时间算法。 最直接的方法就是原创 2014-09-16 21:00:19 · 4206 阅读 · 0 评论