Java必须掌握的数组(含面试大厂题和源码)

Java在大厂面试中的数组题目经常考查数组的基础操作、算法思想及其应用。这些题目不仅测试你的Java编程能力,也考察你解决问题的思维和算法知识。下面是一些典型的Java数组面试题目,适用于准备大厂面试的候选人。

1. 寻找数组中的重复数字

题目描述
给定一个长度为 n+1 的数组,所有的数字都在 1 到 n 的范围内,包括边界。假设只有一个数字出现一次以上,找出这个数字。

思路提示

  • 使用哈希表记录每个数字出现的次数,然后遍历哈希表找到重复的数字。
  • 快慢指针法(Floyd的循环查找算法)。
  • 原地置换法,将每个数字交换到其数值对应的索引位置上,如果交换过程中发现重复,则找到了重复数字。

2. 合并两个有序数组

题目描述
给你两个有序整数数组 nums1nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。

思路提示

  • 初始化两个指针分别指向 nums1nums2 的末尾,同时设置一个指针从 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:合并两个有序数组

问题描述
给定两个有序整数数组 nums1nums2,将 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相关面试的不错选择。在实际面试中,除了编写正确的代码外,理解代码的时间复杂度和空间复杂度也非常重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值