当前位置:  首页>> 技术小册>> 数据结构与算法(中)

题目描述

在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次。

请找出那个只出现一次的数字。

你可以假设满足条件的数字一定存在。

思考题:

  • 如果要求只使用 O(n) 的时间和额外 O(1) 的空间,该怎么做呢?

解法

分别累加数组中每个元素的二进制中出现的数字,那么出现三次的数字,二进制位上最后累加的结果一定能被 3 整除。不能被 3 整除的位,就属于只出现一次的数字。

  1. /**
  2. * @author bingo
  3. * @since 2018/12/10
  4. */
  5. class Solution {
  6. /**
  7. * 找出数组中只出现一次的数字,其它数字都出现三次
  8. *
  9. * @param nums 数字
  10. * @return 只出现一次的数字
  11. */
  12. public int findNumberAppearingOnce(int[] nums) {
  13. if (nums == null || nums.length == 0) {
  14. return 0;
  15. }
  16. int[] bits = new int[32];
  17. int n = nums.length;
  18. for (int i = 0; i < n; ++i) {
  19. int val = nums[i];
  20. for (int j = 0; j < 32; ++j) {
  21. bits[j] += (val & 1);
  22. val = val >> 1;
  23. }
  24. }
  25. int res = 0;
  26. for (int i = 0; i < 32; ++i) {
  27. if (bits[i] % 3 != 0) {
  28. res += Math.pow(2, i);
  29. }
  30. }
  31. return res;
  32. }
  33. }

测试用例

  1. 功能测试(唯一只出现一次的数字分别是 0、正数、负数;重复出现三次的数字分别是 0、正数、负数)。

该分类下的相关小册推荐: