返回

剑指 Offer 56 - II. 数组中数字出现的次数 II:独具匠心的解题方案,让算法豁然开朗

后端

1. 独辟蹊径的算法视角,洞悉题目本质

>剖析题目要素,把握解题方向

首先,我们来仔细审视一下这道题目的要求。题目中提到在一个数组 nums 中,除一个数字只出现一次之外,其他数字都出现了三次。我们的目标是找出那个只出现一次的数字。

>独创性思维,点亮解题思路

面对这样的题目,我们不妨跳出固有思维的束缚,尝试用一种独创性的方式来思考。既然其他数字都出现了三次,那么我们可以利用这个特点来做文章。我们可以将数组中的元素按位异或运算,得到一个新的数字。这个新数字将只包含那个只出现一次的数字。

2. 循序渐进的算法步骤,清晰明了

>分解算法流程,条理清晰

接下来,我们将把上述的算法思路转化为具体的步骤。

>步骤一:按位异或运算

首先,我们将数组中的所有元素进行按位异或运算。这个操作可以将所有出现三次的数字抵消掉,因为按位异或运算具有交换律和结合律。这样,我们就可以得到一个只包含那个只出现一次的数字的新数字。

>步骤二:检验结果

现在,我们需要检验一下这个新数字是否真的是只出现一次的数字。我们可以遍历数组,如果数组中存在与这个新数字相同的数字,那么说明这个新数字不是只出现一次的数字。否则,这个新数字就是我们要求的只出现一次的数字。

3. 代码示例:算法的艺术之美

为了让大家更好地理解算法的具体实现,我们提供了以下代码示例:

def single_number(nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    # 按位异或运算
    result = 0
    for num in nums:
        result ^= num

    # 检验结果
    for num in nums:
        if num == result:
            return num

    return -1


# 测试用例
nums1 = [2, 2, 3, 2]
nums2 = [0, 1, 0, 1, 0, 1, 99]
print(single_number(nums1))  # 输出:3
print(single_number(nums2))  # 输出:99

4. 融会贯通,拓展算法应用

>迁移算法思想,解决更多问题

掌握了《剑指 Offer 56 - II. 数组中数字出现的次数 II》的解法后,我们可以将算法思想迁移到其他类似的问题中。例如,我们可以用同样的思想解决《剑指 Offer 56 - I. 数组中数字出现的次数》和《找出数组中只出现一次的数字》等问题。

5. 总结与思考,精益求精

>回顾算法精髓,提升算法能力

通过对《剑指 Offer 56 - II. 数组中数字出现的次数 II》的剖析,我们不仅掌握了一种解决问题的方法,更重要的是,我们领悟了算法的精髓。这种精髓体现在算法思想的独创性、算法步骤的清晰性和算法应用的广泛性上。