leetcode 442. 数组中重复的数据(java)
发布人:shili8
发布时间:2024-11-18 01:30
阅读次数:0
**LeetCode442. 数组中重复的数据**
### 题目描述给定一个长度为 `n` 的整数数组 `nums`,其中有重复的数字。请设计一个算法来找出任何重复出现的数字。
**示例1:**
* 输入:`nums = [1,2,3,1]`
* 输出:`[1]`
**示例2:**
* 输入:`nums = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]`
* 输出:`[]`
### 解决方案#### 方法1: 哈希表法我们可以使用哈希表来存储数组中的数字。对于每个数字,我们检查它是否已经存在于哈希表中。如果存在,则返回该数字。
javaimport java.util.*; public class Solution { public int[] findDuplicates(int[] nums) { Setset = new HashSet<>(); List result = new ArrayList<>(); for (int num : nums) { if (!set.add(num)) { result.add(num); } } return result.stream().mapToInt(Integer::intValue).toArray(); } }
#### 方法2: 位运算法我们可以使用位运算来解决这个问题。对于每个数字,我们将其与 `nums` 中的所有其他数字进行比较。如果两个数字相同,则它们的二进制表示中会有一个相同的位。
javapublic class Solution { public int[] findDuplicates(int[] nums) { int n = nums.length; boolean[] visited = new boolean[n +1]; Listresult = new ArrayList<>(); for (int num : nums) { if (num > n || visited[num]) { continue; } visited[num] = true; // 位运算 int index =2 * num -1; while (index <= n && visited[index]) { index +=2; } if (index <= n) { result.add(index); } } return result.stream().mapToInt(Integer::intValue).toArray(); } }
### 总结在本题中,我们需要找到数组 `nums` 中的重复数字。我们可以使用哈希表法或位运算法来解决这个问题。哈希表法通过检查每个数字是否已经存在于哈希表中来实现,而位运算法则通过比较两个数字的二进制表示来实现。
###代码注释* `findDuplicates` 方法:该方法负责找到数组 `nums` 中的重复数字。
* `set` 变量:用于存储数组中的数字,以便检查是否已经存在于哈希表中。
* `result` 变量:用于存储找到的重复数字。
* `visited` 变量:用于标记已经访问过的数字,以避免重复计算。
### 示例代码
javapublic class Main { public static void main(String[] args) { int[] nums = {1,2,3,1}; Solution solution = new Solution(); int[] result = solution.findDuplicates(nums); System.out.println("重复数字:"); for (int num : result) { System.out.print(num + " "); } } }
### 最终答案在本题中,我们需要找到数组 `nums` 中的重复数字。我们可以使用哈希表法或位运算法来解决这个问题。通过检查每个数字是否已经存在于哈希表中或比较两个数字的二进制表示,我们可以找出任何重复出现的数字。
最终答案是:
* 哈希表法:`[1]`
* 位运算法:`[]`
注:本题目中的示例代码和解释仅供参考,具体实现可能会有所不同。