题目描述

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

[牛客网刷题地址]无

思路分析

  如果一个数字出现三次,那么它的二进制表示的每一位(0或者1)也出现三次。如果把所有出现三次的数字的二进制表示的每一位都分别加起来,那么每一位的和都能被3整除。我们把数组中所有数字的二进制表示的每一位都加起来。如果某一位的和能被3整除,那么那个只出现一次的数字二进制表示中对应的那一位是0;否则就是1。

测试用例

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

Java代码

public class Offer056_02 {
public static void main(String[] args) {
test1();
test2();
test3(); } public static int findNumberAppearingOnce(int[] array) {
return Solution1(array);
} private static int Solution1(int[] array) {
if(array==null || array.length<=0) {
return -1;
} int[] bitSum = new int[32];
for(int i=0;i<array.length;i++) {
int bitMask = 1;
for(int j=31;j>=0;j--) {//将每个数字的每一位存储到bitSum中,并且对应的位相加
int bit = array[i] & bitMask;
if(bit!=0) {
bitSum[j]+=1;
}
bitMask = bitMask<<1;
}
} int result =0;
for(int i=0;i<32;i++) {
result = result<<1;
result += bitSum[i]%3;
} return result;
} private static void test1() {
int[] array = {1,1,1,4,5,4,4,2,2,2};
System.out.println(findNumberAppearingOnce(array));
} private static void test2() { }
private static void test3() { } }

代码链接

剑指Offer代码-Java

最新文章

  1. jQuery文件上传插件Uploadify(转)
  2. app后端设计(12)--图片的处理
  3. JS编写全选,复选按钮
  4. Android 短信的还原
  5. code blocks 如何实现一键代码格式化
  6. Microsoft JET Database Engine (0x80004005)
  7. toggleClass
  8. WINDOWS BITLOCK
  9. maven项目部署到Repository(Nexus)
  10. JavaScript动态加载资源【js|css】示例代码
  11. cygwin安装gcc/g++
  12. 【转载】tomcat+nginx+redis实现均衡负载、session共享(二)
  13. 动态规划-数位DPwindy
  14. 示例, linq分组
  15. java实现随机四则运算
  16. Alpha阶段敏捷冲刺(七)
  17. SQL ser 进行表中的插入操作时,变量字段名,导致报错时解决办法 :动态SQL
  18. 用原生JS实现多张图片上传及预览功能(兼容IE8)
  19. MySql--学习成长过程
  20. springcloud10---feign-with-hystrix_factory

热门文章

  1. JavaScript数据结构——链表的实现与应用
  2. Jmeter 接口测试参数处理
  3. [nghttp2]压测工具,源码编译并进行deb打包过程
  4. kubeadm源码分析
  5. LR有的JMeter也有之三“集合点”
  6. [转载]MongoDB管理基础
  7. 一段代码分清global和nonlocal
  8. Docker入门-docker compose的使用
  9. 40道经典java多线程面试题
  10. Flutter学习笔记(21)--TextField文本框组件和Card卡片组件