剑指offer第40题

 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 }
时间: 2024-07-28 15:37:18

剑指offer第40题的相关文章

剑指offer第40题 数组中只出现一次的数字

#include<iostream> using namespace std; bool iswei1(int data,int wei) { int i=8*sizeof(int); data=data>>(i-wei); return(data&1); } void number1(int *list,int length,int *num1,int *num2) { int data=0; for(int i=0;i<length;i++) { data=dat

《剑指offer》刷题目录

<剑指offer>刷题目录 面试题03. 数组中重复的数字 面试题04. 二维数组中的查找 面试题05. 替换空格 面试题06. 从尾到头打印链表 面试题07. 重建二叉树 原文地址:https://www.cnblogs.com/qujingtongxiao/p/12652970.html

剑指Offer系列之题11~题15

目录 11.矩形覆盖 12.二进制中1的个数 13. 数值的整数次方 14.调整数组顺序使奇数位于偶数前面 15.链表中倒数第k个结点 11.矩形覆盖 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 比如n=3时,2*3的矩形块有3种覆盖方法: 斐波那契数列的应用 第一次竖着放一块类比为走一步,第一次横着放两块类比为走两步 代码与上面的斐波那契数列类题目类似,此处不再赘述:剑指Offer系列之题6~题10. 12.

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

在<剑指Offer>中,在栈和队列习题中,作者留下来一道题目供读者自己实现,即"用两个队列实现一个栈". 在计算机数据结构中,栈的特点是后进先出,即最后被压入(push)栈的元素会第一个被弹出(pop);队列的特点是先进先出,即第一个进入队列的元素将会被第一个弹出来.虽然栈和队列特点是针锋相对,但是两者却相互联系,可以互相转换. 在"用两个队列实现一个栈"问题中,我们用两个队列的压入和弹出来模拟栈的压入和弹出.我们通过画图的手段把抽象的问题形象化. 在上

浅谈《剑指offer》原题:求1+2+……+n

<剑指offer>上的一道原题,求1+2+--+n,要求不能使用乘除法,for.while.if.else.switch.case等关键字以及条件判断语句(a?b:c). 第一次看到这道题大约有一年的时间了,在霸笔网易的时候,当时我就晕了...心想这是神马东西,后来发现这是原题!!然后后悔自己没看过书了... <剑指offer>上给出了不错的解法,但是这里有个解法更巧妙,虽然技术含量不高,但是可以参考,这就是<程序员面试笔试宝典>中所给出的答案. 解法一:利用宏定义求解

剑指offer 面试14题

面试14题: 题目:剪绳子 题:给你一根长度为n的绳子,请把绳子剪成m段(m,n都是整数,且n>1,m>1),每段绳子的长度记为k[0],k[1],k[2],...,k[m].请问k[0]*k[1]*...*k[m]可能的最大乘积是多少?例如,当绳子的长度为8时,我们把它剪成长度分别为2,3,3的三段,此时得到的最大乘积为18. 解题思路:基于动态规划和贪婪算法,详见剑指offer P96 解题代码: # -*- coding:utf-8 -*- class Solution: def Max

剑指offer 面试26题

面试26题: 题目:树的子结构 题:输入两棵二叉树A和B,判断B是不是A的子结构. 解题思路:递归,注意空指针的情况. 解题代码: # -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def HasSubtree(self, pRoot1, pRoot2): # write co

剑指offer 面试29题

面试29题: 题目:顺时针打印矩阵(同LeetCode 螺旋矩阵打印) 题:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 解题方法一:详见剑指offer 解题代码: # -*- coding:utf-8 -*- class Solution: # matrix类型为二维列表,需要返回

《剑指offer》算法题第三天

今日题目: 斐波那契数列 青蛙跳台阶问题(及其变种:变态跳台阶) 矩形覆盖 旋转数组的最小数字 矩阵中的路径 机器人的运动范围 细心的同学会发现,第1,2,3题其实对应的是<剑指>书上的同一道题目,即第10题斐波那契数列,这类问题属于递归问题,虽然思路比较简单,但却是属于那种不看答案想不出来,看了答案恍然大悟的题目,因此在平时同学们和博主都应该多练练这一类型的题目,培养这种递归的思维.有趣的是,博主在做题的时候发现这三道题目是可以用动态规划的思路来解决的,而且往往动态规划的所用的时间是要低于递