DataStructure&Algorithm
zengzhen_csdn
这个作者很懒,什么都没留下…
展开
-
京东2017校园招聘编程题--幸运数
题目: 4和7是两个幸运数字,我们定义,十进制表示中,每一位只有4和7两个数的正整数都是幸运数字。前几个幸运数字是:4,7,44,47,74,77,444,447…输入: 数字k输出: 第k个幸运数样例输入: 3 5 100 10000000 样例输出: 74 744747 44774447447477474444447思路: 使用完全二叉树的思想,假设根节点为第原创 2016-09-06 15:07:13 · 1808 阅读 · 0 评论 -
华为OJ——合唱队
题目: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形。合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1, 2, …, K,他们的身高分别为T1, T2, …, TK,则他们的身高满足T1 < T2 < … < Ti , Ti > Ti+1 > … > TK (1 <= i <= K) 。 你的任务是,已知所有N位同学的身高,计算最原创 2016-03-25 11:28:36 · 571 阅读 · 0 评论 -
括号字符串匹配
题目: 判断一个括号字符串是否匹配正确,假设括号有多种。如(([]))正确,[[(()错误。代码:#include<iostream>#include<string>#include<stack>using namespace std;bool IsMatch(string str){ int i=0; stack<char> stk; bool flag=true;原创 2016-03-23 09:52:48 · 473 阅读 · 0 评论 -
《剑指offer》——数组中重复的数字
题目: 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。根据题目中的信息,数组长度为n,所有数字都在0到n-1之间,可以利用现有数组设置标志,当一个数字被访问过后,可以设置对应位上的原创 2016-03-09 19:18:21 · 841 阅读 · 0 评论 -
《剑指offer》——构建乘积数组
题目: 给定一个数组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]。不能使用除法。由题目可知,B[i]即为A中除A[i]以外剩下元素的乘积。可以构建两个辅助数组forward和backward,forward用于存储A中前i-1个元素的乘积,back用于存储A中倒数i个(n-i个)元素的乘积,然后再原创 2016-03-10 19:51:01 · 348 阅读 · 0 评论 -
《剑指offer》——正则表达式匹配
题目: 请实现一个函数用来匹配包括’.’和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配。思路: 假设字符串为str,模式串为pattern,考虑以下情况:A. 模式串下一个字符为*原创 2016-03-11 19:29:51 · 456 阅读 · 0 评论 -
《剑指offer》——字符流中第一个不重复的字符
题目: 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。思路: 首先应当明确,字符流是指像流水一样的字符,一去不复返,意味着只能访问一次。 使用数组来标记各个字符对应的状态-1:表示出现0次-2:表示出现1次以上0~n:表示出原创 2016-03-12 17:32:37 · 626 阅读 · 0 评论 -
《剑指offer》——删除链表中重复的结点
题目: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。思路: 因为重复结点不保留且有可能从头结点开始重复,所以应当新建一个结点位于头结点的之前,从新建的结点开始遍历。因为要将重复的结点全部删除,所以要设置一个结点pNode指向当前结点,然后再一个结点preNode指向当原创 2016-03-15 19:31:20 · 515 阅读 · 0 评论 -
《剑指offer》——二叉树的下一个结点
题目: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路: 分析二叉树的下一个节点,一共有以下情况: 1.二叉树为空,则返回空; 2.节点右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指向左子结点的指针找到的叶子节点即为下一个节点; 3.节点不是根节点。如果该节点是其父节点的左孩子,则返原创 2016-03-16 19:51:24 · 444 阅读 · 0 评论 -
《剑指offer》——左移字符串
题目:把字符串前面n个字符串转移到字符串的尾部。如“abcdefg”左移2位后变为“cdefgab”。以“abcdefg”左移2位后变为“cdefgab”为例,可以先把字符串分为两部分,前面2个字符”ab”为一部分,内部进行反转,得到”ba”;再把剩余部分字符进行反转,得到”gfedc”;最终将整个字符串进行反转,得到”cdefgab”。代码如下,/*字符串反转*/string ReverseSt原创 2016-02-24 20:06:48 · 404 阅读 · 0 评论 -
《剑指offer》——和为s的连续整数序列
题目:输入一个正整数s,打印出所有和为s的连续正数序列(至少含有两个数)。可以考虑用两个数small和big分别表示序列的最小值和最大值。首先把small初始化为1,big初始化为2。如果从small到big的序列和大于s,可以从序列中去掉最小值,将small的值增大;如果从small到big的序列和小于s,可以将big值增大,让序列包含新的值。因为序列至少有两个数字,所以small的值增加到(s+原创 2016-02-24 10:28:31 · 913 阅读 · 0 评论 -
《剑指offer》——数组中的逆序对
以数组{7,5,4,6}为例, 1. 将数组中的每个元素看作是一个子数组,一边将子数组排序(升序)后合并,一边统计逆序对。 2. 对合并后的子数组重复第一步。 其中,统计逆序对的方法如下,: 总结, 参考归并排序的代码可以得到如下代码:/*合并子数组,并统计逆序对的个数*/int merge(vector<int> &data, int lo, int mi, int hi,原创 2016-01-20 20:16:33 · 378 阅读 · 0 评论 -
《剑指offer》——任意两个整数相加(乘)
#includeusing namespace std;//正整数相加char *plus(char *a,char *b){ int len_a = strlen(a); int len_b = strlen(b); int len_sum; if(len_a < len_b) len_sum = len_b; else原创 2015-12-25 15:47:53 · 742 阅读 · 0 评论 -
《剑指offer》——二叉树中和为某一值的路径
题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始向下一直到叶子结点所经过的所有结点形成一条路径。 struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val原创 2016-01-08 12:03:50 · 363 阅读 · 0 评论 -
《剑指offer》——二维数组中的查找
在行列递增的二维数组中查找数字7的方法如图所示, 根据上图步骤编写代码如下,int Find(int *matrix, //待查数组 int row,//行数 int col,//列数 int num)//待查数字{ int i = col - 1; int j = 0; while(j < row && i >=原创 2015-12-11 19:49:22 · 256 阅读 · 0 评论 -
《剑指offer》——二叉搜索树的后序遍历序列
二叉搜索树: 它或者是一棵空树,或者是具有下列性质的二叉树。若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 总结,如果数组中判定属于二叉搜索树右子树的部分中有大于其根节点的元素,则该序列一定不是该二叉搜索树的后序遍历序列。bool VerifySquenceOfBST(vect原创 2016-01-07 12:13:49 · 351 阅读 · 0 评论 -
《编程之美》——最大公约数问题
问题: 求两个正整数的最大公约数,假设两个正整数都很大。分析与解法: 【解法一】 x与y的最大公约数与x对y的余数的最大公约数是相同的,即f(x, y) = f(y, y%x),可以把原问题转化为求两个更小数的最大公约数,直到其中一个数为0。代码:int gcd(int x, int y){ if(y == 0) return x; else原创 2015-11-23 12:25:44 · 487 阅读 · 0 评论 -
逆波兰表达式计算
题目: Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are+,-,*,/. Each operand may be an integer or another expression. Some examples: [“2”, “1”, “+”, “3”原创 2016-05-10 11:10:03 · 577 阅读 · 0 评论 -
《编程之美》——二叉搜索树转换为排序双向链表
题目: 输入一棵二叉搜索树,将该二叉搜索树转换为一个排序的双向链表。要求不能创建任何新的节点,只能调整树中指针的指向。分析与解法: 1、由于要求链表是有序的,可以借助二叉树中序遍历,因为中序遍历算法的特点就是从小到大访问结点。当遍历访问到根结点时,假设根结点的左侧已经处理好,只需将根结点与上次访问的最近结点(左子树中最大值结点)的指针连接好即可。进而更新当前链表的最后一个结点指针。 2、由原创 2016-04-20 10:26:42 · 4403 阅读 · 2 评论 -
网易校园招聘2017编程题--回文数问题
import java.util.Scanner;public class Test{ public static int count(int[] nums){ int lo = 0; int hi = nums.length - 1; int count = 0; while(lo <= hi){ if原创 2016-09-12 21:58:05 · 926 阅读 · 0 评论 -
采苹果问题
题目: 平面上有N*M个格子,每个格子中放着一定数量的苹果。你从左上角的格子开始, 每一步只能向下走或是向右走,每次走到一个格子上就把格子里的苹果收集起来, 这样下去,你最多能收集到多少个苹果。思路: 解这个问题与解其它的DP问题几乎没有什么两样。第一步找到问题的“状态”, 第二步找到“状态转移方程”,然后基本上问题就解决了。首先,我们要找到这 个问题中的“状态”是什么?我们必须注意到的一点是,原创 2016-08-31 20:50:06 · 659 阅读 · 0 评论 -
美团点评2017校园招聘编程题--取红包
题目: 圆桌上放了一圈红包形成环形,每个红包金额不同,围绕圆桌走一圈选择若干红包,规则是不能拿相邻的红包,请问拿到红包最多的总金额是多少?输入: 红包个数N N行数组表示N个红包输出: 最多的总金额样例输入: 2 1,2 1,3,4样例输出: 2 4代码: import java.util.Scanner;public class Test{ private stati原创 2016-09-11 20:28:08 · 1598 阅读 · 0 评论 -
《编程之美》——快速寻找符合条件的两个数
题目: 快速找出一个数组中的两个数字,使两个数字之和为一个特定的值。假设数组中至少存在一组符合要求的解。分析与解法: 【解法一】 穷举,从数组中任意选取两个数字,计算两个数字之和是否等于给定的数字。时间复杂度为O(n^2)。【解法二】 对数组中的每个数arr[i]都判定sum-arr[i]是否在数组中,于是题目就变成了一个查找算法。可以先对数组进行排序,再使用二分法进行查找,总的时间复杂度为原创 2015-11-25 12:15:26 · 903 阅读 · 0 评论 -
《编程之美》——求二叉树中节点的最大距离
问题: 如果把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义”距离”为两个节点之间的个数。 写一个程序求一棵二叉树中相距最远的两个节点之间的距离。 如下图所示,粗箭头的边表示最长距离: 分析与解法: 把所有节点的左子树的深度和右子树的深度都计算出来,这样每个节点的最大长度也就是左子树的深度加上右子树的深度。遍历所有的节点,找到最大长度。时间复杂度为O(n)。代码如下:typ原创 2015-11-12 15:47:56 · 556 阅读 · 0 评论 -
求最长公共子序列
问题: 求两字符序列的最长公共字符子序列。 (这里注意子序列和子串的区别,子序列可以是从原字符串中取出一部分元素重新拼接而成的字符串,但取出的元素之间的前后关系要与原字符串一致;而子串则必须是连续的。如”adf”是”abcdef”的子序列,而不是子串。)分析与解法: 设序列X={x0,x1,…,xm-1}和Y={y0,y1,…,yn-1}的最长公共子序列为Z={z0,z1,…,zk-1} ,则原创 2015-11-06 12:37:50 · 502 阅读 · 0 评论 -
质因数分解和N以内的质数
/*质因数分解*/List<Integer> decPrime(int n) { List<Integer> list = new ArrayList<Integer>(); for (int i=2;i <= n;i++){ while(n != i){ if(n%i == 0){原创 2016-08-13 16:38:27 · 467 阅读 · 0 评论 -
寻找Coder
题目: 请设计一个高效算法,再给定的字符串数组中,找到包含”Coder”的字符串(不区分大小写),并将其作为一个新的数组返回。结果字符串的顺序按照”Coder”出现的次数递减排列,若两个串中”Coder”出现的次数相同,则保持他们在原数组中的位置关系。给定一个字符串数组A和它的大小n,请返回结果数组。保证原数组大小小于等于300,其中每个串的长度小于等于200。同时保证一定存在包含coder的字符原创 2016-08-28 18:10:56 · 539 阅读 · 0 评论 -
蛇形数组
import java.util.Scanner;public class Test{ static void snakeMatrix(int row, int col){ int x,y;//维度 int[][] numberMatric = new int[row][col]; int num = numberMatric[x = 0][y原创 2016-08-17 17:07:29 · 420 阅读 · 0 评论 -
二叉树最低公共父节点
如果给定pRoot是NULL,即空树,则返回的公共节点自然就是NULL; 如果给定pRoot与两个节点中任何一个相同,说明,pRoot在就是所要找的两个节点之一,则直接返回pRoot,表明在当前链路中找到至少一个节点; 如果给定pRoot不是两个节点中任何一个,则说明,需要在pRoot的左右子树中重新查找,此时有三种情况:两个节点都在左子树上;两个节点都在右子树上;一个在左子树,一个在右子树上;原创 2016-08-28 14:56:49 · 1105 阅读 · 0 评论 -
Java字符串反转
/*递归1*/String reverse1(String s){ int len = s.length(); if(len <= 1 || s == null)//注意递归结束条件 return s; String left = s.substring(0, length / 2); String right = s.substring(leng原创 2016-04-12 19:38:40 · 345 阅读 · 0 评论 -
二叉树迭代遍历
struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} };/*前序*/vector<int> preorderTraversal(TreeNode *root) { vector原创 2016-05-11 19:40:55 · 372 阅读 · 0 评论 -
二叉树镜像(交换左右子树)
//非递归public void mirror(TreeNode root){ Stack<TreeNode> stack = new Stack<>(); if(root == null) return; stack.push(root); while(!stack.isEmpty()) { TreeNode node = stack.p原创 2016-05-14 11:46:22 · 713 阅读 · 0 评论 -
链表实现归并(快速、插入)排序
归并排序思路: 1)将待排序数组(链表)取中点并一分为二; 2)递归地对左半部分进行归并排序; 3)递归地对右半部分进行归并排序; 4)将两个半部分进行合并(merge),得到结果。代码编写分为以下三步: 1)找到链表中点 (快慢指针思路,快指针一次走两步,慢指针一次走一步,快指针在链表末尾时,慢指针恰好在链表中点); 2)写出merge函数,即如何合并链表; 3)写出mergeso原创 2016-05-10 19:13:51 · 796 阅读 · 0 评论 -
《剑指offer》——打印1到最大的n位数
#includeusing namespace std;bool inc(char *num){ //累加结束标志,初始为false //只有当下标为0的位置上产生进位时,才能表明打印结束 bool flag = false; int len = strlen(num); int c = 0;//进位标志 for(int i = len -原创 2015-12-22 20:16:34 · 346 阅读 · 0 评论 -
《剑指offer》——数值的整数次方
不考虑大数问题,double Power(double base, int exponent) { //如果底数为0,且幂方为负数 //注意浮点型判定相等不能直接使用== if(base - 0.0 > -0.0000001 && base - 0.0 < 0.0000001 && exponent < 0) return 0;原创 2015-12-22 20:14:48 · 341 阅读 · 0 评论 -
《剑指offer》——数组中只出现一次的数字
题目:一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。要求找出这两个 数字,且时间复杂度为O(n),空间复杂度为O(1)。如果题目中数组中只出现一次的数字只有一个,那么可以依次将数组中的每个数字进行异或操作,那么其他出现偶数次的数字会因为自身与自身的异或而被消除,则最终的结果为那个只出现一次的数字。当只出现一次的数字为两个时,最终的结果是这两个数字异或之后的结果。因为这两个数字不相等,那原创 2016-01-23 19:24:49 · 1148 阅读 · 0 评论 -
《编程之美》——不要被阶乘吓倒
问题:给定一个整数N,求N!末尾的0的个数。求N!的二进制表示中最低位1的位置。分析与解法:—— 问题1 【解法一】 计算因式分解中5的指数,再求和。代码:int zeroNum(int N){ int num = 0; for(int i = 0; i <= N; i++) { int j = i; while(j % 5 ==原创 2015-11-19 11:21:49 · 401 阅读 · 0 评论 -
《编程之美》——寻找发帖“水王”
问题: 论坛中“水王”发帖的数目超过了帖子总数的一半,如果有当前论坛所有帖子的列表,求“水王”的ID。分析与解法: 一般的想法是根据ID对列表排序,若编号从0开始第N/2个ID即为“水王”的ID。这种方法的时间复杂度即为排序的时间复杂度,选用较好的排序算法平均时间复杂度为O(nlogn)。 避免排序,时间复杂为O(N)的解法是,每次从列表中删除两个不同的ID(不管是否包括“水王”的ID),这并原创 2015-11-19 18:03:31 · 1153 阅读 · 0 评论 -
《剑指offer》——字符串转换为整数
#include<iostream>using namespace std;int strToInt(const char* str){ int num = 0; int t = 1; while(*str != 0)//字符串结束 { if(*str < '0' || *str > '9')//若元素不是数字字符 {原创 2015-12-09 16:39:43 · 401 阅读 · 0 评论 -
《编程之美》——电话号码对应英语单词
问题: 电话的号码盘一般可以用于输入字母,如用2可以输入a,b,c,用3可以输入d,e,f等。 对于号码5869872,可以依次输出其代表的所有字母组合。如:jtmwtpa,jtmwtpb……… 1、您能否可以根据这样的对应关系设计一个程序,尽可能快地从这些字母组合中找到一个有意义的单词来描述一个电话号码呢?如:可以用单词“computer”来描述号码26678837。分析与解法: 对于问题原创 2015-11-02 10:22:44 · 2872 阅读 · 0 评论