微软面试100题-61(找出数组中两个只出现一次的数字)
来源:互联网 发布:阳光一百置业 知乎 编辑:程序博客网 时间:2024/05/20 07:59
61.找出数组中两个只出现一次的数字(数组)
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。
请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
分析:这是一道很新颖的关于位运算的面试题。
package com.interview.algorithm;/* * 一个数和自己xor,返回0。1^1=0 0^0=0 1^0 = 1 0^1 = 1 */public class OnceChar {public int AllXor(char[] c){int all = 0;for(int i = 0; i < c.length; i++){all = all^c[i];}return all;}//返回倒数几位public int getFirstOne(int num){int pos = 1;while((num & 0x01) == 0){num = num >> 1;pos++;}return pos;}public char[] getOnceChar(char[] c){int xor = this.AllXor(c);int firstOne = this.getFirstOne(xor);char[] res = new char[2];int num1 = 0; int num2 = 0;for(int i = 0; i < c.length; i++){if(this.isOne(firstOne, c[i]) == 0){num1 = num1 ^ c[i];}else{num2 = num2 ^ c[i];}}res[0] = (char)num1;res[1] = (char)num2;return res;}//如果最后一位是1,不用移位public int isOne(int pos, char c){int i = c >> (pos - 1);int isOne = i & 0x01;return isOne;}public static void main(String[] args) {// TODO Auto-generated method stubString str = "AABBCDDEFF";OnceChar once = new OnceChar();char[] res = once.getOnceChar(str.toCharArray());System.out.println(res[0]);System.out.println(res[1]);}}
0 0
- 微软面试100题-61(找出数组中两个只出现一次的数字)
- 找出数组中两个只出现一次的数字 【微软面试100题 第六十一题】
- 微软100题(61)找出数组中两个只出现一次的数字
- 微软面试之34 找出数组中两个只出现一次的数字 与 找出数组中一个只出现一次的数字
- 程序员面试100题之34找出数组中两个只出现一次的数字
- [面试] 找出数组中两个只出现一次的数字找出这两个只出现一次的数字
- 61 找出数组中两个只出现一次的数字
- 程序员面试100题(算法)之找出数组中两个只出现一次的数字(位运算实现)
- 找出数组中两个只出现一次的数字
- 找出数组中两个只出现一次的数字--总结
- 找出数组中两个只出现一次的数字
- 找出数组中两个只出现一次的数字
- 找出数组中两个只出现一次的数字
- 找出数组中两个只出现一次的数字
- 找出数组中两个只出现一次的数字
- 找出数组中两个只出现一次的数字
- 找出数组中两个只出现一次的数字
- 找出数组中两个只出现一次的数字
- Android 高亮 TextView
- FFmpeg深入分析之零-基础
- Android绘图机制与处理技巧
- Spark 基础拾遗
- hdu-1890 Robotic Sort
- 微软面试100题-61(找出数组中两个只出现一次的数字)
- 从无到有写一个C#弹球小游戏(一)
- 递归遍历文件夹下的所有文件
- 远程调用技术代码追踪之(RemObjects) 末完待续
- Qt容器类
- 327. Count of Range Sum
- Spark-继续RDD
- iOS 即时视频和聊天(基于环信)
- Java把文件压缩成zip文件