package com.yan.offer;

 /**
* 题目描述:
*
* 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
*
* @author Yan
*
*/
public class ArrayFindSingleNum { public ArrayFindSingleNum() {
} private static int[] arr = new int[] { 2, 4, 3, 6, 3, 2, 5, 5 }; public static void main(String[] args) {
ArrayFindSingleNum arrayFindNum = new ArrayFindSingleNum();
int[] num1 = new int[1];
int[] num2 = new int[1];
arrayFindNum.findNumsAppearOnce(arr, num1, num2);
System.out.println(num1[0] + " " + num2[0]);
} // num1,num2分别为长度为1的数组。传出参数
// 将num1[0],num2[0]设置为返回结果
public void findNumsAppearOnce(int[] array, int[] num1, int[] num2) {
if (array == null || array.length == 0 || array.length == 1) {
return;
}
int sum = 0;
// 将数组中所有元素进行异或。
for (int i = 0; i < array.length; i++) {
sum ^= array[i];
}
int temp = sum;
int flag = 1;
// 判断异或结果中低位起第一个为1的位,即为flag为1的位。
while (true) {
if ((temp & flag) != 0) {
break;
} else {
flag = flag << 1;
}
}
int sum1 = 0;
int sum2 = 0;
// 利用为1的位将数组中的元素分为两部分,一部分为该位为0的元素,另一部分为该位为1的元素。
// 因为不相同的两个数的异或值中该位为1,所以这两个数该位是不同的,所以这两个数就被分到了两个不同的部分。
// 因此,分别将每一部分进行全部异或,最终得到的结果分别为两个不相同的数。
for (int i = 0; i < array.length; i++) {
if ((array[i] & flag) != 0) {
sum1 ^= array[i];
} else {
sum2 ^= array[i];
}
}
num1[0] = sum1;
num2[0] = sum2; } }

剑指offer第40题的更多相关文章

  1. 剑指offer 面试40题

    面试40题: 题目:最小的k个数 题:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解题代码一: # -*- coding ...

  2. 《剑指offer》刷题目录

    <剑指offer>刷题目录 面试题03. 数组中重复的数字 面试题04. 二维数组中的查找 面试题05. 替换空格 面试题06. 从尾到头打印链表 面试题07. 重建二叉树 面试题09. ...

  3. 浅谈《剑指offer》原题:不使用条件、循环语句求1+2+……+n

    转载自:浅谈<剑指offer>原题:求1+2+--+n 如侵犯您的版权,请联系:windeal12@qq.com <剑指offer>上的一道原题,求1+2+--+n,要求不能使 ...

  4. 《剑指offer》算法题第十二天

    今天是<剑指offer>算法题系列的最后一天了,但是这个系列并没有包括书上的所有题目,因为正如第一天所说,这些代码是在牛客网上写并且测试的,但是牛客网上并没有涵盖书上所有的题目. 今日题目 ...

  5. 剑指offer部分编程题

    一 斐波那契数列 题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 问题分析: 可以肯定的是这一题通过递归的方式是肯定能做出来,但是这样会有 ...

  6. 《剑指offer》刷题笔记

    简介 此笔记为我在 leetcode 上的<剑指offer>专题刷题时的笔记整理. 在刷题时我尝试了 leetcode 上热门题解中的多种方法,这些不同方法的实现都列在了笔记中. leet ...

  7. 《剑指Offer》附加题_用两个队列实现一个栈_C++版

    在<剑指Offer>中,在栈和队列习题中,作者留下来一道题目供读者自己实现,即"用两个队列实现一个栈". 在计算机数据结构中,栈的特点是后进先出,即最后被压入(push ...

  8. 剑指offer 面试5题

    面试5题: 题目:请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 方法一: # -*- co ...

  9. 剑指offer 面试8题

    面试8题: 题目:二叉树的下一个节点 题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 解题思路:详见剑 ...

随机推荐

  1. Vue - 项目配置 ( element , 安装路由 , 创建路由 )

    1,安装element     :      vue add element 2,安装路由          :     vue add router 3,创建路由的过程  :   (1) 新建 vu ...

  2. CSS - 设置placeholder样式

    input::placeholder {         font-size: 12px;         font-family: Arial;         letter-spacing: 5p ...

  3. js generator的两个实际应用

    generator作为一个用来操作异步的状态机, 遇到yield停止, 通过调用next()来继续操作.  今天就用generator来举例两个实际开发中的应用. 1,抽奖 function draw ...

  4. bzoj 1962: 模型王子

    呵呵呵呵http://wenku.baidu.com/link?url=o0CPVzuBDLJMt0_7Qph1T7TtdFOzu7O-apIpvaWbIYMz8ZWqBneGqI8LGtLdqpuK ...

  5. Redis哨兵机制原理

    1.概述 Redis Sentinel是一个分布式系统,为Redis提供高可用性解决方案.可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip p ...

  6. 用 Python 分析网易严选 Bra 销售信息,告诉你她们真实的 Size

    今天通过爬虫数据进行分析,一起来看看网易严选商品评论的获取和分析. 声明:这是一篇超级严肃的技术文章,请本着学习交流的态度阅读,谢谢! !   ​ 网易商品评论爬取 分析网页 评论分析 进入到网易严选 ...

  7. java调用存储过程(stored procedures)的HelloWorld例子

    1.java调用存储过程(stored procedures)的HelloWorld程序 有点数据 库基础的人都知道.存储过程(stored procedures)和java没什么关系.它是一段纯粹的 ...

  8. 002、将mysql用作一个简单的计算器

    SELECT PI( ), , ( ) ; 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477247)哦,谢谢.

  9. Python MySQL Order By

    章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ...

  10. Docker 容器shell

    版权所有,未经许可,禁止转载 章节 Docker 介绍 Docker 和虚拟机的区别 Docker 安装 Docker Hub Docker 镜像(image) Docker 容器(container ...