algorithm
文章平均质量分 63
tianya_team
关注抖音号:天天coding,免费获得源码以及技术指导。
展开
-
面试题56:构建乘积数组
题目:给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。思路:令C[i]=A[0]*A[1]*...*A[i-1,D[i]=A[i+1]*...*A[n-1]则有B[i]=C[i]*D[i]又C[i+1]=C[i]+A[i],D原创 2016-01-14 16:12:20 · 273 阅读 · 0 评论 -
面试题74:机器人的运动范围
题目:地上有一个m行n列的方格。一个机器人从坐标(0,0)的格子开始移动,它每一次可以向左、右、上、下移动一格,但不能进入行坐标和列坐标的数位(个位、十位等)之和大于K的格子。请问该机器人能够到达多少个格子?思路:参考:面试题73:矩阵中的路径#include #include #include #include #include //堆算法#incl原创 2016-03-31 18:31:23 · 349 阅读 · 0 评论 -
大数相乘
编写任意位数的大数相乘的程序。经典的方法是:1)将字符串转为数字并反转(string到vector)2)逐位相乘,结果放到resultNum中(vecotr resultNum(a.size()+b.size(),0))3)清除resultNum中多余的0,处理进位4)将计算结果转为字符串并反转#include#include #include using n原创 2016-03-11 15:33:36 · 364 阅读 · 0 评论 -
面试题58:检查单链表是否回文
题目:对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断该链表是否回文。边界条件:传入指针为空。思路:先通过两个指针,来找到中间结点指针mid,然后mid指针到链表末端开始回溯,另一个指针head开始和这个指针的值进行比较。#include using namespace std;struct ListNode {原创 2016-03-22 22:01:46 · 383 阅读 · 0 评论 -
面试题59:二叉树序列化
题目:二叉树被记录成文件的过程叫做二叉树的序列化。序列化的方法有很多,这里我们采用括号序列的方法将其序列化,所谓括号序列指的是对于一个节点生成一个括号,括号内是其子树的括号序列,其中左儿子(若存在)的括号在前,右儿子(若存在)的括号在后。对于给定的树,请设计高效的算法,将其序列化。给定一个树的根节点指针root,请返回一个字符串,代表其序列化后的括号序列。思路:原创 2016-03-22 22:41:03 · 864 阅读 · 0 评论 -
面试题4:堆栈内存分配
题目:编写C++中的两个类,一个只能在栈中分配空间,一个只能在堆中分配空间。解答:要写出这两个类,首先要了解堆栈分配内存情况,一个经过编译的C/C++占用的内存分为以下几个部分:1.栈区:由编译器自动分配和释放,存放函数的参数值、局部变量的值等,甚至函数的调用过程都是用栈来完成的。其操作方式类似于数据结构中的栈。2.堆区:一般由程序员手动申请及释放,若程序员不释放,程序结束时可原创 2015-12-11 18:30:11 · 1685 阅读 · 0 评论 -
面试题12:二进制中1的个数
题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。思路:可以将数与0或,然后将该数右移,不断进行下去,知道变为0。但是注意如果是负数,最后不管怎么移动,最高位补的都是1,进入死循环。于是可以考虑将数与1与,然后将1左移1位,再进行与,直到这个数变为0。时间复杂度:整数32位的话需要循环32次。#include #include #include #原创 2015-12-15 15:25:46 · 356 阅读 · 0 评论 -
面试题73:矩阵中的路径
题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。思路:用回溯来做。#include #include #include #include #include //堆算法#include原创 2016-03-31 17:05:42 · 420 阅读 · 0 评论 -
面试题72:滑动窗口的最大值
题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。思路:方法一:暴力法窗口大小为K,则每次找到一个窗口最大值的时间复杂度为O(K),总时间复杂度:O(NK)方法二:仔细观察,发现窗口滑动其实就是队列先移出一个元素,再添加一个元素,我们可不可以在这个过程中用O(1)的时间来找到队列里最大的那个元素?我们用两个栈实现过O(1)时间找出栈中最小的元素:面试题2原创 2016-03-31 10:52:23 · 2615 阅读 · 0 评论 -
面试题2:实现单例模式(offer)
题目:设计一个类,我们只能生成该类的一个实例。解答:单例模式的类有以下几个特征:1.构造函数是private。2.有一个唯一实例的静态指针,且是private。3.有一个public接口函数,获得该唯一实例的指针。按照上面的特征实现的单例类如下:class Singleton{public: static Singleton* getInstance();原创 2015-12-11 15:42:50 · 481 阅读 · 0 评论 -
面试题57:正则表达式匹配*
题目:请实现一个函数用来匹配包含'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"及"ab*a"不匹配。思路:原创 2016-01-14 16:34:06 · 620 阅读 · 0 评论 -
面试题62:表示数值的字符串
题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串“+100”、“5e2”、“-123”、“3.1416”及“-1E-16”都表示数值,但"12e"、“1a3.14”、“1.2.3”、“+-5”及“12e+5.4”都不是。思路:表示数值的字符串遵循如下模式:[sign]integral-digits[.[fractional-digits]][e原创 2016-03-30 14:42:42 · 294 阅读 · 0 评论 -
面试题63:字符流中第一个不重复的字符
题目:请实现一个函数用来找出字符流中第一个只出现一次的字符。思路:由于是字符流,也就是只能遍历该字符串一次。可以用hash表来做。键值为字符的ascii码,值为该字符在字符流中的位置。有一点处理技巧:hash表初始值为-1,如果出现多次,则将值改为-2。最后扫描hash表,找出只出现一次,且位置最小的那个字符。代码略。原创 2016-03-30 15:06:33 · 345 阅读 · 0 评论 -
面试题65:二叉树的下一个结点
题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针外,还有一个指向父结点的指针。思路:如果该结点有右子树,则下一个结点就是右子孩子。如果该结点没有右子树:如果该结点是其父节点的左子结点,则下一个结点就是其父结点。如果该结点是其父结点的右子结点,则向上递归,直到父结点是左子结点,则该父结点的父结点就是下一个结点原创 2016-03-30 16:36:38 · 332 阅读 · 0 评论 -
面试题66:对称的二叉树
题目:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和他的镜像一样,那么它是对称的。思路:可以用递归来进行判断。首先判断根结点的左右子结点left,right的值是否相等,是则进行下一步。判断left->left和right->right是否相等,left->right和right->left是否相等,若相等,则表明left和right是对称的,进行下一步。原创 2016-03-30 17:09:32 · 347 阅读 · 0 评论 -
面试题67:把二叉树打印成多行
题目:从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印一行。思路:其实还是按层遍历,用队列可以实现。关键是如何每一层打印一行。可以重新定义一个结构:struct Com{ Node *node; int level; Com(Node *_node, int _level) :node(_node), level(_level){}};每次往队列取出原创 2016-03-30 18:45:31 · 354 阅读 · 0 评论 -
面试题68:按之字形顺序打印二叉树
题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。思路:可以用两个队列来实现,当一个队列为空时,换行,所以不需要额外存储层数。#include #include #include using namespace std;struct Node{ in原创 2016-03-30 19:59:34 · 265 阅读 · 0 评论 -
面试题69:序列化二叉树
题目:请实现两个函数,分别用来序列化和反序列化二叉树。思路:序列化是指将一个二叉树保存到文件中,反序列化是指从文件中读取二叉树结点值重构二叉树。我们采用先序遍历将二叉树的值保存到文件中,为了保证重构二叉树时结点能被插到正确的位置,我们将NULL结点也存下来,用'#'表示。#include #include #include using namespace原创 2016-03-30 20:44:13 · 240 阅读 · 0 评论 -
面试题71:数据流中的中位数
解法一:先存数组,再排序(效率很低)解法二:先存数组,再冒泡排序排一半(效率同样很低)解法三:(推荐)先存数组,利用partition函数原理,如果partition返回的index刚好是数组长度的一半,那么这个index对应的数就是中位数啦。时间复杂度:O(n)#includeusing namespace std;int Partition(int *ar原创 2016-03-31 10:24:40 · 378 阅读 · 0 评论 -
面试题60:递归生成格雷码
格雷码:任意相邻的代码只有一位二进制位不同。每个二进制数为n位,每个二进制数相比,都只有一位二进制码不相同;比如n=1,{0,1};n=2,{00,01,11,10};n=3,{000,001,011,010,110,111,101,100}思路:以n=3的情况为例000001011010110111101100在实现的时候,我们可以在上原创 2016-03-25 12:17:34 · 672 阅读 · 0 评论 -
面试题75:八皇后问题
题目:在8*8的国际象棋上摆放8个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一斜线上。请问总共有多少种符合条件的摆法?思路://八皇后问题的实现#include #include using namespace std;//QueenChess类声明class QueenChess{public: QueenChess(); //构造函数原创 2016-04-07 12:07:20 · 405 阅读 · 0 评论 -
两个字符串的最大公共子序列和最大公共子串
1.最大公共子序列例如:BDCABA和ABCBDAB的最大公共子序列是BCBA。找两个递增下标序列和,使得str1[i1]=str2[j1],str1[i2]=str2[j2],...,str1[ik]=str2[jk]。用动态规划来求解:DP[i][j]来表示str1的前i个元素与str2的前j个元素能够组成的最大子序列的长度。str1=BDCABAstr2=ABCBDA原创 2016-03-14 19:57:49 · 615 阅读 · 0 评论 -
面试题52:不能被继承的类
题目:用C++设计一个不能被继承的类。思路一:把构造函数设为私有函数子类的构造函数会自动调用父类的构造函数,子类的析构函数也会自动调用父类的析构函数。#include #include using namespace std;class SealedClass1{public: static SealedClass1* GetInstance() { retur原创 2016-01-13 20:42:02 · 255 阅读 · 0 评论 -
面试题85:按指定精度打印开方后的结果
题目:如何求根号2的值,并且按照我的需要列出指定小数位。思路:牛顿迭代法求根号,setprecision 函数控制输出精度。#include #include #include #include #include #include #include #include using namespace std;double my_sqrt(double原创 2016-04-14 19:54:00 · 732 阅读 · 0 评论 -
面试题77:前缀、中缀、后缀表达式的相互转换
题目:写个函数,一个根据中缀表达式写出后缀缀表达式#include #include #include using namespace std;bool IsOperator(char c){ const char ops[] = "+-*/"; for (int i = 0; i < sizeof(ops); i++) { if (c == ops[i]) retur原创 2016-04-11 19:17:51 · 1311 阅读 · 0 评论 -
面试题87:玛瑙项链
题目:有一串玛瑙项链,项链上面有N个玛瑙珠子,这些玛瑙有M(M思路:由于项链是一个环,因此,需要将环编程链。我们可以用数组来表示一个环,其中每个元素都是0-8,表示9中不同颜色。用vs[9]数组来表示每种颜色出现的次数。下面举例:colur[]={0 0 0 1 1 2 3 4};假设K=5,那么[0,4]这个区间里vs数组的值为[3,2],[1,5]这个区间里vs数组原创 2016-04-16 18:37:14 · 583 阅读 · 0 评论 -
面试题89:字符串数组首尾字符相同
题目:输入一个字符串数组,如果该字符串数组能够调整顺序后使得前面的字符串的尾字符和后面一个字符串的首字符相同,则返回1,如果不能,则返回0。对第一个字符串没有任何限定。原创 2016-04-19 19:23:31 · 2938 阅读 · 1 评论 -
面试题90:旋转数组
题目:有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于500,图像元素小于等于256。测试样例:[[1,2,3],[4,5,6],[7,8,9]],3返回:[[7,4,1],[8,5,2]原创 2016-06-02 09:01:25 · 610 阅读 · 0 评论 -
面试题91:清除矩阵0所在行列
题目:请编写一个算法,若MxN矩阵中某个元素为0,则将其所在的行与列清零。给定一个MxN的int[][]矩阵(C++中为vector)mat和矩阵的阶数n,请返回完成操作后的int[][]矩阵(C++中为vector),保证n小于等于300,矩阵中的元素为int范围内。思路:定义两个bool类型的数组,分别表示矩阵的行或列是否出现0。第一步:扫描整个矩阵,如果检测到原创 2016-06-02 09:55:04 · 880 阅读 · 0 评论 -
面试题92:两个链表集合做差
题目:已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。思路:遍历链表A一次,遍历链表B多次。时间复杂度:O(n1*n2)实现如下:struct node{原创 2016-06-08 15:34:22 · 928 阅读 · 0 评论 -
面试题93:二叉树的存储和还原
bool Binary_Tree::Save(string filename) { ofstream fout(filename.c_str()); if (fout.fail()) return false; fout<<size<<endl; if (root) Save(root,1,fout); fout.close(); return true;原创 2016-07-30 10:54:08 · 557 阅读 · 0 评论 -
面试题50:求1+2+...+n
题目:求1+2+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路:或许你想到了n(n+1)/2,可是不能用乘除法啊,坑~然后你想到了递归,可是不能用if终止递归,坑~思路一:用构造函数求解不能循环n次,但是我们可以创建n个实例,这样相同的代码就会被执行n次。#include原创 2016-01-13 18:10:02 · 829 阅读 · 0 评论 -
面试题47:n个骰子的点数
题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印s所有可能的值出现的概率。思路:一共有6^n种情况,点数的范围为n----6*n,只需统计出每个点数出现的次数,即可求出所有的概率。首先分析第一个骰子可能的点数和为1到6,用数组pos1存储,当有两个骰子时,点数和为K的次数肯定为上一次点数和为K-1,K-2,...,K-6出现次数的总和。将本次计算结果保存到po原创 2016-01-13 15:39:39 · 577 阅读 · 0 评论 -
面试题84:结点和最大的子树
题目:给一个二叉树,每个结点都是正或负整数,如何找到一个子树,它所有的结点和最大?思路:可以用后序遍历,用一个变量来存储每个结点左右子树加上自己的最大值,用另一个变量来存储该最大值对应的结点。#include #include #include using namespace std;struct Node{ int val; Node *left; Node *r原创 2016-04-14 09:46:26 · 392 阅读 · 0 评论 -
将long整型转为二进制和16进制,存于字符串中
1.将Long整型转为二进制#include#include #include #include using namespace std;char *get2String(unsigned long num){ char *buff = new char[33]; long temp; for (int i = 0; i < 32; i++) { temp = nu原创 2016-03-14 20:33:37 · 6501 阅读 · 0 评论 -
面试题76:单链表的归并排序
时间复杂度:O(nlgn)//八皇后问题的实现#include #include using namespace std;/*MergeSort(headRef)1) If head is NULL or there is only one element in the Linked Listthen return.2) Else divide the linked list原创 2016-04-07 15:34:02 · 510 阅读 · 0 评论 -
最长回文子串
str="abcdddddddddcf",则最长回文子串为"cdddddddddc"。方法一:先将字符串反转,得到str2,再寻找str1与str2的最大公共子串。最大公共子串参考: 两个字符串的最大公共子序列和最大公共子串方法二:用动态规划做,DP[i][j]表示str[i...j]形成的最长回文子串的长度。原创 2016-03-15 12:29:00 · 326 阅读 · 0 评论 -
面试题77:二维数组递减路径
给定一个二维数组,从左下方元素开始,找出最长一条递减路径,路径只能往右方和上方移动。例如:1 3 25 4 67 9 8则最长路径为:7->5->4->3->2思路:回溯思想。#include #include #include using namespace std;void FindPathCore(int row,int col,vec原创 2016-04-12 20:58:46 · 812 阅读 · 0 评论 -
面试题79:抽奖算法实现
题目:一个商场进行一场抽奖活动,其中有两个奖项,第一个奖项A抽中的概率是1/6,第二个奖项B抽中的概率是5/6;编码实现这个抽奖程序。思路:这题考察队随机函数的应用。由于rand()函数产生的随机数的范围是0-65535,那么将该随机数对6求余,得到的数在0-5之间,且每个数出现概率相等。#include #include #include #include #incl原创 2016-04-13 15:12:27 · 2359 阅读 · 0 评论 -
面试题80:海量数据等概论抽样(蓄水池问题)
题目:从N个元素中随机抽取K个元素,N的个数不确定,要求保证每个数字被抽中的概率相等。解读:这种应用的场景一般是数据流的情况下,由于数据只能被读取一次,而且数据量很大,并不能全部保存,因此数据量N是无法在抽样开始时确定的;但又要保证概率相等。解决:解决方案就是蓄水池抽样。主要思想就是保持一个集合(这个集合最终的数字就是被抽中的数字)。依次遍历所有数据的时候以一定的概率替换掉这个原创 2016-04-13 18:29:49 · 2002 阅读 · 0 评论