编程面试题17 Mar 2025 | 58 分钟阅读 仅仅了解 Java 的理论知识是不够的,无法通过面试。对于想成为 Java 开发人员的人来说,最重要的环节之一是编程环节,在此环节中,面试官会要求应聘者进行编码。编写优化代码是成为 Java 开发人员的必备条件。在本教程中,我们将讨论一些高级编程面试题。 1) 给定一个大小为 s 的整数数组 arr。现在,检查是否存在至少一个元素,该元素严格小于其右侧的所有元素,并且大于其左侧的所有元素。如果存在,则返回 true;否则,返回 false。忽略给定数组的边界元素。示例:1 arr[] = {3, 4, 5, 1, 6, 10, 9, 7, 8}; s = 9 答案: true 解释: 6 之前的所有数字都小于 6,而 6 之后的所有元素都大于 6。因此,答案是 true。 示例:2 arr[] = {4, 5, 1}; s = 3 答案: false 解释: 没有一个数字符合给定的条件。因此,答案是 false。 文件名: PeakElement.java 输出 The array [10, 2, 3, 4, 5, 4, 3, 2, 3, 10] has not got a peak element. The array [3, 4, 5, 1, 6, 10, 9, 7, 8] has got a peak element. 2) 给定一个只读数组 arr,大小为 s,使得数组中的每个元素都不超过 s。此外,在数组中,除了 a1 以外,每个元素都只出现一次,a1 出现了两次,因此 a2 丢失了。找出 a1 和 a2 的值。注意,只读意味着不允许修改输入数组。示例:1 arr[] = {1, 3, 5, 2, 3}; s = 5 答案: a1 = 3, a2 = 4 解释: 重复的数字是 3,丢失的数字是 4。 示例:2 arr[] = {1, 2, 1}; s = 3 答案: a1 = 1, a2 = 3 解释: 重复的数字是 1,丢失的数字是 3。 文件名: MissingAndRepeatingElement.java 输出 For array: [1, 3, 5, 4, 1] a1 is: 1 a2 is: 2 For array: [1, 3, 5, 2, 3] a1 is: 3 a2 is: 4 3) 给定一个只读数组 arr,大小为 s。找出可以将数组 arr 分成 3 个部分的方法,使得每个部分的总和相等。示例:1 arr[] = {0, 1, -1, 0}; s = 4 答 1 解释: 只有一种方法可以将数组分成三个总和相等的部份。{0}, {1, -1}, {0} 示例 2 arr[] = {2, 2, 4, 0, 4}; s = 5 答 2 解释: 有两种方法可以将数组分成三个总和相等的部份。 {2, 2}, {4, 0}, {4} {2, 2}, {4}, {0, 4} 文件名: ParititionArray.java 输出 For array: [2, 2, 4, 0, 4] The number of ways to it partition is: 2 For array: [-1, 1, 0, 0, -1, 1] The number of ways to it partition is: 3 For array: [4, 6, 8, 9, -13, 9] The number of ways to it partition is: 0 4) 给定一个由 N 个整数 X1, X2, X3, ...., Xn 组成的数组 arr。你必须返回 f(a1, a2) 的最大值,其中 0 ≤ a1, a2, < N。给定 f(a1, a2) = |arr[a1] - a[a2]| + |a1 - a2|,其中 |y| 表示 y 的绝对值。示例:1 arr[] = {1, -1, 3}; 答 5 说明 f(0, 0) = f(1, 1) = f(2, 2) = 0 f(0, 1) = f(1, 0) = 3 f(0, 2) = f(2, 0) = 4 f(1, 2) = f(2, 1) = 5 我们看到最大值是 5。因此,答案是 5。 示例:2 arr[] = {2, -1, -1, 3}; 答 6 说明 f(0, 0) = f(1, 1) = f(2, 2) = f(3, 3) = 0 f(0, 1) = f(1, 0) = 4 f(0, 2) = f(2, 0) = 5 f(0, 3) = f(3, 0) = 4 f(1, 2) = f(2, 1) = 1 f(1, 3) = f(3, 1) = 6 f(2, 3) = f(3, 2) = 5 我们看到最大值是 6。因此,答案是 6。 文件名: AbsoluteValue.java 输出 The maximum absolute value of the array: [1, 3, -1] is 5 The maximum absolute value of the array: [3, 4, 5, 9, 12] is 13 The maximum absolute value of the array: [13, -4, 5, -12] is 28 The maximum absolute value of the array: [-1, 2, 9, -7] is 17 5) 找到由数组 arr 的元素组成的数字的下一个排列,大小为 s,而不改变元素的顺序。示例:1 arr[] = {3, 1, 2}; s = 3; 答 321 解释: 使用数组元素组成的数字是 312。数字 312 的下一个排列是 321。 示例:2 arr[] = {1, 2, 3}; 答 132 解释: 使用数组元素组成的数字是 123。数字 123 的下一个排列是 132。 文件名: NextPermutation.java 输出 The next permutation of 123 is 132 The next permutation of 1432 is 2134 The next permutation of 13794 is 13947 6) 给定一个数组 arr,其中只包含非负数。使用给定数组 arr 中的所有非负数创建最大的数字。示例:1 arr[] = {35, 1, 9}; 答 9351 解释: 9 是最大的数字位,所以它将放在最前面。之后,数字 3 大于数字 1。因此,35 放在 1 之前。 示例:2 arr[] = {17, 22, 83, 7, 5}; 答 83752217 解释: 8 是给定数组中最大的数字。因此,83 放在最前面。其他数字也进行相同的处理。 文件名: LargestNoExample.java 输出 The largest number formed from the array: [17, 22, 83, 7, 5] is 83752217 The largest number formed from the array: [79, 21, 83, 7, 58] is 837975821 The largest number formed from the array: [0, 9, 99, 79, 87, 158] is 99987791580 7) 给定一个包含 m 行和 m 列的二维矩阵。任务是以顺时针方向旋转矩阵 90 度。示例:1 ![]() 示例:2 ![]() 文件名: RotateMatrix.java 输出 The array is: 1 3 2 4 After rotating to 90 degrees clockwise the array is: 2 1 4 3 The array is: 4 8 7 2 9 5 6 3 0 8 1 6 4 3 2 5 After rotating to 90 degrees clockwise the array is: 4 0 9 4 3 8 5 8 2 1 6 7 5 6 3 2 8) 给定一个数组 arr,其中只包含非负数。找出给定数组 arr 中最小大小的子数组,该子数组排序后,整个数组就会排序。示例:1 arr[] = {2, 4, 3, 8, 9}; 答 {1, 2} 解释: 从索引 1 开始到索引 2 结束的子数组是最小的子数组,排序后整个数组就会排序。 示例:2 arr[] = {12, 34, 45, 67, 78, 88, 99, 102}; 答 { } 解释: 给定数组已排序。因此,子数组为空。 文件名: SmallestSubArray.java 输出 The array is: [2, 4, 3, 8, 9] Minimum subarray for sorting the array is: [4, 3] The array is: [12, 34, 45, 67, 78, 88, 99, 102, 345, 555, 666, 777, 888, 999] Minimum subarray is not found as the array is already sorted The array is: [1, 2, 3, 3, 4, 4, 5, 5, 7, 8, 9, 20, 14, 16, 19, 14, 19, 19, 20, 21, 22, 27, 30] Minimum subarray for sorting the array is: [20, 14, 16, 19, 14, 19, 19] 9) 给定一个数组 arr,大小为 sz,一个键 k,以及一个段大小 s,使得 s 完全整除 sz。检查数组 arr 的每个大小为 s 的段是否包含键 k。示例:1 arr[] = {5, 3, 2, 4, 3, 9, 11, 3, 12, 67, 45, 3}; sz = 12; k = 3; s = 3; 答案: 是的,数组 arr 的每个大小为 s 的段都包含键 k。 解释: sz / s = 12 / 3 = 4。这四个段是 {5, 3, 2} -----> 包含键 3 {4, 3, 9} -----> 包含键 3 {11, 3, 12} -----> 包含键 3 {67, 45, 3} -----> 包含键 3 因此,每个段都包含键 k,即 3。 示例:2 arr[] = {23, 56, 65, 21, 34, 67, 89, 9, 0, 23, 55, 44, 33, 22, 23}; sz = 15; k = 23; s = 5; 答案: 是的,数组 arr 的每个大小为 s 的段都包含键 k。 解释: sz / s = 15 / 5 = 3。这三个段是 {23, 56, 65, 21, 34} -----> 包含键 23 {67, 89, 9, 0, 23} -----> 包含键 23 {55, 44, 33, 22, 23} -----> 包含键 23 因此,每个段都包含键 k,即 23。 文件名: ArraySegmentKey.java 输出 For array [5, 3, 2, 4, 3, 9, 11, 3, 12, 67, 45, 3] Each segment of size 3 contains the key 3 For array [23, 56, 65, 21, 34, 67, 89, 9, 0, 23, 55, 44, 33, 22, 23] Each segment of size 5 contains the key 23 For array [1, 6, 7, 2, 3, 8, 9] Each segment of the array of size 1 does not contain the key 6 10) 给定一个字符串,任务是找出该字符串在其字典序排序的排列中的排名。给定字符串的字符可能重复,也可能不重复。如果字符重复,则需要查看唯一的排列,然后确定排名。示例:1 str = "caa" 答案: "caa" 在其字典序排序的排列中的排名是 3。 解释: 该字符串有三个字符,'a'、'a' 和 'c',它们的字典序排序的排列是 "aac" ----------> 排名 - 1 "aca" ----------> 排名 - 2 "caa" ----------> 排名 - 3 因此,排名是 3。 示例:2 str = "dcab" 答案: "dcab" 在其字典序排序的排列中的排名是 23。 解释: 该字符串有四个字符,'a'、'b'、'c'、'd',它们的字典序排序的排列是 "abcd" ----------> 排名 - 1 "abdc" ----------> 排名 - 2 "acbd" ----------> 排名 - 3 "acdb" ----------> 排名 - 4 "adbc" ----------> 排名 - 5 "adcb" ----------> 排名 - 6 "bacd" ----------> 排名 - 7 "badc" ----------> 排名 - 8 "bcad" ----------> 排名 - 9 "bcda" ----------> 排名 - 10 "bdac" ----------> 排名 - 11 "bdca" ----------> 排名 - 12 "cabd" ----------> 排名 - 13 "cadb" ----------> 排名 - 14 "cbad" ----------> 排名 - 15 "cbda" ----------> 排名 - 16 "cdab" ----------> 排名 - 17 "cdba" ----------> 排名 - 18 "dabc" ----------> 排名 - 19 "dacb" ----------> 排名 - 20 "dbac" ----------> 排名 - 21 "dbca" ----------> 排名 - 22 "dcab" ----------> 排名 - 23 因此,排名是 23。 文件名: PermutationRank.java 输出 The rank of the string 'caa' is 3 among its lexicographically sorted permutations. The rank of the string 'dcab' is 23 among its lexicographically sorted permutations. The rank of the string 'haaxxy' is 61 among its lexicographically sorted permutations. The rank of the string 'mttlks' is 177 among its lexicographically sorted permutations. 11) 给定两个已排序的数组 arr 和 arr1。它们的长度可能相等,也可能不相等。找出这些给定数组的中位数。注意,不允许合并已排序的数组。示例:1 arr = {-11, -10, -9, -2, 5, 17} arr1 = {-4, 4, 7, 13, 16, 17, 19} 答案: 这些已排序数组的中位数位于索引处。 解释: 当合并这些已排序的数组时,我们得到以下结果。 mergedArray = {-11, -10, -9, -4, -2, 4, 5, 7, 13, 16, 17, 17, 19}; mergedArray 的大小为 13,是奇数。因此,只有一个中间元素位于索引 13 / 2 = 6 处。在第 6 个索引处,我们得到 5。因此,5 是这些已排序数组的中位数。 注意:我们在此处仅为解释目的而合并。在代码中,我们不会合并数组。示例:2 arr = {5, 7, 9, 11, 13, 16, 19, 22} arr1 = {-4, 4, 7, 8, 10, 11, 12, 14} 答案: 这些已排序数组的中位数是 10。 解释: 当合并这些已排序的数组时,我们得到以下结果。 mergedArray = {-4, 4, 5, 7, 7, 8, 9, 10, 11, 11, 12, 13, 14, 16, 19, 22}; mergedArray 的大小为 16,是偶数。因此,有两个中间元素分别位于 16 / 2 = 8号 和 16 / 2 - 1 = 7号 索引处。因此,中位数是 (10 + 11) / 2 = 10.5。 文件名: FindMedian.java 输出 The median element is: 5.0 The median element is: 10.5 12) 给定一个数组 arr,大小为 s。此外,还给了一个整数 tar。数组 arr 使用数组的某个元素作为枢轴进行旋转 {1, 2, 3, 4, 5} 可能会变成 {4, 5, 1, 2, 3}。找出整数 tar 是否存在于数组 arr 中。注意,数组 arr 在旋转之前是按非递减顺序排序的。示例:1 arr = {7, 8, 9, 10, 0, 3, 4, 5, 6}; s = 9; tar = 3; 答 5. 解释: 数字 3 存在于索引 5 处。 示例:2 arr = {4, 5, 1, 2, 3}; s = 5; tar = 6; 答 -1 解释: 数字 6 不存在于数组中。 文件名: FindElement.java 输出 The target element 3 is found at the index 5 The target element is not found! 注意:线性搜索也可以在此处完成。但是,其时间复杂度将比二分查找高。13) 给定一个数组 arr,大小为 s。数组 arr 按非递减顺序排序。此外,还给了一个整数 tar。找出整数 tar 是否存在于数组 arr 中。如果存在,找出整数 tar 的起始和结束索引。示例:1 arr = {1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 8, 9, 10}; s = 13; tar = 5; 答案: 起始索引: 4, 结束索引: 7 解释: 在索引 4 到 7 之间,数字 5 存在。 示例:2 arr = {8, 10, 12, 56, 67, 70, 70, 70, 70, 75, 77, 78, 90, 93, 97}; s = 15; tar = 19; 答案: 目标数字 19 不存在于给定数组中 文件名: FindRange.java 输出 Range of target element 5 is: [4, 7] The target element is not found! 14) 给定一个字符串 str。找出添加到字符串 str 以使其成为回文串所需添加的字符的最小值。字符必须添加到字符串的开头。示例:1 str = "ABC"; 答 2 解释: 在开头插入 "B",得到 B + ABC ---> BABC。 在开头插入 "C",得到 C + BABC ---> CBABC。因此,有 2 次插入操作。因此,答案是 2。 示例:2 str = "ABEBAAAA"; 答 3 解释: 在开头插入 "A",得到 A + ABEBAAAA ---> AABEBAAAA。 在开头插入 "A",得到 A + AABEBAAAA ---> AAABEBAAAA。 在开头插入 "A",得到 A + AAABEBAAAA ---> AAAABEBAAAA。 因此,有 3 次插入操作。因此,答案是 3。 文件名: MakePalindrome.java 输出 2 insert operations are required to make 'ABC' a palindrome string. 3 insert operations are required to make 'ABEBAAAA' a palindrome string. 15) 给定一个字符串数组和一个数字 n。以这样的方式格式化数组中的字符串,使得每行包含 n 个字符。使用贪婪方法插入字符串,即尽可能多地插入单词或字符。使用 ' ' 字符进行填充,以便每行有 n 个字符。额外的空格应均匀分布。如果空格的数量不能均匀分配到字符串中,则左侧的槽应比右侧的槽有更多的空格。对于最后一行,文本应左对齐,即额外的空格应放在右侧。示例 Words = {"It", "is", "the", "example", "of", "sorting", "technique"} N = 16 答案: 格式化后的行是 文件名: TextJustified.java 输出 'It is the' 'example of' 'sorting ' 'technique ' 16) 给定一个整数数组 arr,其中每个数字都重复三次,只有一个数字除外,它只重复一次。返回只重复一次的数字。示例 arr[] ={2, 2, 2, 4, 6, 6, 6, 5, 4, 9, 9, 9, 0, 0, 4, 0} 答 5 解释: 数字 5 只重复一次。 文件名: UniqueNumber.java 输出 Array is: [2, 2, 2, 4, 6, 6, 6, 5, 4, 9, 9, 9, 0, 0, 4, 0] The unique number is: 5 Array is: [6, 6, 6, 1, 1, 1, 4, 4, 4, 12, 0, 0, 0] The unique number is: 12 17) 给定一个整数数组 arr。重新排列数组 arr,使得 arr[i] = arr[arr[i]]。空间复杂度必须是 O(1)。示例 arr[] = {2, 1, 0} 答 {0, 1, 2}; 解释: arr[0] = 2 => arr[arr[0]] 变成 arr[2] = 0; arr[1] = 1 => arr[arr[1]] = arr[1] = 1 arr[2] = 0 => arr[arr[2]] = arr[0] = 2 因此,更新后的数组是 {0, 1, 2} 文件名: RearrangeArray.java 输出 Array before rearranging is: [2, 1, 0] Array after rearranging is: [0, 1, 2] Array before rearranging is: [2, 4, 3, 1, 0] Array after rearranging is: [3, 0, 1, 4, 2] 注意:如果移除了 O(1) 空间复杂度条件,则问题将变得简单。可以创建一个与输入数组大小相同的数组,并将 a[a[i]] 的值复制到新创建的数组中。O(1) 空间复杂度使得问题变得棘手。18) 给定一个正数 n。找出数字的二进制表示中存在的尾随零的数量。示例:1 n = 20 答 2 解释: 20 的二进制表示是 10100。10100 中尾随零的总数为 2。因此,答案是 2。 示例:2 n = 9 答 0 解释: 9 的二进制表示是 1001。1001 中尾随零的总数为 0。因此,答案是 0。 文件名: TrailingZeros.java 输出 For number 20, there are 2 trailing zeros. For number 64, there are 6 trailing zeros. For number 3, there are 0 trailing zeros. 19) 给定一个数字 n。找出第 n 个二进制表示为回文数的数字。示例:1 n = 1 答 1 解释: 1 的二进制表示是 1,1 是回文数。1 也是第 1 个数字。 示例:2 n = 3 答 5 解释: 第 3 个二进制表示为回文数的数字是 5。其二进制表示是 101。 例如:3 n = 9 答 27 解释: 第 9 个二进制表示为回文数的数字是 27。其二进制表示是 11011。 文件名: PalindromeNumbers.java 输出 The 7th number whose binary representation is palindrome is: 17 The 13th number whose binary representation is palindrome is: 51 20) 给定一个整数数组 arr。大小为 w 的滑动窗口从数组的左侧向右侧移动。因此,一次只能观察 w 个数字。任务是找出每个窗口的最大值。观察以下示例。示例 arr[] = {1, 4, -1, -4, 6, 4, 7, 8}; w = 3; 答 {4, 4, 6, 6, 7, 8} 说明 {[1, 4, -1,] -4, 6, 4, 7, 8} -> max(1, 4, -1) = 4 {1, [4, -1, -4,] 6, 4, 7, 8} -> max(4, -1, -4) = 4 {1, 4, [-1, -4, 6,] 4, 7, 8} -> max(-1, -4, 6) = 6 {1, 4, -1, [-4, 6, 4,] 7, 8} -> max(-4, 6, 4) = 6 {1, 4, -1, -4, [6, 4, 7,] 8} -> max(6, 4, 7) = 7 {1, 4, -1, -4, 6, [4, 7, 8]} -> max(4, 7, 8) = 8 文件名: SlidingWindowMax.java 输出 The array is: [1, 4, -1, -4, 6, 4, 7, 8] The maximum values are: [4, 4, 6, 6, 7, 8] 21) 给定一个逆波兰表示法中的算术表达式。计算给定表达式。示例 A = ["4", "3", "+", "5", "*"] 答 35 说明 * -> () * () 5: -> () * (5) +: (() + ()) * (5) 3: (() + (3)) * (5) 4: ((4) + (3)) * (5) = (7) * (5) = 35 文件名: EvaluateExpression.java 输出 The expression is: [4, 3, +, 5, *] The value of the expression is: 35 The expression is: [4, 13, 5, /, +] The value of the expression is: 6 22) 给定一个数字 n,表示代码中的总位数。格雷码总是从 0 开始。显示格雷码的序列。示例 N = 3; 答 {0, 1, 3, 2, 6, 7, 5, 4} 0 0 0 ---> 0 0 0 1 ---> 1 0 1 1 ---> 3 0 1 0 ---> 2 1 1 0 ---> 6 1 1 1 ---> 7 1 0 1 ---> 5 1 0 0 ---> 4 文件名: GrayCode.java 输出 For n = 3, the gray code sequence is: [0, 1, 3, 2, 6, 7, 5, 4] For n = 4, the gray code sequence is: [0, 1, 3, 2, 6, 7, 5, 4, 12, 13, 15, 14, 10, 11, 9, 8] For n = 5, the gray code sequence is: [0, 1, 3, 2, 6, 7, 5, 4, 12, 13, 15, 14, 10, 11, 9, 8, 24, 25, 27, 26, 30, 31, 29, 28, 20, 21, 23, 22, 18, 19, 17, 16] 23) 给定一个包含 n 个整数的数组 arr。找出所有唯一的三个数(x、y 和 z),使得 x + y + z = 0。注意,三元组的顺序无关紧要,即 y + z + x 或 y + x + z 与 x + y + z 相同。示例 arr = {-2, 0, 2, 4, -2, -4}; 答案: 有三个唯一的三元组。{-2, 0, 2}, {-2, -2, 4}, {-4, 0, 4} 文件名: FindTriplets.java 输出 For the list: [-4, -2, -2, 0, 2, 4] Triplets are: [[-4, 0, 4], [-2, -2, 4], [-2, 0, 2]] For the list: [-5, -4, -4, -4, -3, -2, -1, -1, -1, 0, 0, 0, 1, 1, 1, 3, 4, 4, 5] Triplets are: [[-5, 0, 5], [-5, 1, 4], [-4, -1, 5], [-4, 0, 4], [-4, 1, 3], [-3, -2, 5], [-3, -1, 4], [-3, 0, 3], [-2, -1, 3], [-2, 1, 1], [-1, 0, 1], [0, 0, 0]] 24) 给定一个数组 arr,其中只包含非负整数(x1, x2, x3, ..., xn)。每个整数代表坐标(j, xj)。'n' 条垂直线被拉伸,使得线 j 的两个端点位于 (j, xj) 和 (j, 0)。找出两条线,它们与 x 轴共同创建一个容器,使得容器能够容纳最多的水量。假设水可以存储在 2D 容器中。注意,不允许倾斜容器。示例:1 arr = {5, 1, 2, 3}; 答 9 解释: 给定数组中有 4 条垂直线,它们的高度分别为 5、1、2 和 3。此外,5 和 3 相距 3 个单位。因此,容量是 min(5, 3) * 3 = 9。如果取其他任何一对垂直线,我们得到的容量都不会超过 9。 文件名: ContainerCapacity.java 输出 For the list: [5, 1, 2, 3] The maximum capacity is: 9 25) 给定一个包含 n 个整数的数组 arr。x1, x2 ,..., xn 和一个整数 J。返回大小为 J 的所有窗口中存在的唯一数字的数量。示例:1 arr = {5, 1, 2, 3, 2, 5, 9, 8, 0, 0, 0}; J = 3 答 {3, 3, 2, 3, 3, 3, 3, 2, 1} 解释: 大小为 J(即 3)的所有窗口是 {5, 1, 2} ---> 3 个唯一数字 {1, 2, 3} ---> 3 个唯一数字 {2, 3, 2} ---> 2 个唯一数字 {3, 2, 5} ---> 3 个唯一数字 {2, 5, 9} ---> 3 个唯一数字 {5, 9, 8} ---> 3 个唯一数字 {9, 8, 0} ---> 3 个唯一数字 {8, 0, 0} ---> 2 个唯一数字 {0, 0, 0} ---> 1 个唯一数字 如果我们列出唯一元素,我们会得到 {3, 3, 2, 3, 3, 3, 3, 2, 1}。 文件名: UniqueNumbers.java 输出 For the list: [5, 1, 2, 3, 2, 5, 9, 8, 0, 0, 0] The list of unique numbers are: [3, 3, 2, 3, 3, 3, 3, 2, 1] For the list: [5, 6, 7, 3, 3, 3, 1] The list of unique numbers are: [1, 1, 1, 1, 1, 1, 1] 26) 给定一个只包含整数的数组 arr。找出数组 arr 中的 4 个索引,使得 arr[i] + arr[j] = arr[k] + arr[l],其中 i、j、k 和 l 是这 4 个索引。如果存在多个答案,则显示任何一组满足给定条件的 4 个索引。注意,所有索引必须是唯一的。示例:1 arr = {-2, 0, 2, 4, -2, -4}; 答 {0, 1, 2, 5} 解释: 索引 0、1、2 和 5 处的值分别是 -2、0、2 和 -4,并且 -2 + 0 = 2 + -4 => 2。其他答案可以是 {0, 2, 3, 5} 或 {1, 2, 3, 4} 文件名: EqualSum.java 输出 For the list: [-2, 0, 2, 4, -2, -4] The list of indices are: [0, 1, 2, 5] For the list: [2, 4, 5, 9, -1, 15, 7] The list of indices are: [0, 1, 4, 6] 27) 给定一个字符串 str 和一个字符串 X。查找 str 中的最小窗口,其中包含 X 中的所有字符。时间复杂度必须是线性的。注意,窗口的大小必须等于或大于字符串 X 的大小。示例:1 S = "APPLBEXODEBLBNC" X = "LNC" 答案: "LBNC" 解释: 任何其他窗口将需要更多的字符。最小尺寸的窗口在答案中提及。 文件名: SmallestWindow.java 输出 For the string: 'APPLBEXODEBLBNC' The smallest window is: LBNC 28) 给定一个长度为 l 的一维整数数组 arr。找出最长的子序列的长度,该子序列先递增然后递减。示例 arr = {2, 11, 3, 10, 5, 4, 3, 2, 1}; l = 9 答 8 解释: 最长的递增然后递减的子序列是 {2, 3, 10, 5, 4, 3, 2, 1}。它有 8 个元素。因此,答案是 8。 文件名: LongestSubsequence.java 输出 For the list: [2, 11, 3, 10, 5, 4, 3, 2, 1] The length of subsequence which is increasing and then decreasing is: 8 For the list: [7, 6, 8, 10, 2, 5, 12, 30, 31, 20, 22, 18] The length of subsequence which is increasing and then decreasing is: 8 29) 给定一组硬币 X。找出可以构成总和 S 的方法数。注意,集合 X 中提到的硬币有无限供应。确保空间复杂度为 O(S)。注意,硬币的顺序将被忽略,即 1 + 2 = 3 是一种方法;因此,2 + 1 = 3 不会被考虑,反之亦然。此外,硬币集合将始终按升序排列。示例 X = {2, 3, 5, 7}; S = 15 答 10 解释: 有 10 种方法可以得到总和 S = 15。以下是这 10 种方法 2 + 2 + 2 + 2 + 2 + 2 + 3 = 15 2 + 2 + 2 + 3 + 3 + 3 = 15 2 + 2 + 2 + 2 + 2 + 5 = 15 2 + 3 + 5 + 5 = 15 2 + 2 + 3 + 3+ 5 = 15 2 + 2 + 2 + 2 + 7 = 15 2 + 3 + 3 + 7 = 15 3 + 3 + 3 + 3 + 3 = 15 3 + 5 + 7 = 15 5 + 5 + 5 = 15 文件名: CoinSum.java 输出 For the set of coins: [2, 3, 5, 7] There are 10 ways to get the sum 15 For the set of coins: [4, 6, 8, 9, 10] There are 385 ways to get the sum 90 30) 给定一个大小为 R * C 的棋盘,其中 R 代表总行数,C 代表总列数。创建矩阵 arr,使得 arr[x][y] 表示单元格(x, y) 上发生的皇后攻击次数,假设单元格中没有皇后。注意 1) 皇后可以在棋盘上任意数量的方格上沿垂直方向、水平方向或对角线移动。皇后不是马,因此它不能跳过其他皇后。 2) 给定 R 个字符串的数组,每个字符串的大小为 C。字符串只包含 '0' 和 '1'。1 代表皇后,0 代表空单元格。因此,在任何单元格中,要么有一个皇后,要么该单元格是空的。 3) 最坏情况时间复杂度不能超过 O(R * C)。 示例 假设棋盘是 [1 0 0] [0 0 1] [0 1 0] 其中 1 是皇后位置,0 是空位。 没有皇后攻击单元格(1, 1)。请记住,我们必须假设我们正在评估攻击的单元格中没有皇后。 有 3 次攻击来自皇后到单元格(1, 2)。一次来自位于单元格(1, 1) 的皇后,一次来自位于单元格(2, 3) 的皇后,另一次来自单元格(3, 2)。 位于 (2, 3) 和 (1, 1) 的皇后攻击单元格(1, 3)。注意,这次我们考虑的是 1 索引。 同样,我们也可以计算其他单元格的皇后攻击次数。 最终矩阵是 [0, 3, 2] [3, 3, 1] [2, 1, 3] 文件名: QueenAttack.java 输出 For the chessboard: 1 0 0 0 0 1 0 1 0 The following matrix gives the number of queen attacks [0, 3, 2] [3, 3, 1] [2, 1, 3] |
我们请求您订阅我们的新闻通讯以获取最新更新。