题目一 数组中只出现一次的数字

题目

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字

题解

  • 异或。
  • 先考虑:数组中只有一个数字只出现了一次,其他数字都出现了两次,怎么找出这个数字?全部异或,结果即为所求数字。
  • 那么,原问题可以将原数组分成两个集合,两个集合都满足上面的题目,则可求出两个出现一次的数字,那么分组方法?分组:将所有数都做异或,一定至少有一位是1,因为存在两个不相同数字。先找出这一位,然后按这一位是0/1分为两组,两组自然就满足了上面的要求,可求的结果。
  • 综上,步骤一:分组,步骤二:全部异或求得数字。

相关

  • 异或运算可初始化为0,因为0与任何数异或都是它本身。
  • 找到最后一个1:num&(~num+1)

代码

public class Main {
public static void main(String[] args) {
int[] arr= {2,4,3,6,3,2,5,5};
int[] num1=new int[1];
int[] num2=new int[1];
FindNumsAppearOnce(arr,num1,num2);
System.out.println(num1[0]);
System.out.println(num2[0]);
} //num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public static void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
if(array==null||array.length<2) {
return;
} //所有数异或
int xorResult=0;
for(int i=0;i<array.length;++i) {
xorResult^=array[i];
} //找到(最后一个)为1的位
int bitPos=findFirstOnePos(xorResult); num1[0]=0;
num2[0]=0;
for(int i=0;i<array.length;++i) {
if((array[i]&bitPos)==0) {//bitPos位为0的分为一组
num1[0]^=array[i];//该组内所有数异或,结果即为第一个出现一次的数
}
else {//bitPos为1的分为一组
num2[0]^=array[i];//该组内所有数异或,结果即为第二个出现一次的数
}
}
} //获得二进制最后一个1的位置
private static int findFirstOnePos(int num) {
return num&(~num+1);
}
}

题目二 数组中唯一只出现一次的数字

题目

一个数组中,一个数字只出现一次,其他数字都出现三次,找出只出现一次的数字

题解

  • 用一个32位数组,记录每个数对应位相加的和,每位%3的结果得到的数字就是所求数字。

    时间复杂度O(n),空间复杂度O(1).

  • 其他解法:排序,再找,时间复杂度O(nlogn);或者哈希表,空间复杂度O(n).

相关

涉及到了知道哪些位是1,通过位移和与运算得到最终的数。

代码

public class Main {
public static void main(String[] args) {
int[] arr= {1,2,3,3,2,1,4,1,2,3};
System.out.println(occurOnce(arr));
} public static int occurOnce(int[] nums) {
int[] bitSum=new int[32];
for(int i=0;i<nums.length;++i) {
int bitMask=1;
for(int j=0;j<31;++j) {
if((nums[i]&bitMask)!=0) {
++bitSum[j];
}
bitMask<<=1;
}
} int ans=0;
for(int i=31;i>=0;--i) {//高位移的多,按从高到低位遍历
ans<<=1;
ans+=bitSum[i]%3;
}
return ans;
}
}

[剑指Offer]56-数组中数字出现的次数(位运算)的更多相关文章

  1. 【位运算】剑指offer 56. 数组中数字出现的次数

    这是一系列位运算的题目,本文将由浅入深,先从最简单的问题开始: 问题1: 一个数组中只有一个数字出现过1次,其余数字都出现过两次,请找到那个只出现1次的数字.要求时间复杂度是 \(O(n)\),空间复 ...

  2. 剑指offer——62数组种数字出现的次数

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题解: 我们想到异或运算的一个性质:任何一个数字异或它自己都等于0.也就是说,如果我们从头到尾依 ...

  3. 剑指Offer:数组中出现次数超过一半的数字【39】

    剑指Offer:数组中出现次数超过一半的数字[39] 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于这 ...

  4. 《剑指offer》数组中只出现一次的数字

    本题来自<剑指offer> 数组中只出现一次的数字 题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 思路一:在<剑指of ...

  5. 剑指 Offer 39. 数组中出现次数超过一半的数字 + 摩尔投票法

    剑指 Offer 39. 数组中出现次数超过一半的数字 Offer_39 题目描述 方法一:使用map存储数字出现的次数 public class Offer_39 { public int majo ...

  6. 剑指 Offer 03. 数组中重复的数字

    剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知 ...

  7. 菜鸟刷题路:剑指 Offer 03. 数组中重复的数字

    剑指 Offer 03. 数组中重复的数字 哈希表/set class Solution { public int findRepeatNumber(int[] nums) { HashSet< ...

  8. 剑指 Offer 39. 数组中出现次数超过一半的数字

    剑指 Offer 39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [ ...

  9. 5.1 剑指 Offer 03. 数组中重复的数字

    类型题:剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字.在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了, ...

随机推荐

  1. Redis设计与实现——数据结构与对象

    SDS 简单动态字符串 在redis数据库里面,包含字符串值得键值对在底层都是由SDS实现的. redis >  set msg "hello world" 1)键值对的键是 ...

  2. CODING DevOps 微服务项目实战系列最后一课,周四开讲!

    随着软件工程越来越复杂化,如何在 Kubernetes 集群进行灰度发布成为了生产部署的"必修课",而如何实现安全可控.自动化的灰度发布也成为了持续部署重点关注的问题.CODING ...

  3. 第2章 执行SparkSQL查询

    第2章 执行SparkSQL查询 2.1 命令行查询流程 打开Spark shell 例子:查询大于30岁的用户 创建如下JSON文件,注意JSON的格式: {"name":&qu ...

  4. Linux调用Kaggle API下载数据

    1. 登录Kaggle账户,点击My Account 2. Create New API Token得到kaggle.json 3. pip install kaggle 4. 执行kaggle会报错 ...

  5. Java 8新的时间日期库,这二十个案例看完你还学不会算我的!!!

    Java对日期,日历及时间的处理一直以来都饱受诟病,尤其是它决定将java.util.Date定义为可修改的以及将SimpleDateFormat实现成非线程安全的.看来Java已经意识到需要为时间及 ...

  6. 5分钟快速学会xpath定位

    今天我们先来和大家说一下appium,首先教大家如何定位xpath,五分钟即可学会:例:现在我想定位下面这个登录按钮: xpath该怎么写呢? 先不管三七二十几,先写//,然后找你要定位元素最近的可以 ...

  7. 23种设计模式 - 接口隔离(Facade - Proxy - Mediator - Adapter)

    其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 接口隔离 在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题.甚至根本无法实现.采用添加一层间接( ...

  8. CRMEB单商户商城系统v4.0源码,含前端uni-app源码

    CRMEB商城系统是基于ThinkPhp6.0+Vue开发的一套新零售移动电商系统,CRMEB系统就是集客户关系管理+营销电商系统,能够快速积累客户.会员数据分析.智能转化客户. 有效提高销售.会员维 ...

  9. facebookPixel代码安装详解

    最近接到一个需求,优化独立站的facebookPixel代码,完成后对这个项目进行复盘.首先要介绍facebookPixel的理论知识. Facebook像素是一段JavaScript代码,其中加载了 ...

  10. C#显示百度地图API

    http://dev.baidu.com/wiki/static/map/API/examples/?v=1.3&2_0#2&0 太原市的经纬度:112.596, 37.884 北京市 ...