1. package com.yan.offer;
  2.  
  3. /**
  4. * 题目描述:
  5. *
  6. * 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
  7. *
  8. * @author Yan
  9. *
  10. */
  11. public class ArrayFindSingleNum {
  12.  
  13. public ArrayFindSingleNum() {
  14. }
  15.  
  16. private static int[] arr = new int[] { 2, 4, 3, 6, 3, 2, 5, 5 };
  17.  
  18. public static void main(String[] args) {
  19. ArrayFindSingleNum arrayFindNum = new ArrayFindSingleNum();
  20. int[] num1 = new int[1];
  21. int[] num2 = new int[1];
  22. arrayFindNum.findNumsAppearOnce(arr, num1, num2);
  23. System.out.println(num1[0] + " " + num2[0]);
  24. }
  25.  
  26. // num1,num2分别为长度为1的数组。传出参数
  27. // 将num1[0],num2[0]设置为返回结果
  28. public void findNumsAppearOnce(int[] array, int[] num1, int[] num2) {
  29. if (array == null || array.length == 0 || array.length == 1) {
  30. return;
  31. }
  32. int sum = 0;
  33. // 将数组中所有元素进行异或。
  34. for (int i = 0; i < array.length; i++) {
  35. sum ^= array[i];
  36. }
  37. int temp = sum;
  38. int flag = 1;
  39. // 判断异或结果中低位起第一个为1的位,即为flag为1的位。
  40. while (true) {
  41. if ((temp & flag) != 0) {
  42. break;
  43. } else {
  44. flag = flag << 1;
  45. }
  46. }
  47. int sum1 = 0;
  48. int sum2 = 0;
  49. // 利用为1的位将数组中的元素分为两部分,一部分为该位为0的元素,另一部分为该位为1的元素。
  50. // 因为不相同的两个数的异或值中该位为1,所以这两个数该位是不同的,所以这两个数就被分到了两个不同的部分。
  51. // 因此,分别将每一部分进行全部异或,最终得到的结果分别为两个不相同的数。
  52. for (int i = 0; i < array.length; i++) {
  53. if ((array[i] & flag) != 0) {
  54. sum1 ^= array[i];
  55. } else {
  56. sum2 ^= array[i];
  57. }
  58. }
  59. num1[0] = sum1;
  60. num2[0] = sum2;
  61.  
  62. }
  63.  
  64. }

剑指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. Metasploit学习笔记——Web应用渗透技术

    1.命令注入实例分析 对定V公司网站博客系统扫描可以发现,它们安装了zingiri-web-shop这个含有命令注入漏洞的插件,到www.exploit-db.com搜索,可以看到2011.11.13 ...

  2. vue的自定义

    自定义组件 组件是可以被复用的页面的零件,其实就是一个插件,只是在vue里叫组件 先看看别人的组件 vant element Mint iView 去试试上面的组件,都是有脚手架版和直接引入使用的版本 ...

  3. Jdk8中Stream流的使用,让你脱离for循环

    学习要求: 知道一点儿函数式接口和Lambda表达式的基础知识,有利于更好的学习. 1.先体验一下Stream的好处 需求:给你一个ArrayList用来保存学生的成绩,让你打印出其中大于60的成绩. ...

  4. Git 的 4 个阶段的撤销更改

    虽然git诞生距今已有12年之久,网上各种关于git的介绍文章数不胜数,但是依然有很多人(包括我自己在内)对于它的功能不能完全掌握.以下的介绍只是基于我个人对于git的理解,并且可能生编硬造了一些不完 ...

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

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

  6. django 中从外界借助多个网站时 static 的存放和整理

    在 模板之家中  前端页面直接上去抓取  可是遇到重复  或者 版本不统一  所以 在每个app下面建立自己的 stastic 在制作的html  页面上方 导入静态页面 {% load static ...

  7. tomcat启动报错The JRE could not be found.Edit the server and change the JRE location

    解决: 在Windows->Preferences->Server->Runtime Environments 选择Tomcat->Edit,在jre中选择相应的jdk版本,完 ...

  8. Centos7安装rabbitMQ3.6.0

    文章中的erlang和rabbitmq3.6.0 http://pan.baidu.com/s/1c2Nn64w ​ Centos7 系统操作 cd /etc/yum.repos.d/ mv Cent ...

  9. [NOIP2017] T4 跳房子 DP+二分

    Description 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一.跳房子的游戏规则如下:  在地面上确定一个起点,然后在起点右侧画 n 个格子,这些格子都在同一条直线 ...

  10. qvector 转为数组

    在 qt 中想要把 qvector 转化为原始数据构成的数组,有几种方法: 直接使用循环读取 double *bytes = new double[vec.size()]; for (int i = ...