经典算法面试题
Alex-大伟
坚持写下去,终有一天你会成为大牛。
展开
-
[编程题]数组中的逆序对
有一组数,对于其中任意两个数组,若前面一个大于后面一个数字,则这两个数字组成一个逆序对。请设计一个高效的算法,计算给定数组中的逆序对个数。 给定一个int数组A和它的大小n,请返回A中的逆序对个数。保证n小于等于5000。 测试样例: [1,2,3,4,5,6,7,0],8 返回:7package com.mico.alex;import java.util.Scanner;public c原创 2016-12-02 11:44:38 · 1129 阅读 · 0 评论 -
[编程题]表达式组成方案
对于一个只由0(假)、1(真)、&(逻辑与)、|(逻辑或)和^(异或)五种字符组成的逻辑表达式,再给定一个结果值。现在可以对这个没有括号的表达式任意加合法的括号,返回得到能有多少种加括号的方式,可以达到这个结果。 给定一个字符串表达式exp及它的长度len,同时给定结果值ret,请返回方案数。保证表达式长度小于等于300。为了防止溢出,请返回答案Mod 10007的值。 测试样例:“1^0|0|原创 2016-10-08 22:23:50 · 1194 阅读 · 0 评论 -
[编程题]字符串通配
题目描述:对于字符串A,其中绝对不含有字符’.’和’’。再给定字符串B,其中可以含有’.’或’’,’’字符不能是B的首字符,并且任意两个’’字符不相邻。exp中的’.’代表任何一个字符,B中的’’表示’’的前一个字符可以有0个或者多个。请写一个函数,判断A是否能被B匹配。 给定两个字符串A和B,同时给定两个串的长度lena和lenb,请返回一个bool值代表能否匹配。保证两串的长度均小于等于300原创 2016-10-08 20:05:07 · 989 阅读 · 0 评论 -
网易编程题:数列还原
牛牛的作业薄上有一个长度为 n 的排列 A,这个排列包含了从1到n的n个数,但是因为一些原因,其中有一些位置(不超过 10 个)看不清了,但是牛牛记得这个数列顺序对的数量是 k,顺序对是指满足 i < j 且 A[i] < A[j] 的对数,请帮助牛牛计算出,符合这个要求的合法排列的数目。 输入描述:每个输入包含一个测试用例。每个测试用例的第一行包含两个整数 n 和 k(1 <= n <= 10原创 2016-09-18 12:14:25 · 787 阅读 · 0 评论 -
腾讯编程题:构造回文
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。 输入描述:输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.输出描述:对于每组数据,输出一个整数,代表最少需要删除的字符个数。输入例子:abcda google输出例子:2 2解题思路: 1.把字符串反转形成另外一个字符串 2.求原原创 2016-09-05 14:23:56 · 563 阅读 · 0 评论 -
网易笔试题:藏宝图
牛牛拿到了一个藏宝图,顺着藏宝图的指示,牛牛发现了一个藏宝盒,藏宝盒上有一个机关,机关每次会显示两个字符串 s 和 t,根据古老的传说,牛牛需要每次都回答 t 是否是 s 的子序列。注意,子序列不要求在原字符串中是连续的,例如串 abc,它的子序列就有 {空串, a, b, c, ab, ac, bc, abc} 8 种。 输入描述:每个输入包含一个测试用例。每个测试用例包含两行长度不超过 10原创 2016-09-17 16:33:00 · 1464 阅读 · 0 评论 -
网易笔试题:地牢逃脱
给定一个 n 行 m 列的地牢,其中 ‘.’ 表示可以通行的位置,’X’ 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上。地牢的出口可能在任意某个可以通行的位置上。牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢。 输入描述:每个输入包含 1 个测试用原创 2016-09-17 14:28:16 · 1591 阅读 · 0 评论 -
网易笔试题:合唱团
有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗? 输入描述:每个输入包含 1 个测试用例。每个测试数据的第一行包含一个整数 n (1 <= n <= 50),表示学生的个数,接下来的一行,包含 n 个整数,按顺序表示每个学生的能力值 ai(-50原创 2016-09-16 19:41:56 · 1009 阅读 · 1 评论 -
华为OJ之: 计算字符串的距离
题目描述Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance。 Ex: 字符串A:abcdefg 字符串B: abcdef 通过增加或是删掉字符”g”的方式原创 2016-09-03 19:02:55 · 545 阅读 · 0 评论 -
美团笔试:字符编码
请设计一个算法,给一个字符串进行二进制编码,使得编码后字符串的长度最短。输入描述:每组数据一行,为待编码的字符串。保证字符串长度小于等于1000。输出描述:一行输出最短的编码后长度。输入例子:MT-TECH-TEAM输出例子:33解题思路: 1.将字符串转为字符数组,遍历统计每个字符出现的次数,并放入hashmap表中 2.创建节点HuffmanNode,放入一个优先级队列 3.构建哈夫曼树合原创 2016-09-09 10:31:26 · 1215 阅读 · 0 评论 -
美团笔试题:股票交易日
在股市的交易日中,假设最多可进行两次买卖(即买和卖的次数均小于等于2),规则是必须一笔成交后进行另一笔(即买-卖-买-卖的顺序进行)。给出一天中的股票变化序列,请写一个程序计算一天可以获得的最大收益。请采用实践复杂度低的方法实现。 给定价格序列prices及它的长度n,请返回最大收益。保证长度小于等于500。 测试样例:[10,22,5,75,65,80],6返回:87import java.u原创 2016-09-08 22:57:30 · 1101 阅读 · 0 评论 -
百度笔试题:蘑菇阵
现在有两个好友A和B,住在一片长有蘑菇的由n*m个方格组成的草地,A在(1,1),B在(n,m)。现在A想要拜访B,由于她只想去B的家,所以每次她只会走(i,j+1)或(i+1,j)这样的路线,在草地上有k个蘑菇种在格子里(多个蘑菇可能在同一方格),问:A如果每一步随机选择的话(若她在边界上,则只有一种选择),那么她不碰到蘑菇走到B的家的概率是多少?输入描述:第一行N,M,K(1 ≤ N,M ≤ 2原创 2016-09-07 11:10:22 · 1403 阅读 · 0 评论 -
集合的子集
题目描述请编写一个方法,返回某集合的所有非空子集。 给定一个int数组A和数组的大小int n,请返回A的所有非空子集。保证A的元素个数小于等于20,且元素互异。各子集内部从大到小排序,子集之间字典逆序排序,见样例。测试样例:[123,456,789]返回:{[789,456,123],[789,456],[789,123],[789],[456 123],[456],[123]}import j原创 2016-10-10 08:46:35 · 926 阅读 · 0 评论 -
美团笔试题:拜访
题目描述:现在有一个城市销售经理,需要从公司出发,去拜访市内的商家,已知他的位置以及商家的位置,但是由于城市道路交通的原因,他只能在左右中选择一个方向,在上下中选择一个方向,现在问他有多少种方案到达商家地址。 给定一个地图map及它的长宽n和m,其中1代表经理位置,2代表商家位置,-1代表不能经过的地区,0代表可以经过的地区,请返回方案数,保证一定存在合法路径。保证矩阵的长宽都小于等于10。测试样原创 2016-09-08 12:18:05 · 1180 阅读 · 1 评论 -
面试题:数组中出现次数超过一半的数字
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。package alex.suda.jzOffer;import java.util.HashMap;import java.util.Iterator;import java.原创 2016-11-18 13:54:45 · 871 阅读 · 0 评论 -
[编程题]纸牌博弈
题目描述:有一个整型数组A,代表数值不同的纸牌排成一条线。玩家a和玩家b依次拿走每张纸牌,规定玩家a先拿,玩家B后拿,但是每个玩家每次只能拿走最左或最右的纸牌,玩家a和玩家b都绝顶聪明,他们总会采用最优策略。请返回最后获胜者的分数。 给定纸牌序列A及序列的大小n,请返回最后分数较高者得分数(相同则返回任意一个分数)。保证A中的元素均小于等于1000。且A的大小小于等于300。 测试样例:[1,2原创 2016-10-08 17:20:24 · 2388 阅读 · 0 评论 -
[编程题]字符串交错组成
对于三个字符串A,B,C。我们称C由A和B交错组成当且仅当C包含且仅包含A,B中所有字符,且对应的顺序不改变。请编写一个高效算法,判断C串是否由A和B交错组成。 给定三个字符串A,B和C,及他们的长度。请返回一个bool值,代表C是否由A和B交错组成。保证三个串的长度均小于等于100。 测试样例: “ABC”,3,”12C”,3,”A12BCC”,6 返回:truepackage alex.原创 2016-10-06 22:25:11 · 1443 阅读 · 0 评论 -
[编程题]魔法权值
问题描述: 给出 n 个字符串,对于每个 n 个排列 p,按排列给出的顺序(p[0] , p[1] … p[n-1])依次连接这 n 个字符串都能得到一个长度为这些字符串长度之和的字符串。所以按照这个方法一共可以生成 n! 个字符串。 一个字符串的权值等于把这个字符串循环左移 i 次后得到的字符串仍和原字符串全等的数量,i 的取值为 [1 , 字符串长度]。求这些字符串最后生成的 n! 个字符串原创 2016-09-30 22:58:17 · 1899 阅读 · 0 评论 -
[编程题]树上最长单色路径
题目描述: 对于一棵由黑白点组成的二叉树,我们需要找到其中最长的单色简单路径,其中简单路径的定义是从树上的某点开始沿树边走不重复的点到树上的另一点结束而形成的路径,而路径的长度就是经过的点的数量(包括起点和终点)。而这里我们所说的单色路径自然就是只经过一种颜色的点的路径。你需要找到这棵树上最长的单色路径。 给定一棵二叉树的根节点(树的点数小于等于300,请做到O(n)的复杂度),请返回最长单色路原创 2016-09-29 11:26:48 · 994 阅读 · 0 评论 -
网易笔试题:最大的奇约数
小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11. 现在给出一个N,需要求出 f(1) + f(2) + f(3)…….f(N) 例如: N = 7 f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 +原创 2016-09-26 22:06:28 · 2089 阅读 · 0 评论 -
网易笔试题:跳石板
小易来到了一条石板路前,每块石板上从1挨着编号为:1、2、3……. 这条石板路要根据特殊的规则才能前进:对于小易当前所在的编号为K的 石板,小易单次只能往前跳K的一个约数(不含1和K)步,即跳到K+X(X为K的一个非1和本身的约数)的位置。 小易当前处在编号为N的石板,他想跳到编号恰好为M的石板去,小易想知道最少需要跳跃几次可以到达。 例如: N = 4,M = 24: 4->6->8->1原创 2016-09-26 20:57:23 · 3261 阅读 · 1 评论 -
网易笔试题:回文序列
如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如: {1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。 现在给出一个数字序列,允许使用一种转换操作: 选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前原创 2016-09-26 19:56:28 · 5568 阅读 · 0 评论 -
网易笔试题:二叉树
有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离。二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离。 给定二叉树的根节点root,请返回所求距离。思路:分两步 1.找到权值最大的位置和权值最小的位置;2.将它们到最近公共父节点的距离相加就能得到结果。public static int getDis(Tree原创 2016-09-08 19:44:05 · 947 阅读 · 0 评论 -
网易笔试题:比较重量
题目描述:小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量。这些钻石的重量各不相同。在他们们比较了一段时间后,它们看中了两颗钻石g1和g2。现在请你根据之前比较的信息判断这两颗钻石的哪颗更重。 给定两颗钻石的编号g1,g2,编号从1开始,同时给定关系数组vector,其中元素为一些二元组,第一个元素为一次比较中较重的钻石的编号,第二个元素为较轻的钻石的编号。最后给定之前的比较次数n原创 2016-09-08 15:00:10 · 1137 阅读 · 0 评论 -
排序链表
题目描述: Sort a linked list in O(n log n) time using constant space complexity归并排序的一般步骤为: 1)将待排序数组(链表)取中点并一分为二; 2)递归地对左半部分进行归并排序; 3)递归地对右半部分进行归并排序; 4)将两个半部分进行合并(merge),得到结果。所以对应此题目,可以划分为三个小问题: 1)找到链原创 2016-05-22 20:54:52 · 302 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路: BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x (也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,先判断前一段序列的值(左子树)小于x,后一段序列的值(右子树)大于x,再判断这两段(子树)都是合法的后原创 2016-05-09 23:14:17 · 360 阅读 · 0 评论 -
求数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。思路1: 暴力穷举法 思路2: 分治的思想:先求前面一半数组的逆序数,再求后面一半数组的逆序数,然后求前面一半数组比后面一半数组中大的数的个数(也就是逆序数),这三个过程加起来就是整体的逆序数目了。其实也就是归并排序import java.util.Scann原创 2016-05-09 19:46:49 · 442 阅读 · 0 评论 -
把数组排成最小的数
题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。package alex.jzoffer;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;原创 2016-05-13 09:29:44 · 278 阅读 · 0 评论 -
删除链表中重复的结点
题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 public ListNode deleteDuplication(ListNode pHead) { if (pHead == null || pHead.next == null) {原创 2016-05-02 00:49:33 · 714 阅读 · 0 评论 -
层次遍历二叉树
题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印。解题思路;1、利用一个队列来记录二叉树的所有节点,每次访问之后都将该节点的子节点,插入到队列当中; 2、每次取队列的对首元素;并弹出队列;压入list; 3、直到队列为空,将结果返回; public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {原创 2016-05-01 16:32:17 · 410 阅读 · 0 评论 -
找最小的K个数
问题描述: 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。方法1:利用快速排序的思想,每次取得划分元素的位置partitionIndex。该位置代表key值是整个数组的第partitionIndex+1小。将partitionIndex+1与k比较,如果小于k,继续往右划分。如果大于k,继续往左划分,直到partition原创 2016-04-30 18:53:40 · 897 阅读 · 0 评论 -
两个链表的第一个公共结点
题目描述 输入两个链表,找出它们的第一个公共结点。解题思路:如果两个链表有公共节点,那么这两个链表从某一节点开始,它们的next都指向同一个节点,之后它们所有的节点都是重合的,不可能再出现分叉。所以拓扑形状看起来是Y型。 首先遍历两个链表得到它们的长度,比较链表的长度,以及长的链表比短的链表多几个节点。在第二次遍历的时候,先在较长的节点上走若干步,接着同时在两个链表上遍历,找到的第一个相同的节点原创 2016-05-11 20:19:40 · 385 阅读 · 0 评论 -
单链表的翻转
思路:遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。 public ListNode ReverseList(ListNode head) { if(head == null){ return head; } ListNode p1原创 2016-04-29 10:47:49 · 328 阅读 · 0 评论 -
判断一颗二叉树是不是对称的
对称二叉树符合的条件:根节点以及其左右子树左子树的左子树和右子树的右子树相同左子树的右子树和右子树的左子树 boolean isSymmetrical(TreeNode pRoot) { if(pRoot == null){ return true; } return isMirror(pRoot.left原创 2016-04-28 23:46:04 · 928 阅读 · 0 评论 -
用两个栈实现队列
解题思路: 入队时,将元素压入s1。 出队时,将s1的元素逐个“倒入”(弹出并压入)s2,将s2的顶元素弹出作为出队元素,之后再将s2剩下的元素逐个“倒回”s1。import java.util.Stack;public class Solution { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> st原创 2016-04-28 22:56:10 · 462 阅读 · 0 评论 -
根据前序遍历和中序遍历,构造二叉树
思路:前序的第一个字母为树的根节点,然后查看中序序列中这个字母的位置,它之前的为左子树,之后的为右子树,然后分别对这两个子树的前序和中序序列做递归操作。 public TreeNode reConstructBinaryTree(int [] pre,int [] in) { int n = pre.length; TreeNode root = new Tre原创 2016-04-28 22:23:50 · 735 阅读 · 0 评论 -
判断一个点是否在三角形内
问题描述:一个二维坐标系中(100*100,每一维0~99),已知三角形三个顶点的坐标A、B、C,判断坐标系中的任意点:P,是否在三角形内(在三角形边上也认为在三角形内)思路:如果三角形PAB,PAC和PBC的面积之和与三角形ABC的面积相等,即可判定点P在三角形ABC内 public static boolean isInTriangle(POINT A, POINT B, POINT C原创 2016-04-28 17:12:10 · 742 阅读 · 0 评论 -
链表中环的入口结点
题目描述 一个链表中包含环,请找出该链表的环的入口结点。解题思路:设置两个指针,开始都指向链表头,然后其中一个指针每次向前走一步,另一个指针每次向前走两步,如果快的遇到NULL了,证明该链表中没有环,如果有环,快的指针每次都要比慢的多走一步,最终两个指针会相遇。而相遇点p到入口点的距离=头指针到入口点的距离,因此,分别从相遇点、头指针开始走,相遇的那个位置就是环的入口结点。public ListN原创 2016-05-13 13:58:06 · 1059 阅读 · 0 评论 -
丑数
题目描述: 把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路: 1)初始化三个队列,和存放结果的min变量 2)将1先插入队列1中 3 ) 令x为三个队列中的最小值 4)若x存在于: 队列1:将 x * 2、x * 3、x*5 分别放入三个队列,从原创 2016-05-14 13:38:43 · 373 阅读 · 0 评论 -
二叉树中和为某一值的路径
题目描述:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) { ArrayList<ArrayList<Integer>> allPaths原创 2016-05-03 22:05:58 · 601 阅读 · 0 评论