Java:给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
可以使用位运算来解决这个问题。具体来说,我们可以对所有数字的二进制表示的每一位进行统计,统计每一位上所有数字出现次数的和,并对 3 取余,如果余数不为 0,则说明只出现一次的数字在这一位上有值。最后将所有有值的位组合起来,就得到了只出现一次的数字。
以下是 Java 代码实现:
public int singleNumber(int[] nums) { int[] bitSum = new int[32]; for (int num : nums) { for (int i = 0; i < 32; i++) { bitSum[i] += (num >> i) & 1; } } int res = 0; for (int i = 0; i < 32; i++) { res |= (bitSum[i] % 3) << i; } return res; }
使用lkotlin解决这个问题:373. 查找和最小的 K 对数字 中等 491 相关企业 给定两个以 升序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。 定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 。 请找到和最小的 k 个数对 (u1,v1), (u2,v2) ... (uk,vk) 。
可以用 Kotlin 实现一个小根堆来解决这个问题。首先,我们可以将 nums1 中的每个数与 nums2 中的第一个数组合成一对,并将其加入小根堆中。然后,我们每次从堆中取出和最小的数对 (u, v),并将 nums1 中和 u 相邻的数和 nums2 中和 v 相邻的数组成的数对加入堆中。重复这个步骤 k 次即可得到和最小的 k 个数对。
以下是 Kotlin 实现的代码:
import java.util.*
fun kSmallestPairs(nums1: IntArray, nums2: IntArray, k: Int): List<List<Int>> {
val heap = PriorityQueue<List<Int>>(compareBy { it[0] + it[1] })
for (i in nums1.indices) {
heap.offer(listOf(nums1[i], nums2[0], 0))
}
val result = mutableListOf<List<Int>>()
for (i in 0 until k) {
val pair = heap.poll() ?: break
result.add(listOf(pair[0], pair[1]))
if (pair[2] == nums2.size - 1) continue
heap.offer(listOf(pair[0], nums2[pair[2] + 1], pair[2] + 1))
}
return result
}
这个函数接受三个参数:两个整数数组 nums1 和 nums2,以及一个整数 k。它返回一个包含最小的 k 个数对的列表。在函数内部,我们首先创建一个小根堆 heap,并将 nums1 中的每个数与 nums2 中的第一个数组合成一对并加入堆中。然后,我们循环 k 次,每次从堆中取出和最小的数对 (u, v),将其加入结果列表 result 中,并将 nums1 中和 u 相邻的数和 nums2 中和 v 相邻的数组成的数对加入堆中。最后,我们返回结果列表 result。
参考资料:
- LeetCode 题目 373. 查找和最小的 K 对数字
- Kotlin 标准库中的 PriorityQueue 类
相关推荐














