经典面试题
Couragefff
沉迷于code无法自拔而日渐消瘦
展开
-
字符串类算法题---回文串、同构字符串、回文数、计数二进制子串
1.最长回文串力扣传送门 /* * 计算一组字符集合可以组成的回文字符串的最大长度 * */ public int longestPalindrome(String s) { if (s == null || s.length() == 0) return 0; int sMap[] = new int[128]; ...原创 2020-04-06 11:28:39 · 377 阅读 · 1 评论 -
数组、矩阵类算法题
一.移动零力扣传送门给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。 /* * 把数组中的 0 移到末尾 * */ public void moveZeroes(int[]...原创 2020-04-04 15:02:44 · 1159 阅读 · 0 评论 -
二分法---打开新思路
一.寻找重复数力扣传送门题目:给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。示例 1:输入: [1,3,4,2,2]输出: 2示例 2:输入: [3,1,3,4,2]输出: 3说明:不能更改原数组(假设数组是只读的)。只能使用额外的 O(1) 的空间。...原创 2020-04-04 10:14:42 · 293 阅读 · 0 评论 -
阿里笔试2020.3.23 第一题
当时没有做出来,现在写一写思路。题目:现有n个人,要从这n个人中选任意数量的人组成一只队伍,再在这些人中选出一名队长,求不同的方案对10^9+7取模的结果。如果两个方案选取的人的集合不同或选出的队长不同,则认为这两个方案是不同的。分析:因为选择过程与顺序无关,从n个不同元素中取出m个元素的组合数为c(n,m)。则总的方案数为1 * C(n,1)+2 * C(n,2)+3 * C(n,3)...原创 2020-04-02 11:59:52 · 1242 阅读 · 0 评论 -
拓扑排序类题目
1.课程安排的合法性力扣传送门题目:你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?示例 1:输入: 2, [[1,0]]输出: true解释: 总共有...原创 2020-03-30 19:00:55 · 398 阅读 · 0 评论 -
记阿里笔试2020.3.23惨痛经历
一共两个题。笔试时先通读了两个题的题目。因为第二题有思路觉得简单就先写的第二题。结果20分钟写完代码,挑了30分钟bug,都没搞出来,最后坑在±号上。根据记忆上题目:给你一个迷宫,包括一个起点‘S’和一个终点‘E’,‘#’表示障碍,不可到达的位置,‘.'表示可以到达的位置,另外你可以跳跃,跳跃的规则是从一个点跳到他中心对称的那个点上,最多跳跃5次,求从起点到达终点的最短路径长度。我清楚的记得,题...原创 2020-03-29 19:58:35 · 1000 阅读 · 0 评论 -
搜索---回溯
Backtracking(回溯)属于 DFS。普通 DFS 主要用在 可达性问题 ,这种问题只需要执行到特点的位置然后返回即可。而 Backtracking 主要用于求解 排列组合 问题,例如有 { ‘a’,‘b’,‘c’ } 三个字符,求解所有由这三个字符排列得到的字符串,这种问题在执行到特定的位置返回之后还会继续执行求解过程。因为 Backtracking 不是立即返回,而要继续求解,因...原创 2019-11-15 10:25:07 · 255 阅读 · 0 评论 -
搜索---深度优先搜索
深度优先搜索在得到一个新节点时立即对新节点进行遍历从一个节点出发,使用 DFS 对一个图进行遍历时,能够遍历到的节点都是从初始节点可达的,DFS 常用来求解这种 可达性 问题。在程序实现 DFS 时需要考虑以下问题:栈:用栈来保存当前节点信息,当遍历新节点返回时能够继续遍历当前节点。可以使用递归栈。标记:和 BFS 一样同样需要对已经遍历过的节点进行标记。1. 查找最大的连通面积/*...原创 2019-11-15 10:10:05 · 140 阅读 · 0 评论 -
搜索---广度优先
广度优先搜索一层一层地进行遍历,每层遍历都以上一层遍历的结果作为起点,遍历一个距离能访问到的所有节点。需要注意的是,遍历过的节点不能再次被遍历。每一层遍历的节点都与根节点距离相同。设 di 表示第 i 个节点与根节点的距离,推导出一个结论:对于先遍历的节点 i 与后遍历的节点 j,有 di <= dj。利用这个结论,可以求解最短路径等 最优解 问题:第一次遍历到目的节点,其所经过的路径为最...原创 2019-11-15 09:55:12 · 177 阅读 · 0 评论 -
动态规划---字符串编辑问题
1.编辑距离 /* * 最小编辑代价 * */ public int minCost(String str1,String str2,int ic,int dc,int rc){ if(str1==null||str2==null) return 0; char s1[]=str1.toCharArray(); char...原创 2019-11-14 16:32:05 · 266 阅读 · 0 评论 -
动态规划---股票交易问题总结
1.股票交易—需要冷却期 /* * 题目:需要冷却期的股票交易 * 题目描述:交易之后需要有一天的冷却时间。 * */ public int maxProfit(int[] prices) {//方案一 if(prices==null||prices.length==0||prices.length==1) return 0; ...原创 2019-11-14 15:55:20 · 343 阅读 · 0 评论 -
动态规划---序列问题(最长公共,最长递增,最长公共递增,最长数对,最长摆动)
1.最长递增子序列 /* * 最长递增子序列 * */ public int lengthOfLIS(int[] nums) {//方案一:时间复杂度0(N^2) int n = nums.length; if (n == 0) return 0; int dp[] = new int[n];//dp[i]表示以i元素...原创 2019-10-22 10:29:17 · 257 阅读 · 0 评论 -
动态规划---背包问题总结
背包问题:有一个容量为 N 的背包,要用这个背包装下物品的价值最大,这些物品有两个属性:体积 w 和价值 v。定义一个二维数组 dp 存储最大价值,其中 dp[i][j] 表示前 i 件物品体积不超过 j 的情况下能达到的最大价值。设第 i 件物品体积为 w,价值为 v,根据第 i 件物品是否添加到背包中,可以分两种情况讨论:第 i 件物品没添加到背包,总体积不超过 j 的前 i 件物品的最...原创 2019-10-20 23:20:13 · 365 阅读 · 0 评论 -
美团点评2018春招后台开发方向编程题 - java题解
第一题:字符串距离题目: 给出两个相同长度的由字符 a 和 b 构成的字符串,定义它们的距离为对应位置不同的字符的数量。如串”aab”与串”aba”的距离为 2;串”ba”与串”aa”的距离为 1;串”baa”和串”baa”的距离为 0。下面给出两个字符串 S 与 T,其中 S 的长度不小于 T 的长度。我们用|S|代表 S 的长度,|T|代表 T 的长度,那么在 S 中一共有|S|原创 2018-03-23 18:13:25 · 916 阅读 · 0 评论 -
约瑟夫环
题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数….这样下去….直到剩下...原创 2018-03-23 12:06:44 · 240 阅读 · 0 评论 -
JAVA面试积累2
一个算法应该具有以下五个重要的特征: 一个算法应该具有以下五个重要的特征: 1、有穷性(Finiteness) 算法的有穷性是指算法必须能在执行有限个步骤之后终止 2、确切性(Definiteness) 算法的每一步骤必须有确切的定义; 3、输入项(Input) 一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件; 4、输出项(O原创 2017-07-24 11:35:07 · 637 阅读 · 0 评论 -
常见字符编码简介:ASCII、Unicode、UTF-8、哈夫曼编码
什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。比如两个字节可以表示的最大整数是65535,4个字节可以表示的最...转载 2018-03-17 17:13:51 · 2655 阅读 · 0 评论 -
第一个只出现一次的字符
题目描述 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置 第一种方法:利用hashmap能有存键值对的特点,当遍历到当前字符时候,保存该字符的数量。 public int FirstNotRepeatingChar(String str) { HashMap<Character,Integer&g...原创 2018-03-17 16:52:40 · 254 阅读 · 0 评论 -
排序类算法阶段性总结
1.快速排序 /* * 快速排序 * 不稳定:在一个待排序队列中,A和B相等,且A排在B的前面,而排序之后,A排在了B的后面.这个时候,我们说这种算法是不稳定的. * */ public void fastSort(int a[], int start, int end) { if (start >= end) return; ...原创 2019-10-08 23:00:15 · 222 阅读 · 0 评论 -
根据前序遍历和中序遍历重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。class TreeNode { int val; TreeNode left; TreeNode right; T原创 2018-01-28 15:58:16 · 315 阅读 · 0 评论 -
大量数据处理问题
找到大数据中的前100个大的数据集1. 根据快速排序划分的思想 (1)递归对所有数据分成[a,b)b(b,d]两个区间,(b,d]区间内的数都是大于[a,b)区间内的数 (2)对(b,d]重复(1)操作,直到最右边的区间个数小于100个。注意[a,b)区间不用划分 (3) 返回上一个区间,并返回此区间的数字数目。接着方法仍然是对上一区间的左边进行划分,分为[a2,b2)b2(b2,...原创 2018-05-21 21:35:46 · 1742 阅读 · 0 评论 -
链表中是否有环?如果有找到入口结点
1.简单思路做法 首先从头节点开始,依次遍历单链表的每一个节点。每遍历到一个新节点curNode,就从头节点重新遍历新节点之前的所有节点,看是否有与curNode相同的结点。 时间复杂度O(n*n);空间复杂度O(1) 2.用HashSet存储。 建立泛型为结点类型的HashSet,用来存储曾经遍历过的结点。如果新存入的结点发现hashSet中已存在该节点。则说明链表中有环。 时间复杂度...原创 2018-05-23 18:05:58 · 311 阅读 · 0 评论 -
洗牌算法
洗牌算法怎样才够乱? 一副扑克54张牌,有54!种排列方式。你所给出的洗牌算法,应该能够等概率地生成这54!种结果中的一种。 一般方法: 1.利用一个List 2.每次从数组中,随机找到一个数;若该数没有被选择过,那么就将它放入List中;如果被选择过,就重新随机 3.时间复杂度O(n*n) 优化洗牌算法:...原创 2018-05-23 21:01:09 · 497 阅读 · 0 评论 -
连续子序列的最大和
求连续子数组的最大和解法一:三层循环,时间复杂度为(o(n^3))思路:思路简单,做法暴力。确定一个首元素,一个尾元素,将这两个元素中间的值都加起来,计算每一个子序列的和,取最大的那个值。 public static int maxSubSum1(int a[]) { int max = Integer.MIN_VALUE; for (int i = 0; i ...原创 2019-09-03 17:40:16 · 528 阅读 · 0 评论 -
枚举、二分问题总结
枚举算法设计步骤:1.确定枚举对象2.逐一列举可能解3.逐一验证可能解例题:数组配对—枚举题目描述给你一个长度为n的数组和一个正整数k,问从数组中任选两个数使其和是k的倍数,有多少种选法对于数组a1=1 , a2=2 , a3=2而言:(a1,a2)和(a2,a1)被认为是同一种选法;(a1,a2)和(a1,a3)被认为是不同的选法。输入数据第一行有两个正整数n,k。n<...原创 2019-09-20 12:11:01 · 1749 阅读 · 2 评论 -
贪心算法--常见问题总结
什么是贪心算法?贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。贪婪算法所得到的结果往往不是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。贪心解决问题的基本思路?1.建立数学模型来描述问题2.把求解的问题分成若干个子问题3.对每一子问题求解,得到子问题的局部最优解4.把子...原创 2019-10-02 13:26:16 · 2244 阅读 · 0 评论 -
递归、分治
最接近点对题目描述:在二维空间内找到两个距离最近的点思路:选取一垂直线l: x = m来作为分割直线,其中m为S中各点x坐标的中位数。将S分割为S1和S2。递归地在S1和S2上找出其最小距离d1和d2,并设d = min{d1, d2},S中的最接近点对是d,或者是某个{p, q},其中p∈S1且q∈S2。候选点 p 和 q 到直线l 的距离不能超过d,则只需考虑区间P1和P2的范...原创 2019-10-09 23:16:41 · 247 阅读 · 0 评论 -
数组中的最长连续序列---dp实现
给定一个无序数组arr,返回其中最长的连续序列的长度。 package com.lyf.dp;import java.util.HashMap;import java.util.Map;/** * Created by fangjiejie on 2017/5/13. */public class MaxContinuousSequence { public static in原创 2017-05-13 17:04:41 · 784 阅读 · 0 评论 -
二叉树
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就 是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历 中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。一.前序遍历 前序转载 2018-01-27 16:22:39 · 334 阅读 · 0 评论 -
从尾到头打印链表
题目描述 输入一个链表,从尾到头打印链表每个节点的值。import java.util.ArrayList;class ListNode1 { int val; ListNode1 next = null; ListNode1(int val) { this.val = val; } }public cl原创 2018-01-27 16:17:33 · 231 阅读 · 0 评论 -
去掉字符串中连续出现k个0的子串
package com.lyf.String;import org.junit.Test;/** * Created by fangjiejie on 2017/5/19. */public class RemoveZeroStr { public String doRemove(String str,int k){ if(str==null||k<=0){原创 2017-05-19 20:15:12 · 929 阅读 · 0 评论 -
矩阵的最短路径和
题目: 给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后到达右下角的为止,路径上所有的数字累加起来就是路径和,返回所有路径中的最小的路径和。 举例: 1 3 5 9 8 1 3 4 5 0 6 1 8 8 4 0 路径1,3,1,0,6,1,0是所有路径中路径和最小的,所以返回12. 代码:package com.lyf.dp;import org.junit.Test;原创 2017-05-17 14:40:26 · 2434 阅读 · 0 评论 -
删除链表的中间节点
package com.lyf.linkList;import org.junit.Test;/** * Created by fangjiejie on 2017/5/17. */public class RemoveMidNode<T> { public class Node<T>{ T value; Node<T> next; pub原创 2017-05-17 07:37:37 · 529 阅读 · 0 评论 -
不用额外变量交换两个整数的值
package com.lyf.bitOperation;/** * Created by fangjiejie on 2017/5/13. */public class SwitchNumber { public static void main(String[] args) { //第一种:位运算 int a,b; a=10;原创 2017-05-13 19:32:17 · 520 阅读 · 0 评论 -
对字符串中的数字子串求和
package com.lyf.String;/** * Created by fangjiejie on 2017/5/13. */public class NumberSum { public static int getSum(String str){ if(str==null){ return 0; } i原创 2017-05-13 19:23:59 · 1722 阅读 · 4 评论 -
判断两个字符串是否互为变形词
package com.lyf.String;/** * Created by fangjiejie on 2017/5/13. */public class IsDeformation { public static void main(String[] args) { System.out.println(judge("absd","asbd"));原创 2017-05-13 17:52:26 · 711 阅读 · 0 评论 -
Dijkstra双栈算术表达式求值算法
概述: 算术表达式可能是一个数、或者是由一个左括号、一个算术表达式、一个运算符、另一个算术表达式和一个右括号组成的表达式。为了简化问题,这里定义的是未省略括号的算术表达式,它明确地说明了所有运算符的操作数,形式如下: (1+((2+3)*(4*5))) 思路: 表达式由括号、运算符和操作数构成,我们根据以下4中情况从左至右逐个将这些实体送入栈处理: 1.将操作数压入操作数栈; 2.将原创 2017-04-10 21:41:52 · 1409 阅读 · 0 评论 -
dp---跳跃游戏
package com.lyf.dp;/** * Created by fangjiejie on 2017/4/15. */public class SkipGame { public static void main(String[] args) { } public int jump(int a[]){ int jump=0;//代表到达当前位置跳跃原创 2017-04-15 21:45:33 · 407 阅读 · 0 评论 -
用Java解决约瑟夫环问题
package com.lyf.linkList;/** * Created by fangjiejie on 2017/4/19. */public class Josephus<T> { int n;//共有n个人 int m;//数到m淘汰 Node head=null; Node tail=null; class Node<T>{原创 2017-04-19 19:45:42 · 882 阅读 · 0 评论 -
关于java线程的经典面试题。主线程子线程交替执行n次
子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程循环100次,如此循环50次package com.lyf.practice;/** * Created by fangjiejie on 2017/4/24. */public class ThreadTest2 { private class Business{ boolean f原创 2017-04-24 16:29:27 · 1070 阅读 · 0 评论