![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
来自结构之法算法之道的算法题
文章平均质量分 66
名字到底多长
算法题来自大神的博客:http://blog.csdn.net/v_JULY_v?viewmode=contents
展开
-
把二元查找树转变成排序的双向链表
百度了下,二元查找树就是二叉排序树。。。这题没什么营养,中序遍历就能出来。如果说最像的,可能是中序遍历得到的线索二叉树代码如下:public Node convertBST(Node root){ if(root==null){ return null; } return this.convertBST(root, null);//返回的是尾节点 } pri原创 2012-09-30 11:48:22 · 319 阅读 · 0 评论 -
在有序数组中查找两个数,使得它们的和正好是输入的那个数字。时间复杂度O(n)
代码: function getCal(numbers,calValue){ for(var i=0,j=numbers.length-1;i<j;){ var start = numbers[i]; var end = numbers[j]; if(start+end==calValue){ alert(start+"+"+end); i++原创 2012-10-20 13:45:53 · 1643 阅读 · 0 评论 -
在从1到n的正数中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。js是number类型,当数字是个位数的时候,除以10会返回小数,除以10取余会返回自身,和强类型语言完全不一样。代码: window.onload = function(){ var sequ =原创 2012-10-22 22:29:50 · 1053 阅读 · 0 评论 -
16 栈与队列
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。栈的代码package nuaa.ds;public class ArrayStack> { private StackNode[] theArray; private int topOfStack; private static fin原创 2012-09-30 12:05:25 · 296 阅读 · 0 评论 -
左旋字符串
// 翻转字母和数字串的位置 #include using namespace std;void rotationLeft(char *,int,int);int main(){ char str[30] = "adfaefwefdasf34564545"; //12 20 cout<<str<<endl; int i; for(i=0;;i++) //原创 2013-07-06 21:02:16 · 517 阅读 · 0 评论 -
从一个首尾相连的大长串中找到最短小集合
小集合用数组表示初始化为0,end从头开始扫描找到一个数组中元素对应位置+1,一直到数组中所有元素都不为0则这时为一个符合的串,start从头开始扫扫到一个数组中对应位置减1,直到出现第一个0,则这个就是一个最短串;(此时数组中某个元素为0,等价于start刚刚的位置往后挪一个位置再次扫描)end继续往后扫重复之前的过程直到start到最后。// shortest sequence原创 2013-07-03 22:08:57 · 674 阅读 · 0 评论 -
链表的翻转合并创建
#include using namespace std;struct Node{ int value; Node *next;}; Node* createLinkedList(int *,int);void printLinkedList(Node *);Node* merge(Node*,Node*);Node* reverse(Node*);Node* crea原创 2013-07-04 23:25:06 · 502 阅读 · 0 评论 -
收集的一些题or结论2
#include using namespace std;/* 已知字符串里的字符是互不相同的,按照字典序输出所有的组合,比如ab输出aa,ab,ba,bb。 思路: 1 要字典序,所以要首先对数组排序(冒泡排序的第一层循环只是用来控制做多少次的,和第二层循环基本没联系) 2 一个完整的输出 = 填入一个字符 + 填入剩下的字原创 2013-09-02 18:59:33 · 866 阅读 · 0 评论 -
二维数组的动态规划与LCS
点击打开链接最长共同字串(LCS):抛弃习惯性的从头开始比较的想法,从最尾开始比较LCS(Xm,Yn) = LCS(Xm-1,Yn-1)+1 if(xm=yn)orLCS(Xm,Yn) = MAX{LCS(Xm-1,Yn),LCS(Xm,Yn-1)} if(xm!=yn)递归代码:#include#includeusing namespace std;原创 2013-09-07 14:53:11 · 1923 阅读 · 0 评论 -
在序列中找到符合某个条件的子序列
// 在序列中找到符合某个条件的子序列 #include using namespace std;int continumax(char *outputstr,char *inputstr);int main(){ char* str = "sadf2440353adfafd1212sfol;49018498tff"; //DEV C++和win7编译能过但运行就会挂;原创 2013-07-06 20:18:39 · 905 阅读 · 0 评论 -
输入一个单向链表,输出该链表中倒数第k个结点
//链表用指针迭代,数组用下标迭代,就可以模拟了 function getLastKthNode(a,k){ var p = 1; var q = p; for(var i=0;i<k;i++){//顺序往后挪K个位置 q = q+1; } while(q<a.length){//一直往后直到q到最后再出去一个,p就是要的节点 p = p+1; q = q+原创 2012-10-20 19:50:16 · 1010 阅读 · 0 评论 -
写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)
功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr所指内存。例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,outputstr所指的值为123456789 window.onload = function(){ var sequ = windo原创 2012-10-22 10:16:39 · 624 阅读 · 0 评论 -
大整数加法减法
超过long域的整数加法减法,代码: window.onload = function(){ var inputs = document.getElementsByTagName("input"); //alert(inputs.length); inputs[3].onclick = function(){ inputs[2].value = big原创 2012-10-20 19:02:46 · 474 阅读 · 0 评论 -
子数组的最大和(数组)
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。这个在weiss写的java版数据结构第四版这题用来讲解O(n3),O(n2),O(n原创 2012-09-30 12:46:10 · 511 阅读 · 0 评论 -
左旋字符串
输入n与数组t,正数表示数组往左移动n位,负数表示数组往右移动n位。要求时间为n阶,空间为1来自于结构之法的作者,较好的算法是:将一个字符串分成两部分,X和Y两个部分,在字符串上定义反转的操作X^T,即把X的所有字符反转(如,X="abc",那么X^T="cba"),那么我们可以得到下面的结论:(X^TY^T)^T=YX。显然我们这就可以转化为字符串的反转的问题原创 2012-09-29 23:25:23 · 624 阅读 · 0 评论 -
.在二元树中找出和为某一值的所有路径
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如 输入整数22和如下二元树 10 / / 5 12 / / 4 7则打印出两条路径:10, 12和10, 5, 7。/** * 找到和为某值的二叉树 */ publ原创 2012-10-04 20:50:18 · 639 阅读 · 0 评论 -
寻找一个字符串中最先出现的只有一个的字母
比如:第一个出现的且只有一个的为Echar[] c = {'a','c','d','c','a','e','f','D','F','a','A','g','H','z','Z','T','R'};算法思路:逐个拆字符串中的字符,根据数组order对应位置是否有非0值判断是否第一次出现,是的话存放计数器值并且hasOne赋值为true,不是的话更新hasOne对应位置为false。原创 2012-10-05 12:33:50 · 920 阅读 · 0 评论 -
求K个最小元素
算法:1 排序后取前K个算法,比较笨2排序算法中有些通过取本次循环最小的K实现排序的,因此排下前K个元素就可以实现取得最小的K个元素,比如selectionSort、bubbleSort、heapSort,对于selectionSort和bubbleSort,复杂度为O(Kn)。对于堆排序来说,有一些自己的实现变体:a)最简单的就是O(n)的复杂度实现最小堆,然后排序最小的K个元素原创 2012-10-03 15:48:47 · 1307 阅读 · 0 评论 -
大整数分割成 多个小整数问题(二)
问题:分硬币问题,假设sum代表总的钱数,数组a中的元素代表有的单个硬币,问sum最少需要a中的几个硬币(可以重复)加起来才能得到sum?比如:int[] a = {1,10,15,21,25};int sum = 63;那么最少就是3个21的才能得到sumps:贪婪算法在这个例子中就不成立,所以贪婪方法没有用算法1:和大整数分割成 多个小整数问题(一)一原创 2012-10-08 21:34:10 · 977 阅读 · 0 评论 -
大整数分割成 多个小整数问题(三)
问题:输入2个数n和m,打印出1,2,3.....n中加起来能等于m的所有不同式子,5=1+4和5=4+1是同一个代码如下:原创 2012-10-08 21:41:42 · 1015 阅读 · 0 评论 -
翻转句子中单词的顺序
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。这个思路和左旋字符串差不多,先翻转单个单词,再翻转整个串。代码如下:/** * * @param s 前面有空白和乱字符就用循环去原创 2012-10-11 20:53:12 · 971 阅读 · 0 评论 -
大整数分割成 多个小整数问题(一)
n个台阶每次走一个或者两个走法数,这个属于递归分治算法么????/** * 跳台阶问题:一共n个台阶,每次跳一个台阶或者两个,共有多少种走法 * @param n 台阶总数 * 递归分治算法 */ public int stairsProblem(int n){ int result = 0; if(n<0) return 0; if(n==1|原创 2012-10-07 17:20:12 · 1510 阅读 · 0 评论 -
二叉树大总结1 ---- 排序二叉树的各种题
#include #include #include using namespace std;/* 二叉查找树中的保存指针 */templateclass BinarySearchTree{public: struct Node { T* value; Node* left; No原创 2013-09-20 23:36:39 · 853 阅读 · 0 评论