算法&数据结构
文章平均质量分 60
yanziguilai
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
008实现一个算法从一个单链表中返回倒数第n个元素(keep it up)
我们维护两个指针, 它们之间的距离为n。然后,我将这两个指针同步地在这个单链表上移动,保持它们的距离 为n不变。那么,当第二个指针指到空时,第一个指针即为所求。#include struct Node{ int data; Node* next;};void initList(Node* vNode){ for (int i=0; i < 20; ++i) {原创 2014-08-19 00:45:52 · 1646 阅读 · 0 评论 -
022(n>0 && ((n & (n-1)) == 0)) (keep it up)
以下代码的作用:(n>0 && ((n & (n-1)) == 0))很简单:判断n是否为2的整数次幂写程序计算从整数A变为整数B需要修改的二进制位数。输入:31,14输出:2这个题也很简单:A和B异或然后再算结果中1的个数代码:int getModifyNum(const int vA, const int vB){ int Tmp = vA原创 2014-09-12 00:47:56 · 1574 阅读 · 0 评论 -
023 和为S的两个数字(keep it up)
题目描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输入:每个测试案例包括两行:第一行包含一个整数n和k,n表示数组中的元素个数,k表示两数之和。其中1 第二行包含n个整数,每个数组均为int类型。输出:对应每个测试案例,输出两个数,小的先输出。如果找不到,则输出“-1 -1”原创 2014-11-07 22:36:25 · 1201 阅读 · 0 评论 -
025 替换字符串中的空格(keep it up)
剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1510题目描述:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。输入:每个输入文件仅包含一组测试样例。对于每组测试案例,输入一行代表要处理的字原创 2014-11-08 11:22:05 · 918 阅读 · 0 评论 -
024二维数组中的查找(keep it up)
剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1384题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。输入:输入可能包含多个测试样例,对于每个测试案例,输入的第一行为两个整数m和n(1输入的第原创 2014-11-08 10:20:29 · 976 阅读 · 0 评论 -
029斐波那契数列的矩阵解法(keep it up)
剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1387题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。斐波那契数列的定义如下:输入:输入可能包含多个测试样例,对于每个测试案例,输入包括一个整数n(1输出:对应每个测试案例,输出第n项斐波那契数列的值。样例输原创 2014-11-09 22:05:08 · 1005 阅读 · 0 评论 -
030变态跳台阶(keep it up)
剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1389题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。输入:输入可能包含多个测试样例,对于每个测试案例,输入包括一个整数n(1输出:对应每个测试案例,输出该青蛙跳上一个n级的台阶总共有多少原创 2014-11-09 22:41:35 · 968 阅读 · 0 评论 -
033 调整数组顺序使奇数位于偶数前面(keep it up)
剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1516题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。输入:每个输入文件包含一组测试案例。对于每个测试案例,第一行输入原创 2014-11-11 11:20:07 · 1028 阅读 · 0 评论 -
034链表中倒数第k个结点(keep it up)
剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1517题目描述:输入一个链表,输出该链表中倒数第k个结点。(hint: 请务必使用链表。)输入:输入可能包含多个测试样例,输入以EOF结束。对于每个测试案例,输入的第一行为两个整数n和k(0输入的第二行包括n个数t(1输出:原创 2014-11-11 19:26:55 · 979 阅读 · 0 评论 -
031 二进制中1的个数(keep it up, 看到这个题刚开始有点蒙)
剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1513题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。输入:输入可能包含多个测试样例。对于每个输入文件,第一行输入一个整数T,代表测试样例的数量。对于每个测试样例输入为一个整数。。n保证是int范围内的一个整数。原创 2014-11-10 19:51:43 · 1078 阅读 · 0 评论 -
032数值的整数次方(keep it up)
剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1514题目描述:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。输入:输入可能包含多个测试样例。对于每个输入文件,第一行输入一个整数T,表示测试案例的数目,接下来的T行每行输入一个浮点数ba原创 2014-11-10 19:54:34 · 944 阅读 · 0 评论 -
035树的子结构(keep it up)
剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1520题目描述:输入两颗二叉树A,B,判断B是不是A的子结构。输入:输入可能包含多个测试样例,输入以EOF结束。对于每个测试案例,输入的第一行一个整数n,m(1输出:对应每个测试案例,若B是A的子树输出”YES”(不包含原创 2014-11-14 20:39:41 · 972 阅读 · 0 评论 -
036二叉树的镜像(keep it up)
剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1521题目描述:输入一个二叉树,输出其镜像。输入:输入可能包含多个测试样例,输入以EOF结束。对于每个测试案例,输入的第一行为一个整数n(0Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号。Ci=’l’表示第i个节点原创 2014-11-20 22:02:32 · 917 阅读 · 0 评论 -
026从尾到头打印链表(keep it up)
剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1511题目描述:输入一个链表,从尾到头打印链表每个节点的值。输入:每个输入文件仅包含一组测试样例。每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点。第一行是链表第一个节点的值,依次类推。当输入到-1时代表链表输入完毕。-1本身不属于链表原创 2014-11-08 12:32:01 · 954 阅读 · 0 评论 -
(016)给定一个有序数组(递增),写程序构建一棵具有最小高度的二叉树(keep it up)
给定一个有序数组(递增),写程序构建一棵具有最小高度的二叉树。由于数组是递增有序的,每次都在中间创建结点,类似二分查找的方法来间最小树。struct TreeNode{ int data; TreeNode* leftChild; TreeNode* rightChild;};void newNode(TreeNode*& vNode, int vData){ vNode原创 2014-08-30 01:48:52 · 2015 阅读 · 0 评论 -
027根据前序遍历和中序遍历,重建二叉树(keep it up)
剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1385题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。输入原创 2014-11-08 19:33:12 · 1183 阅读 · 0 评论 -
018给定二叉查找树的一个结点, 写一个算法查找它的“下一个”结点“(keep it up)
给定二叉查找树的一个结点, 写一个算法查找它的“下一个”结点(即中序遍历后它的后继结点), 其中每个结点都有指向其父亲的链接。这个题本质就是线索化二叉树时找后继结点的题。找后继结点存在两种情况:1 如果当前结点有右孩子,则后继结点为右孩子的最左结点2 如果没有右孩子, A 当前结点为父结点的左孩子,则父结点就是后继结点B 当前结点为父结点的右孩子,则向父结点找,直到原创 2014-09-03 01:04:00 · 1580 阅读 · 0 评论 -
(017)将一棵二叉查找树重构成链表(keep it up)
给定一棵二叉查找树,设计算法,将每一层的所有结点构建为一个链表(也就是说, 如果树有D层,那么你将构建出D个链表).这个题实质是个BFS,但是实现起来有点麻烦,又不像常见的BFS,所以编写代码时有点艰难。下面的代码使用两个list来实现层次遍历的,首先用Cur链表存储当前层的结点,然后用Pre链表存储当前层的子层结点,Cur和Pre。下一次遍历时Pre就变成当前层,Cur就原创 2014-09-01 01:01:20 · 1192 阅读 · 0 评论 -
006矩阵旋转90度(keep it up)
一张图像表示成NxN的矩阵,图像中每个像素是4个字节,写一个函数把图像旋转90度。 你能原地进行操作吗?(即不开辟额外的存储空间)这个题第一感觉就是一次交换矩阵的元素:比如 3*3 矩阵1 2 34 5 67 8 9先处理第一行,一次逆时针旋转四个元素,下面是二次做的3 2 9 3 6 94 5 6 2 5 81 8 7原创 2014-08-15 20:59:02 · 1144 阅读 · 0 评论 -
009实现一个算法来删除单链表中的一个结点,只给出指向那个结点的指针(keep it up)
呵呵,这个题不能直接删除已知的结点,因为是单链表,不知道前驱,只知道后继结点,直接删除会使链表断开。不过我们可以删除已知结点的后继结点,把后继结点的值赋值给已知结点。#include struct Node{ int data; Node* next;};bool removeNode(Node* vNode){ if (vNode == NULL || vNo原创 2014-08-20 00:35:57 · 1392 阅读 · 0 评论 -
007 字符串(keep it up)
假设你有一个isSubstring函数,可以检测一个字符串是否是另一个字符串的子串。 给出字符串s1和s2,只使用一次isSubstring就能判断s2是否是s1的旋转字符串, 请写出代码。旋转字符串:"waterbottle"是"erbottlewat"的旋转字符串。简答题:#include #include bool isSubstring(const std::stri原创 2014-08-18 00:56:22 · 1417 阅读 · 0 评论 -
001 unique string
以后坚持每个星期都写记到算法题,不论简单还是难,纯熟娱乐!描述:实现一个算法来判断一个字符串中的字符是否唯一(即没有重复).不能使用额外的数据结构。 (即只使用基本的数据结构)代码:#include #include #include #include bool isUnique(const std::string& vStr){ if (vStr.size()原创 2014-08-10 10:43:23 · 1040 阅读 · 0 评论 -
002 bitmap海量数据的快速查找和去重
题目描述给你一个文件,里面包含40亿个整数,写一个算法找出该文件中不包含的一个整数, 假设你有1GB内存可用。如果你只有10MB的内存呢?原创 2014-08-10 22:51:58 · 5730 阅读 · 2 评论 -
011实现一个栈,除了push和pop操作,还要实现min函数以返回栈中的最小值,时间复杂度都为O(1)(keep it up)
实现一个栈,除了push和pop操作,还要实现min函数以返回栈中的最小值。 push,pop和min函数的时间复杂度都为O(1)。看到这个题目最直接的反应是用一个变量来保存当前栈的最小值,让我们来看看这样可行否?如果栈一直push那是没有问题,入栈元素如果比当前最小值还小,那就更新当前最小值。 可是如果pop掉的栈顶元素就是最小值,那么我们如何更新最小值呢?显然不太好办。原创 2014-08-22 21:22:39 · 2044 阅读 · 0 评论 -
010给定一个循环链表,实现一个算法返回这个环的开始结点 (keep it up)
给定一个循环链表,实现一个算法返回这个环的开始结点。定义:循环链表:链表中一个结点的指针指向先前已经出现的结点,导致链表中出现环。例子:输入:A -> B -> C -> D -> E -> C [结点C在之前已经出现过]输出:结点C可以用一个map 就解决问题了。下面是编程之美上一种奇特的解法:快慢指针解法。代码:原创 2014-08-22 19:51:09 · 2141 阅读 · 0 评论 -
003实现字符串反转reverse
这个简单就直接代码了//写代码翻转一个C风格的字符串。(C风格的意思是"abcd"需要用5个字符来表示,包含末尾的 结束字符)#include #include void swap(char& vLeft, char& vRight){ char Temp = vLeft; vLeft = vRight; vRight = Temp;}char* reverse(ch原创 2014-08-12 00:28:56 · 1165 阅读 · 0 评论 -
020给定两个二叉树T1,T2判断T1是否是T2的子树(keep it up)
给定两个二叉树T1,T2判断T1是否是T2的子树首先在T2中查找T1的根节点,如果找不到,则T1不是T2的子树,如果能找到,我们可以遍历T1,检查T1的每个结点是否对应的存在T2中。代码:struct TreeNode{ int data; TreeNode* leftChild; TreeNode* rightChild;};bool isExited(co原创 2014-09-09 00:50:58 · 2156 阅读 · 0 评论 -
012温习汉诺塔 (keep it up)
汉诺塔:有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,应该怎么移动?汉诺塔是个非常经典的问题,讲递归时应该都会讲到它。如果我们没有递归的先验知识, 直接去解答这道题,常常会觉得不知道如何下手。用递归却可以非常优美地解决这个问题。使用递归的一个关键就是,原创 2014-08-25 00:29:32 · 1392 阅读 · 0 评论 -
004字符串去重 (keep it up)
设计算法并写出代码移除字符串中重复的字符,不能使用额外的缓存空间。注意: 可以使用额外的一个或两个变量,但不允许额外再开一个数组拷贝。简单题直接上代码:#include #include void remove_duplicate(char vStr[]){ int Len = strlen(vStr); if (!Len) { printf("the stri原创 2014-08-13 00:30:03 · 969 阅读 · 0 评论 -
013使用两个栈实现一个队列(keep it up)
使用两个栈实现一个队列队列是先进先出的数据结构(FIFO),栈是先进后出的数据结构(FILO), 用两个栈来实现队列的最简单方式是:进入队列则往第一个栈压栈, 出队列则将第一个栈的数据依次压入第二个栈,然后出栈.两条规则:1)进队列,则直接压入第一个栈2)出队列,若果第二个栈不为空,直接pop(),如过第二个栈为空,则把第一个栈中的数据全部压入第二个栈(第一个栈此时为空原创 2014-08-27 00:53:22 · 1438 阅读 · 0 评论 -
021位操作1(keep it up)
给定两个32位的数,N和M,还有两个指示位的数,i和j。写程序使得N中第i位到第j位的值与M中的相同(即:M变成N的子串且位于N的第i位和第j位之间)例子:输入: N = 10000000000, M = 10101, i = 2, j = 6输出: N = 10001010100解法:首先我们把M左移vI位得到Mv;然后我们保留N的0到I位:Si=N & ((1然原创 2014-09-10 00:55:11 · 1084 阅读 · 0 评论 -
014写程序将一个栈按升序排序,对这个栈是如何实现的,你不应该做任何特殊的假设(keep it up)
写程序将一个栈按升序排序。对这个栈是如何实现的,你不应该做任何特殊的假设。程序中能用到的栈操作有:push | pop |isEmpty最容易想到的就是优先队列来做此题,容易实现。另外我们可以再用一个栈来实现栈的升序排列。优先队列://优先队列来实现void sortStack(std::stack& vStk){ std::priority_queue, std::gr原创 2014-08-28 00:54:45 · 1772 阅读 · 0 评论 -
(015)实现一个函数检查一棵树是否平衡(keep it up)
实现一个函数检查一棵树是否平衡。对于这个问题而言, 平衡指的是这棵树任意两个叶子结点到根结点的距离之差不大于1。这个题我们可以采用暴力搜索,找到叶子节点到根节点的最小值和最大值,然后他们的差如果大于1就不是平衡树,反之则是平衡树。int MinDepth = std::numeric_limits::max();int MaxDepth = std::numeric_limits::原创 2014-08-29 02:41:21 · 1412 阅读 · 0 评论 -
005判断两个字符串是否是变位词 (keep it up)
写一个函数判断两个字符串是否是变位词。变位词(anagrams)指的是组成两个单词的字符相同,但位置不同的单词。比如说, abbcd和abcdb就是一对变位词这也是简单的题。 我们可以排序然后对比, 也可以直接统计字符出现的个数来判断。这里给出统计字符来判断的代码:bool isAnagram1(const string& vLeft, const string& vRight){原创 2014-08-14 01:46:24 · 1708 阅读 · 0 评论 -
019写程序在一棵二叉树中找到两个结点的最近共同祖先(keep it up)
写程序在一棵二叉树中找到两个结点的最近共同祖先。分两种情况来讨论这个题:第一种情况结点中没有指向父结点的指针第二种情况接种有指向父节点的指针我们先看第一种情况,结点中没有指向父结点的指针。我们可以采用暴力搜索每一个结点,如果这个结点的子树中有已知的两个结点,那我们就继续沿着左右子树找,如果左子树能找到,我们就继续沿着左子树找,如果有子树能找到,我们就沿着右子原创 2014-09-07 01:54:23 · 2127 阅读 · 0 评论
分享