leetcode刷题笔记一百三十六题与一百三十七题 只出现一次的数字与只出现一次的数字II

leetcode刷题笔记一百三十六题与一百三十七题 只出现一次的数字与只出现一次的数字II

源地址:

136. 只出现一次的数字

137. 只出现一次的数字 II

问题描述:

136题问题描述

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1
示例 2:

输入: [4,1,2,1,2]
输出: 4

137题问题描述

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,3,2]
输出: 3
示例 2:

输入: [0,1,0,1,0,1,99]
输出: 99

//136题与137题区别在于 136题的重复元素只重复两次, 137题的重复元素会重复三次
//这造成的影响在于本题的主要解法基于位运算中的异或,只是用单个变量进行异或,很难区别三次重复与单次重复,需要引入第二个变量

//136题
object Solution {
    def singleNumber(nums: Array[Int]): Int = {
        var single = 0
        for (num <- nums) single ^= num
        return single
    }
}

//137题
//重复K次,依次类推,需要引入K个变量
object Solution {
    def singleNumber(nums: Array[Int]): Int = {
        var once = 0
        var twice = 0
        
        for (num <- nums){
            once = ~twice & (once^num)
            twice = ~once & (twice^num)
        }
        return once
    }
}
原文地址:https://www.cnblogs.com/ganshuoos/p/13532499.html