
剑指office(Java版)
了解面试常考算法题
向着远方的人
这个作者很懒,什么都没留下…
展开
-
面试题22:链表中环的入口节点(Java版)
题目:如果一个链表中包含环,那么应该如何找出环的入口节 点?从链表的头节点开始顺着next指针方向进入环的第1个节点为环的入口节点。例如,在如图4.3所示的链表中,环的入口节点是节点 3。题目分析因为要找到环的入口节点,所以首先需要判断链表是否有环,当链表有环时,我们可以使用两个指针(一个快指针和一个慢指针),快指针一次移动两下,慢指针一次移动一下,当两个指针相遇时则表明此时两个指针已经进入到环里了,且设快指针移动了2k步,则慢指针移动了k步,仔细观察可以发现当慢指针再移动k步会回到原地(因.原创 2022-05-13 19:35:15 · 593 阅读 · 0 评论 -
面试题21:删除倒数第k个节点(Java版)
题目:如果给定一个链表,请问如何删除链表中的倒数第k个节 点?假设链表中节点的总数为n,那么1≤k≤n。要求只能遍历链表 一次。例如,输入图4.1(a)中的链表,删除倒数第2个节点之后的链表如图4.1(b)所示。题目分析因为只能遍历链表一次,所以采用双指针法,先让指针p1前移k步,然后再移动指针p2,此时p1和p2同时移动,等p1移动到链表尾部时,p2刚好移动到第倒数n + 1个节点此时只需要把倒数第n + 1个节点的next指向他的next.next(倒数第n - 1个节点)上就删除掉了倒数第.原创 2022-05-08 20:54:13 · 945 阅读 · 0 评论 -
面试题20:回文子字符串的个数(Java版)
题目:给定一个字符串,请问该字符串中有多少个回文连续子 字符串?例如,字符串"abc"有3个回文子字符串,分别 为"a"、“b"和"c”;而字符串"aaa"有6个回文子字符串,分别为"a"、“a”、“a”、“aa”、“aa"和"aaa”。题目分析通过双指针法从中间分别向两边同时移动,因为字符串长度可能为奇数也可能为偶数,为奇数时中心点只有一个,而为偶数时中心点则有两个所以当字符串长度为奇数时两个指针的起点都在哪一个中心点上而为偶数时则分别在两个中心点上。具体实现public int countS.原创 2022-05-08 18:21:18 · 809 阅读 · 0 评论 -
面试题19:最多删除一个字符得到回文(Java版)
题目:给定一个字符串,请判断如果最多从字符串中删除一个 字符能不能得到一个回文字符串。例如,如果输入字符串"abca",由于删除字符’b’或’c’就能得到一个回文字符串,因此输出为 true。题目分析使用两个指针分别位于字符串的头部和尾部并且同时向中间移动,如果遇到两个指针指向的字符不相同则将头指针往中间再移动一下或将尾指针向中间移动一下,只要其中任意一个指针移动后满足条件了的话则说明可以通过删除一个字符得到回文,如果两个指针移到中间的过程中所有的字符都相等则说明这个字符串本来就是一个回文。具体实.原创 2022-05-08 17:16:22 · 775 阅读 · 0 评论 -
面试题18:有效的回文(Java版)
题目:给定一个字符串,请判断它是不是回文。假设只需要考 虑字母和数字字符,并忽略大小写。例如,"Was it a cat I saw?"是一个回文字符串,而"race a car"不是回文字符串。// 通过两个指针在字符串头部和尾部分别同时向中间移动// 每移动一次判断是否为子母和数字,如果是字母和数字// 则将字母同时转化为小写比较(因为忽略字母大小写)// 如果不是字母和数字则对应指针再往中间移动public boolean isPalindrome(String s) { int.原创 2022-05-07 19:02:46 · 340 阅读 · 0 评论 -
面试题17:包含所有字符的最短字符串
题目:输入两个字符串s和t,请找出字符串s中包含字符串t的 所有字符的最短子字符串。例如,输入的字符串s为"ADDBANCAD", 字符串t为"ABC",则字符串s中包含字符’A’、'B’和’C’的最短子字 符串是"BANC"。如果不存在符合条件的子字符串,则返回空字符串""。如果存在多个符合条件的子字符串,则返回任意一个。// 利用哈希表和双指针来解题public String minWindow(String s, String t) { HashMap<Character, In.原创 2022-05-07 11:36:12 · 860 阅读 · 0 评论 -
面试题16:不含重复字符的最长子字符串(Java版)
题目:输入一个字符串,求该字符串中不含重复字符的最长子 字符串的长度。例如,输入字符串"babcca",其最长的不含重复字符的子字符串是"abc",长度为3。// 用两个指针来指向子字符串的最左边和最右边// 通过移动两个指针来找到不包含重复字符的字符串// 当字符串不重复时将右边的指针往右移动增加子字符串的长度// 当子字符串中字符重复时将左边的指针往右移动直到两个指针// 之间的子字符串中无重复字符为止counts长度为128的一个哈希表// 因为ASCII码最多表示128个数,将字符的.原创 2022-05-07 08:33:32 · 642 阅读 · 0 评论 -
面试题15:字符串中的所有变位词
题目:输入字符串s1和s2,如何找出字符串s2的所有变位词在 字符串s1中的起始下标?假设两个字符串中只包含英文小写字母。例如,字符串s1为"cbadabacg",字符串s2为"abc",字符串s2的两个变位词"cba"和"bac"是字符串s1中的子字符串,输出它们在字符 串s1中的起始下标0和5。// 使用哈希表来保存s2字符串中的字符出现的次数// 当s1中子字符串出现同样的字符的时候哈希表对应的字符的值减一// 所以当子字符串是变位词时哈希表中的所有字符的值都为零public List&l.原创 2022-05-06 20:52:00 · 185 阅读 · 0 评论 -
面试题14:字符串中的变位词(Java版)
题目:输入字符串s1和s2,如何判断字符串s2中是否包含字符 串s1的某个变位词?如果字符串s2中包含字符串s1的某个变位词, 则字符串s1至少有一个变位词是字符串s2的子字符串。假设两个字 符串中只包含英文小写字母。例如,字符串s1为"ac",字符串s2为"dgcaf",由于字符串s2中包含字符串s1的变位词"ca",因此输出为true。如果字符串s1为"ab",字符串s2为"dgcaf",则输出为 false。// 使用哈希表来保存s1字符串中的字符出现的次数// 当s2中子字符串出现同样的字符.原创 2022-05-06 12:58:07 · 347 阅读 · 0 评论 -
面试题13:二维子矩阵的数字之和(Java版)
题目:输入一个二维矩阵,如何计算给定左上角坐标和右下角 坐标的子矩阵的数字之和?对于同一个二维矩阵,计算子矩阵的数 字之和的函数可能由于输入不同的坐标而被反复调用多次。例如, 输入图中的二维矩阵,以及左上角坐标为(2,1)和右下角坐标 为(4,3)的子矩阵,该函数输出8。public class NumMatrix { private int[][] sums; public NumMatrix(int[][] matrix) { if (matrix.lengt.原创 2022-05-06 10:10:06 · 1241 阅读 · 0 评论 -
面试题12:左右两边子数组的和相等(Java版)
题目:输入一个整数数组,如果一个数字左边的子数组的数字之和等于右边的子数组的数字之和,那么返回该数字的下标。如果存在多个这样的数字,则返回最左边一个数字的下标。如果不存在这样的数字,则返回-1。例如,在数组[1,7,3,6,2,9]中,下标为3的数字(值为6)的左边3个数字1、7、3的和与右边两个数字2和9的和相等,都是11,因此正确的输出值是3。// 利用右边的数字之和等于总的数字之和减去左边// 的数字之和与分界点的那个数字这个规律来比较两// 边的数是否相同public static in.原创 2022-05-06 10:02:03 · 582 阅读 · 0 评论 -
面试题11:0和1个数相同的子数组(Java版)
题目:输入一个只包含0和1的数组,请问如何求0和1的个数相同的最长连续子数组的长度?例如,在数组[0,1,0]中有两个子数组包含相同个数的0和1,分别是[0,1]和[1,0],它们的长度都是2,因此输出2。// 用-1来代替数组中的0,因为这样的话当0和1的数量相等时,// 连续子数组中的和就恰好为零,因此当m>n,且前m个数和前n个数的和都相同时,// 前m个数减去前n个数则为0,即第n+1个数到第m个数之间的数的和为零0// 即第n+1个数到第m个数这个连续子数组就为0和1数量相同的原创 2022-05-01 23:23:32 · 452 阅读 · 0 评论 -
面试题10:和为k的子数组(Java版)
题目:输入一个整数数组和一个整数k,请问数组中有多少个数字之和等于k的连续子数组?例如,输入数组[1,1,1],k的值为2,有2个连续子数组之和等于2。// 因为求得是一个连续子数组,所以当m大于n时,第前m项的和减去// 第前n项的和等于k则代表n+1到m之间连续的数组的和等于k以此来// 求出和为k的连续数字的个数public static int subArraySum(int[] nums, int k) { Map<Integer, Integer> sumToCo原创 2022-05-01 18:57:36 · 677 阅读 · 0 评论 -
面试题9:乘积小于k的子数组(Java版)
题目:输入一个由正整数组成的数组和一个正整数k,请问数组中有多少个数字乘积小于k的连续子数组?例如,输入数组[10,5,2,6],k的值为100,有8个子数组的所有数字的乘积小于100,它们分别是[10]、[5]、[2]、[6]、[10,5]、[5,2]、[2,6]和[5,2,6]。// 因为是求连续子数组的个数所以可以使用左右指针的移动来确定满足条件的子数组个数public static int numSubarrayProductLessThanK(int[] nums, int k) {原创 2022-05-01 11:08:05 · 755 阅读 · 0 评论 -
面试题8:和大于或等于k的最短子数组(Java版)
题目:输入一个正整数组成的数组和一个正整数k,请问数组中和大于或等于k的连续子数组的最短长度是多少?如果不存在所有数字之和大于或等于k的子数组,则返回0。例如,输入数组[5,1,4,3],k的值为7,和大于或等于7的最短连续子数组是[4,3],因此输出它的长度2。public int minSubArrayLen(int target, int[] nums) { int left = 0; int sum = 0; int minLength = Integer.MAX_原创 2022-05-01 09:49:12 · 882 阅读 · 0 评论 -
面试题7:数组中和为0的3个数字(Java版)
题目:输入一个数组,如何找出数组中所有和为0的3个数字的三元组?需要注意的是,返回值中不得包含重复的三元组。例如,在数组[-1,0,1,2,-1,-4]中有两个三元组的和为0,它们分别是[-1,0,1]和[-1,-1,2]。//首先将数组排序//固定一个固定指针i然后右移指针j和左移指针k// j的初始位置在最开头,k的初始位置在最末尾public List<List<Integer>> threeSum(int[] nums) { List<List&l原创 2022-04-28 10:05:49 · 547 阅读 · 0 评论 -
面试题6:排序数组中的两个数字之和(Java版)
题目:输入一个递增排序的数组和一个值k,请问如何在数组中找出两个和为k的数字并返回它们的下标?假设数组中存在且只存在一对符合条件的数字,同时一个数字不能使用两次。例如,输入数组[1,2,4,6,10],k的值为8,数组中的数字2与6的和为8,它们的下标分别为1与3。//使用双指针,一个指针在前,一个指针在后,// 如果两个指针所指的数之和大于目标值则右指针左移,// 否则左指针右移(因为数组按照升序排列,即右边的数总是比左边的大)public int[] twoSum(int[] numbe原创 2022-04-28 09:06:25 · 282 阅读 · 0 评论 -
面试题5:单词长度的最大乘积(Java版)
题目:输入一个字符串数组words,请计算不包含相同字符的两个字符串words[i]和words[j]的长度乘积的最大值。如果所有字符串都包含至少一个相同字符,那么返回0。假设字符串中只包含英文小写字母。例如,输入的字符串数组words为[“abcw”,“foo”,“bar”,“fxyz”,“abcdef”],数组中的字符串"bar"与"foo"没有相同的字符,它们长度的乘积为9。"abcw"与"fxyz"也没有相同的字符,它们长度的乘积为16,这是该数组不包含相同字符的一对字符串的长度乘积的最大值。//原创 2022-04-27 20:50:39 · 737 阅读 · 0 评论 -
面试题4:只出现一次的数字(Java版)
题目:输入一个整数数组,数组中只有一个数字出现了一次,而其他数字都出现了3次。请找出那个只出现一次的数字。例如,如果输入的数组为[0,1,0,1,0,1,100],则只出现一次的数字是100。// 因为只有一个数出现了一次,其余的数都是出现了3次// 所以出现了三次的数它们的每个二进制位相加一定能够被三整除// 如果哪一个数位不能被三整除,则证明那个出现1次的数在该数位的值为1// 如果能被整除,则证明出现一次的那个那个数该数位为0public static int singleNumber(in原创 2022-04-27 17:53:58 · 1526 阅读 · 0 评论 -
面试题3:前n个数字二进制形式中1的个数(Java版)
题目:输入一个非负数n,请计算0到n之间每个数字的二进制形式中1的个数,并输出一个数组。例如,输入的n为4,由于0、1、2、3、4的二进制形式中1的个数分别为0、1、1、2、1,因此输出数组[0,1,1,2,1]。//方法一通过规律:与比自己小1的数反复求与,每求一次与最右边的1就会减少一个public static int[] countBits(int num) { int[] result = new int[num + 1]; for (int i = 0; i <=原创 2022-04-27 15:21:36 · 274 阅读 · 0 评论 -
面试题2:二进制加法(Java版)
题目:输入两个表示二进制的字符串,请计算它们的和,并以二进制字符串的形式输出。例如,输入的二进制字符串分别是"11"和"10",则输出"101"。 public static String addBinary(String a, String b) { // 创建一个StringBuilder对象来对二进制字符串进行操作 StringBuilder result = new StringBuilder(); // i j 为字符串中字符的索引,因为原创 2022-04-27 10:49:22 · 695 阅读 · 0 评论 -
面试题1:整数除法(Java版)
题目:输入2个int型整数,它们进行除法计算并返回商,要求不得使用乘号’*‘、除号’/‘及求余符号’%'。当发生溢出时,返回最大的整数值。假设除数不为0。例如,输入15和2,输出15/2的结果,即7。/** * 返回整数除法结果 * @param dividend 被除数 * @param divisor 除数 * @return 整数除法结果 */public int divide(int dividend, int divisor) { if (dividend == 0x8原创 2022-04-26 18:57:58 · 452 阅读 · 0 评论