Java在大厂面试中的数组题目经常考查数组的基础操作、算法思想及其应用。这些题目不仅测试你的Java编程能力,也考察你解决问题的思维和算法知识。下面是一些典型的Java数组面试题目,适用于准备大厂面试的候选人。
1. 寻找数组中的重复数字
题目描述:
给定一个长度为 n+1 的数组,所有的数字都在 1 到 n 的范围内,包括边界。假设只有一个数字出现一次以上,找出这个数字。
思路提示:
- 使用哈希表记录每个数字出现的次数,然后遍历哈希表找到重复的数字。
- 快慢指针法(Floyd的循环查找算法)。
- 原地置换法,将每个数字交换到其数值对应的索引位置上,如果交换过程中发现重复,则找到了重复数字。
2. 合并两个有序数组
题目描述:
给你两个有序整数数组 nums1
和 nums2
,请你将 nums2
合并到 nums1
中,使 nums1
成为一个有序数组。
思路提示:
- 初始化两个指针分别指向
nums1
和nums2
的末尾,同时设置一个指针从nums1
的末尾开始工作,逆序比较并合并。 - 从后向前数组合并,先比较两个数组的最后一个元素,较大的那个放到
nums1
的最后面。
3. 旋转数组
题目描述:
给定一个数组,将数组中的元素向右移动 k
个位置,其中 k
是非负数。
思路提示:
- 使用额外的数组,将每个元素放到其应该出现的位置。
- 环状替换。
- 数组翻转法:先将整个数组翻转,然后翻转前
k
个元素,再翻转剩下的元素。
4. 查找数组中的第K大元素
题目描述:
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
思路提示:
- 排序后直接访问。
- 使用最小堆维护大小为 k 的堆,堆顶即为第 k 大元素。
- 快速选择算法,基于快速排序的选择方法。
5. 最长连续序列
题目描述:
给定一个未排序的整数数组,找出最长连续序列的长度。
思路提示:
- 使用哈希表存储每个元素,然后对每个元素检查其是否是连续序列的开始,并尝试向上扩展序列,同时更新最长序列长度。
这些题目覆盖了数组的基本操作、排序、查找、以及一些高级算法的应用。在准备面试时,建议手动编写代码实现,深入理解每种方法的原理和优缺点。
Java在大厂面试中经常会出现涉及数组的编程题目,这些题目旨在评估候选人的编程能力、逻辑思维以及对Java语言的熟练度。以下是一个典型的数组面试题目,包括问题描述和源码实现。
面试题目:寻找数组中的重复数字
问题描述:
给定一个长度为 n 的数组,其中包含范围为 0 到 n-1 的整数。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
例如,如果输入长度为 7 的数组 {2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字 2 或者 3。
解题思路:
一种简单的解决方案是使用哈希表,遍历数组,利用哈希表存储已经遍历过的数字。如果某个数字在哈希表中已存在,则该数字为重复数字。
源码实现:
import java.util.HashSet;
import java.util.Set;
public class FindDuplicateNumber {
public static void main(String[] args) {
int[] nums = {2, 3, 1, 0, 2, 5, 3};
System.out.println("重复的数字是: " + findDuplicate(nums));
}
public static int findDuplicate(int[] nums) {
Set<Integer> seen = new HashSet<>();
for (int num : nums) {
if (!seen.add(num)) {
// 如果添加失败(即num已存在于集合中),则找到了重复的数字
return num;
}
}
// 如果没有找到重复的数字,返回-1或者抛出异常
return -1; // 或者可以抛出异常
}
}
这段代码首先导入了HashSet
,然后定义了一个名为FindDuplicateNumber
的类。在main
方法中,定义了一个示例数组,并调用findDuplicate
方法来查找并打印数组中的一个重复数字。findDuplicate
方法通过遍历数组并尝试将每个元素添加到HashSet
中来工作。如果添加失败(意味着元素已存在于集合中),则意味着找到了一个重复的数字,该数字随即被返回。
这个问题的解法比较直接,主要考查候选人对数组和集合的操作能力以及对问题的基本理解。在实际面试中,面试官可能还会要求讨论解法的时间复杂度和空间复杂度,或者提出更加高效的解法。Java在大厂面试中经常会出现涉及数组的编程题目,这些题目旨在评估候选人的编程能力、逻辑思维以及对Java语言的熟练度。以下是一个典型的数组面试题目,包括问题描述和源码实现。
面试题目:寻找数组中的重复数字
问题描述:
给定一个长度为 n 的数组,其中包含范围为 0 到 n-1 的整数。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
例如,如果输入长度为 7 的数组 {2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字 2 或者 3。
解题思路:
一种简单的解决方案是使用哈希表,遍历数组,利用哈希表存储已经遍历过的数字。如果某个数字在哈希表中已存在,则该数字为重复数字。
源码实现:
import java.util.HashSet;
import java.util.Set;
public class FindDuplicateNumber {
public static void main(String[] args) {
int[] nums = {2, 3, 1, 0, 2, 5, 3};
System.out.println("重复的数字是: " + findDuplicate(nums));
}
public static int findDuplicate(int[] nums) {
Set<Integer> seen = new HashSet<>();
for (int num : nums) {
if (!seen.add(num)) {
// 如果添加失败(即num已存在于集合中),则找到了重复的数字
return num;
}
}
// 如果没有找到重复的数字,返回-1或者抛出异常
return -1; // 或者可以抛出异常
}
}
这段代码首先导入了HashSet
,然后定义了一个名为FindDuplicateNumber
的类。在main
方法中,定义了一个示例数组,并调用findDuplicate
方法来查找并打印数组中的一个重复数字。findDuplicate
方法通过遍历数组并尝试将每个元素添加到HashSet
中来工作。如果添加失败(意味着元素已存在于集合中),则意味着找到了一个重复的数字,该数字随即被返回。
这个问题的解法比较直接,主要考查候选人对数组和集合的操作能力以及对问题的基本理解。在实际面试中,面试官可能还会要求讨论解法的时间复杂度和空间复杂度,或者提出更加高效的解法。下面列出四个常见的Java数组相关面试题目,并提供相应的问题描述和源码实现。
题目1:合并两个有序数组
问题描述:
给定两个有序整数数组 nums1
和 nums2
,将 nums2
合并到 nums1
中,使得 nums1
成为一个有序数组。假设 nums1
有足够的空间(空间大小大于或等于 m + n
)来保存 nums2
中的元素。
源码实现:
public class MergeSortedArray {
public static void merge(int[] nums1, int m, int[] nums2, int n) {
int i = m - 1, j = n - 1, k = m + n - 1;
while (i >= 0 && j >= 0) {
if (nums1[i] > nums2[j]) {
nums1[k--] = nums1[i--];
} else {
nums1[k--] = nums2[j--];
}
}
while (j >= 0) {
nums1[k--] = nums2[j--];
}
}
}
题目2:旋转数组
问题描述:
将数组中的元素向右移动 k
个位置,其中 k
是非负数。
源码实现:
public class RotateArray {
public static void rotate(int[] nums, int k) {
k %= nums.length;
reverse(nums, 0, nums.length - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, nums.length - 1);
}
private static void reverse(int[] nums, int start, int end) {
while (start < end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}
}
题目3:只出现一次的数字
问题描述:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
源码实现:
public class SingleNumber {
public static int singleNumber(int[] nums) {
int single = 0;
for (int num : nums) {
single ^= num;
}
return single;
}
}
题目4:移动零
问题描述:
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
源码实现:
public class MoveZeroes {
public static void moveZeroes(int[] nums) {
int insertPos = 0;
for (int num : nums) {
if (num != 0) {
nums[insertPos++] = num;
}
}
while (insertPos < nums.length) {
nums[insertPos++] = 0;
}
}
}
这些题目覆盖了数组操作的几个关键领域,包括数组合并、元素旋转、位操作以及数组遍历技巧,是准备Java相关面试的不错选择。在实际面试中,除了编写正确的代码外,理解代码的时间复杂度和空间复杂度也非常重要。