LeetCode——SingleNubmber Ⅱ

题目

      给定一组数字,这些数字里面每一个都重复出现了三次,只有一个数字只出现了一次,要求在O(n)时间和O(1)空间消耗内解出来。

解题思路

      时间复杂度要求O(n),因此不能排序后再进行遍历,同时空间复杂度为O(1),考虑通过位图计算,因为计算机中任何数据都是以二进制方式进行存储,因此可以利用位运算得出出现一次的数字。设计one,two,three分别表示出现一次、两次、三次的数字,若出现一次则one记录,出现两次,one清除,two记录,出现三次,one、two同时清除。

      示例:数组a=[2、1、2、2],初始one = 0,two = 0,three = 0;

      1)数字2读入,one = 2(二进制为:10),two = 0,three = 0;

      2)数字1读入,one = 3(二进制为:11),two = 0,three = 0;

      3)数字2读入,one = 1(二进制为:1),two = 2,three = 0;

      4)数字2读入,one = 3(二进制为:11),two = 2,three = 0,然后three = one&two = 2(二进制为:10),表明2出现三次,one& = ~(three),two& = ~(three),除去one与two中的相同位,即删除出现三次的数字,即one = 1(二进制为:1),two = 0,three = 0。

代码实现

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()) {
			int n = sc.nextInt();
			int[] a = new int[n];
			for(int i=0;i

其中,two ^= one & a[i],one & a[i]得到目前至少出现过一次的对应位,two ^= one & a[i]得到出现两次的位;

           one ^ = a[i]得到目前仅出现过一次的对应位,第二次出现则对应位为0;

           three=~(one & two)一次的位与两次的位相与得到出现三次的位,然后取反删除;

           two &= three,one &= three,更新出现一次和两次的对应位。

      

你可能感兴趣的:(Java基础)