![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
面试
bh_xiaoxinba
这个作者很懒,什么都没留下…
展开
-
字符串系列---word search
题目 已知:一个二维字符矩阵,一个单词; 输出:该单词是否可以从二维矩阵中拼接出来?拼接规则:从矩阵的某一行的某个字母开始,持续向临近的字符扩展(向上,向下,向左,向右),直至拼接出该单词。若可以拼出,则输出false,若拼不出,则输出false; 例如: 【A,B,C,D,E E,F,G,H,U A,B,S,D,F 】 单词为ABCGH,输出true; 单词为FG原创 2016-10-14 14:19:36 · 299 阅读 · 0 评论 -
微软面试100题系列---二叉树的遍历递归和非递归实现
题目用递归和非递归两种方法实现二叉树的遍历实现前序遍历递归实现void preorderRecursive(Node root{ if(node==null){ return; } visit(root); preorderRecursive(root.left); preorderRecursive(root.right);}非递归实现借助原创 2016-09-05 02:31:50 · 319 阅读 · 0 评论 -
微软面试100题系列---最大二维子矩阵和
题目求一个矩阵中最大的二维矩阵(元素和最大);实现方法1思路:遍历每个二维矩阵,记录最大的和;时间复杂度o(mn); 代码: public static void Max2DMatrix(int[][] A,int row,int col){ int maxSum=0; int sum=0; int res_i=0,res_j=0;原创 2016-09-04 22:15:36 · 276 阅读 · 0 评论 -
动态规划问题系列---Unique Paths II
题目给定一个m行n列矩阵,其中0表示空闲,1表示障碍物,求从0,0到m-1,n-1中的可通路径数目;(0表示可通)分析动态规划 设dp[i][j]表示从i,j到m-1,n-1的路径个数; 则转移方程:if(a[i][j]==0) dp[i][j]=dp[i+1][j]+dp[i][j+1]else dp[i][j]=0初始化if(a[m-1][n-1]==0) dp[m-1原创 2016-09-16 22:07:16 · 222 阅读 · 0 评论 -
动态规划问题系列---Minimum Path Sum(路线上元素和的最小值)
题目Minimum Path Sum(路线上元素和的最小值); 给定一个m行n列的矩阵,从左上角到右下角所有可能的路径中,求经过的元素和最小值。分析动态规划 dp[i][j]表示从i,j的位置到右下角的位置的所有可能路径中,经过的元素和的最小值; 则状态转移方程:dp[i][j]=min{dp[i+1][j],dp[i][j+1]}+a[i][j];初始化:dp[m-1][n-1]=a[m-1原创 2016-09-16 21:45:17 · 541 阅读 · 0 评论 -
动态规划问题系列---word break问题
题目 给定一个字符串和一个字典,在字符串中添加空格来构造一个句子,使句子中的每个单词在字典中都存在; 输入 :字符串 输出:所有可能的句子例如: s=”catsanddog” dict=[“cat”,”cats”,”and’,”sand”,”dog”] 输出:cats and dog和cat sand dog分析 将字符串分割成2部分s1和s2,如果s1包含在字典中,则递归计算s2;然转载 2016-09-12 01:40:10 · 388 阅读 · 0 评论 -
微软面试100题系列---交换元素使2个序列的差值最小
题目有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。实现思路: 当前数组a和数组b的和之差为 A = sum(a) - sum(b) a的第i个元素和b的第j个元素交换后,a和b的和之差为 A’ = sum(a) - a[i] + b[j] - (sum(b) - b[j原创 2016-09-04 06:55:06 · 566 阅读 · 0 评论 -
微软面试100题---求出从1到n的正数中1出现的次数
题目输入一个整数n,求从1到n这n个整数的十进制表示中1出现从次数。 例如输入12,从1到12这12个数中包含1的数字:1,10,11,12;1总共出现了5次;实现思路:求出一个数中1的个数,可以使用除法、取余;求1到n的n个数,循环==此方法n较大时,费时; 高效方法:分别求出每位出现1的次数,再将每位出现1 的次数相加;分析: 假设数字为abcde;我们分析百位出现1的次数: 1)当c=原创 2016-09-04 04:34:55 · 199 阅读 · 0 评论 -
微软面试100题---给定一个序列,判断是否为栈的一个pop序列
题目 给定2个序列,一个为push序列,判断另一个序列有没有可能为对应的pop序列; 比如,push序列–1,2,3,4,5;则4,5,3,2,1可能是一个pop序列;实现 思路: 创建一个栈;将push序列依次入栈,直到栈顶元素等于pop序列的第一个元素;将栈顶元素出栈,pop序列移动到第二个元素;如果栈顶元素继续等于pop序列,则继续出栈,pop后移动;如果push全部入完栈,且原创 2016-09-04 04:01:52 · 384 阅读 · 0 评论 -
微软面试100题系列---二叉树的深度
实现int TreeDepth(Node root){ if(root==null){ return 0; } int nleft=TreeDepth(root.left); int nright=TreeDepth(root.right); return (nleft>nright)?:(nleft+1):(nright+1);}原创 2016-09-05 02:41:10 · 243 阅读 · 0 评论 -
微软面试100题系列---字符串的排列
题目输入一个字符串,打印出该字符串中字符的所有排列; 如输入”abc”,则由a,b,c组成的所有排列: abc,acb,bac,bca,cab,cba实现思路:这是一个递归问题;依次从字符串中取出一个字符作为第一个字符,对剩余字符组成的字符串生成全排列,最后结果为取出的字符和剩余字符全排列的组合; 代码:void permutation(String str,int begin,int end原创 2016-09-05 03:03:05 · 265 阅读 · 0 评论 -
字符串系列---longest-substring-without-repeating-characters
题目 Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for “abcabcbb” is “abc”, which the length is 3. F原创 2016-11-21 02:20:34 · 503 阅读 · 0 评论 -
二叉树序列---根据后序和中序系列或前序和中序序列构造二叉树
1、根据前序遍历序列和中序遍历序列,构造二叉树(或求后序遍历序列);public Node buildTree(int[] preOrder,int[] inOrder){ Node root=buildTree(preOrder,0,preOrder.length-1,inOrder,0,inOrder.length-1); return root; }原创 2016-11-02 15:13:44 · 621 阅读 · 0 评论 -
数据结构和算法数组系列---求数组的笛卡尔积
题目 有n个数组,每个数组中的元素个数不同,求这n个数组的所有排序组合。 比如,有3个数组,A(a1,a2,a3),B(b1,b2),C(c1,c2);则笛卡尔积为:a1b1c1,a1b1c2,a1b2c1,….思路 设置一个数组count[n],对应n个数组,count[i]表示取第i个数组的第count]i]个元素;初始化count均为0,遍历每个数组,对于第i个数组,从该数组中取出第co原创 2016-10-11 22:22:24 · 3125 阅读 · 0 评论 -
算法---求数组的所有集合
第一种情况题目给出的数组中没有重复元素,求所有的集合,并且每个集合递增;分析递推 每个集合,每个元素加入或不加入实现/* * 求数组的所有子集合 * 1)数组中没有重复元素 * 对于每个元素,是否加入 * 递归 * 从[]开始,遍历每个元素; * 对于每个元素,加入后递归 * 移除,判断下一个元素 *原创 2016-09-19 00:16:16 · 445 阅读 · 0 评论 -
动态规划问题系统---climbing-stairs
题目给定n个台阶,每次走1个或2个台阶;总共有多少种走法?分析动态规划 dp[i]表示i个台阶的走法 dp[i]=dp[i-1]+dp[i-2]dp[0]=0; dp[1]=1; dp[2]=2;实现public static int climbStairs(int n){ if(n==0){ return 0; } i原创 2016-09-18 01:59:12 · 206 阅读 · 0 评论 -
动态规划问题系统---edit-distance
题目给定2个字符串,str1,str2,求这两个字符串的最小Edit Distance; Edit Distance:用于衡量两个strings之间的相似性。 两个strings之间的Minimum edit distance是指把其中一个string通过编辑(包括插入,删除,替换操作)转换为另一个string的最小操作数。分析那么如何找到两个strings的minimun edit dista原创 2016-09-18 01:10:55 · 285 阅读 · 0 评论 -
数组---求数组组成的集合的所有子集
题目给定一个数组,求数组的所有子集,要求每个子集中的元素是升序的; 如:[1,2,3] 则: [] [1] [2] [3] [1,2] [1,3] [2,3] [1,2,3]解法1递归,利用二叉树思想; 第0层为空集;第i层表示将数组第i个元素是否加入到集合中,左子树表示加入,右子树表示不加入; 最后,每个叶子表示一个子集;如下所示:原创 2016-09-18 00:01:54 · 2446 阅读 · 0 评论 -
微软面试100题系列---调整数组顺序,使奇数位于偶数之前
题目调整数组顺序,使奇数位于偶数之前;实现设置2个指针,一个从前向后寻找偶数,一个从后向前寻找奇数,然后交换; 代码:int i=0,j=a.length-1; while(i<j){ while((a[i]&1)==1 && i<j){ i++; } if(i>a.length原创 2016-09-05 03:25:03 · 306 阅读 · 0 评论 -
微软面试100题---左旋字符串
题目定义字符串的左旋操作:将字符串前面的若干个字符移动到字符串的尾部;如”abcde“左旋2位–》”cdeab“实现方法1思路:ab–>ba cde–>edc baedc–>cdeab 分3部分反转 代码: public static void leftStr_1(StringBuilder str,int k){原创 2016-09-04 02:57:13 · 235 阅读 · 0 评论 -
微软面试100题---在字符串中找到连续最长的数字串
实现 public static int continumax(String str){ int len=0; int maxLen=0; int end=0; str=str+'a'; for(int i=0;i<str.length();i++){ if( str.charAt(i)>='0原创 2016-09-04 01:14:08 · 204 阅读 · 0 评论 -
微软面试100题---单链表就地反转
题目 单链表就地反转; 就地反转,即不能创建新的节点;实现 思路:反转一个链表,需要调整链表指针; 反转的过程: i,m,n 3个连续的节点,此时i之前的指针已经调整好了,当前的节点为m,pre=i,在调整m的指针之前,需要先记录下m的下一个指针n,然后再调整;代码实现: public static Node_24 ReverseLink(Node_24 head){原创 2016-09-04 00:26:56 · 508 阅读 · 0 评论 -
微软面试100题系列---在二叉树中找出和为某一定值的所有路径
题目 输入一个整数和一棵二叉树;从树的根节点开始往下访问一直到叶节点,所经过的所有节点形成一条路径。打印出和输入整数相等的所有路径。原创 2016-09-02 05:39:30 · 553 阅读 · 0 评论 -
微软面试100题系列---求子数组的最大和
题目输入一个整形数组,数组中有正数也有负数;数组中连续的一个或多个数组成一个子数组,每个子数组有一个和,求出所有子数组和中的最大值; 要求:时间复杂度为o(n);原创 2016-09-02 04:49:44 · 281 阅读 · 0 评论 -
微软面试100题系列---设计包含min函数的栈
题目:设计包含min函数的栈 定义一个栈结构,要求添加一个min函数,得到栈的最小元素; 要求:min函数,push函数,pop函数的时间复杂度为o(1)实现方法1思路:除了题目中要求的栈之外,再创建一个栈(最小栈),用来记录最小值,每当在原栈中push元素时,与最小栈的栈顶元素比较,如果push的值小,则push到最小栈中;否则,将最小栈的栈顶元素再次push到最小栈中; 实原创 2016-09-02 03:56:59 · 308 阅读 · 0 评论 -
微软面试100题系列---把二叉查找树转换成排序的双向链表
题目:把二叉查找树转换成排序的双向链表输入:一个二叉查找树输出:排序的双向链表;要求:不能创建任何新的节点,只能调整指针的方向;实现:对二叉查找树进行中序遍历,对遍历的当前节点加入到链表末尾即可;加入链表的head和tail,当前的节点curr:curr->next=null;curr->pre=tail;tail->next=curr;tail=curr;实现代码:public class Nu原创 2016-09-02 02:26:17 · 282 阅读 · 0 评论 -
动态规划问题系列---扔玻璃珠
题目 某幢大楼有100层。你手里有两颗一模一样的玻璃珠。当你拿着玻璃珠在某一层往下扔的时候,一定会有两个结果,玻璃珠碎了或者没碎。这幢大楼有个临界楼层。低于它的楼层,往下扔玻璃珠,玻璃珠不会碎,等于或高于它的楼层,扔下玻璃珠,玻璃珠一定会碎。玻璃珠碎了就不能再扔。现在让你设计一种方式,使得在该方式下,最坏的情况扔的次数比其他任何方式最坏的次数都少。也就是设计一种最有效的方式。分析 1)最笨的办法原创 2016-09-11 21:36:57 · 2488 阅读 · 0 评论 -
旅行商问题(TSP问题)
题目 TSP问题(旅行商问题)是指旅行家要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的路程最短。 假设现在有四个城市,0,1,2,3,他们之间的代价如图一,可以存成二维表的形式 现在要从城市0出发,最后又回到0,期间1,2,3都必须并且只能经过一次,使代价最小。分析 TSP问题是NP完全问题;原创 2016-09-09 21:54:07 · 27046 阅读 · 1 评论 -
动态规划问题系列---Disk Schedule
题目有很多从磁盘读取数据的需求,包括顺序读取、随机读取。为了提高效率,需要人为安排磁盘读取。然而,在现实中,这种做法很复杂。我们考虑一个相对简单的场景。 磁盘有许多轨道,每个轨道有许多扇区,用于存储数据。当我们想在特定扇区来读取数据时,磁头需要跳转到特定的轨道、具体扇区进行读取操作。为了简单,我们假设磁头可以在某个轨道顺时针或逆时针匀速旋转,旋转一周的时间是360个单位时间。磁头也可以随意移动到某原创 2016-09-09 17:05:22 · 351 阅读 · 0 评论 -
动态规划问题系列---连续子数组(二维)的最大和
题目1一维数组的连续子数组的最大和 输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间负责度为O(n)。分析假如输入数组为{1,-2,3,10,-4,7,2,-5},我们尝试从头到尾累加其中的正数,初始化和为0,第一步加上1,此时和为1,第二步加上-2,此时和为-1,第三步加上3,此时我们发现-1+3=2,最大和2反而比3一个单独的原创 2016-09-09 00:30:06 · 634 阅读 · 0 评论 -
微软面试100题系列---判断两个链表是否相交
题目给出2个单向链表h1和h2,判断这两个链表是否相交; 假设2个链表都不带环。实现思路:如果两个链表相交,则他们一定有着相同的尾节点,所以分别求出2个链表的尾节点,判断尾节点是否相同;代码实现:boolean isIntersect(Node h1,Node h2){ if(h1==null || h2==null) return false; Node tail_1=h1;原创 2016-09-02 12:11:09 · 271 阅读 · 0 评论 -
微软面试100题系列---判断整数序列是否为二叉查找树的后序遍历
题目判断整数序列是否为二叉查找树的后序遍历;实现思路:<递归>后序遍历结果的最后一个元素是根;跟元素的左子树全部小于根;根元素的右子树全部大于根;==》先得到根;从前遍历得到左右子树的分界点,判断分界点后的元素是否都大于根;再递归判断左右子树; public class Num9 { public static void main(String[] args) {原创 2016-09-02 12:58:32 · 315 阅读 · 0 评论 -
微软面试100题---寻找和为定值的多个数
题目 输入两个整数n 和m,从数列1,2,3…….n 中随意取几个数,使其和等于m ,要求将其中所有的可能组合列出来。实现 思路:0/1背包问题,考虑是否取第n个数的策略,可以转化为一个只和前n-1个数相关的问题:1)如果取第n个数,那么问题就转化为“取前n-1个数使得它们的和为sum-n”,对应的代码语句就是sumOfkNumber(sum - n, n - 1);2)如果不取第n个数,原创 2016-09-03 23:45:02 · 228 阅读 · 0 评论 -
微软面试100题---字符串转换成整数
思路: 从左到右扫描字符串中的每个字符,把之前扫描得到的数字*10+当前字符表示的数字; 细节: - 判断字符串中是否有空格; - 字符串第一个字符是否为符号位; - 输入的字符不能不是数字; - 输入的字符太长,可能转换成整数后,会导致整数溢出;溢出问题: 一般来说,当发生溢出后取最大/最小int型值,即大于正整数能表示的范围时返回MAX_IN原创 2016-09-03 23:01:19 · 261 阅读 · 0 评论 -
微软面试100题系列---约瑟夫环问题
题目 n个数字形成1个圈,数字从0开始。每次从这个圈中删除第m个数字(当前数字为第1个数字),求出这个圈中剩下的最后一个数字;实现 方法1 单循环链表 思路:将n个节点形成一个不带头节点的单循环链表,设置一个计数器count(初始化为1)统计第几个数字;如果count=m,则删除当前节点,count=1,当前节点前移;否则继续向前遍历,count++; 代码实现:public class原创 2016-09-03 21:00:07 · 241 阅读 · 0 评论 -
微软面试100题目系列---找出字符串中第一个只出现一次的字符
实现方法1从头开始扫描字符串中的每个字符,当访问到某个字符时,将这个字符和后面的每个字符比较,如果没有发现重复的,则该字符为第一个出现一次的字符;方法2第一次遍历统计出每个字符出现的次数,第二次查看那个字符的次数为1;String str;int[] counts=new int[256];counts[str[i]]++;原创 2016-09-02 20:46:59 · 203 阅读 · 0 评论 -
微软面试100题系列---二叉树的层次遍历
利用队列实现;将根节点放入队列中;每次从队列中取出一个节点,打印,然后将该节点的左右子节点加入到队列中;代码实现 public static void LayerTranverse(BSTreeNode_2 root){ if(root==null){ return; } Queue<BSTreeNode_2> queue原创 2016-09-02 20:35:08 · 339 阅读 · 0 评论 -
微软面试100题系列---二叉查找树的反转
题目输入一个二叉查找树,将该树转换成它的镜像,即转换后的二叉查找树中,左子树的节点都大于右子树的节点;实现方法1思路:递归。对于当前节点,交换左右孩子,然后递归求解左右子树即可;代码: public static void Mirror_1(BSTreeNode_2 root){ if(root==null){ return ; }原创 2016-09-02 20:18:41 · 279 阅读 · 0 评论 -
微软面试100题系列---求1+2+3+...+n
题目 求1+2+…+n; 要求:不能使用乘除法、for、while、if、else、switch、case 等关键字以及条件判断语句;实现 分析 直接使用公式:1+2+…+n=n*(n+1)/2 循环 递归 f(n)=f(n-1)+n;f(1)=1;什么是否递归结束?需要使用if判断;方法1 递归,使用&&性质结束递归int add(int n){ int sum=0; n原创 2016-09-02 18:20:20 · 265 阅读 · 0 评论 -
微软面试100题系列---求二叉树中节点的最大距离
题目如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义”距离”为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离; 实现分析计算一个二叉树的最大距离有两个情况:情况A: 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点。情况B: 路径不穿过根节点,而是左子树或右子树的最大距离路径,取其大者。只需要计算这两个情况的路径距离,并取其大者,就原创 2016-09-02 16:30:03 · 301 阅读 · 0 评论