微软面试100题-61(找出数组中两个只出现一次的数字)
2016-04-21 22:40
239 查看
61.找出数组中两个只出现一次的数字(数组)
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。
请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
分析:这是一道很新颖的关于位运算的面试题。
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 stub String str = "AABBCDDEFF"; OnceChar once = new OnceChar(); char[] res = once.getOnceChar(str.toCharArray()); System.out.println(res[0]); System.out.println(res[1]); } }
相关文章推荐
- Java多线程面试问题
- 清除行列之程序员面试经典
- 像素翻转之程序员面试经典
- 基本字符串压缩之程序员面试经典
- 程序员修炼之道读后感
- lintcode删除排序数组中的重复数字 II
- lintcode之数组划分
- 剑指offer之面试题14:调整数组顺序使奇数位于偶数前面
- 面试真题——匿名内部类
- 微软面试100题-60
- 微软面试100题-58从尾到头输出链表
- 微软面试100题-57 (用俩个栈实现队列)
- 腾讯测试实习生面试心得
- 面试问题
- 霍兰德- 职业兴趣测评
- 微软面试100题 - 56LCS
- 矩阵--原地转置--面试题
- 剑指offer之面试题13:在O(1)时间删除链表节点
- 二叉树的简单实现及其部分面试题
- 2015软件工程(大一下)职业规划第四次作业