标签:
原题链接:https://leetcode.com/problems/single-number-ii/
题目如下:
Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
给出一个数组,除了一个元素出现了一次,其余元素均出现了3次。找出这个元素。
给出3中解法
package bit.manipulation;
import java.util.*;
/**
* project : LeetCodeOJ
* package : bit.manipulation
* author : lvsheng
* date : 16/7/31 下午2:28
*/
public class SingleNumber2 {
public static void main(String[] args) {
int[] arr = {-1, 5, 5, 5, 7, 7, 7, 90, 90, 90};
int[] arr2 = {7};
int[] arr3 = {0, 0, 0, 5};
System.out.println(singleNumber(arr));
System.out.println(singleNumber(arr2));
System.out.println(singleNumber(arr3));
System.out.println(singleNumber2(arr));
System.out.println(singleNumber2(arr2));
System.out.println(singleNumber2(arr3));
System.out.println(singleNumber3(arr));
System.out.println(singleNumber3(arr2));
System.out.println(singleNumber3(arr3));
}
public static int singleNumber(int[] nums) {
// if(nums.length == 1) return nums[0];
int result = 0;
for (int i = 0; i < 32; i++) {
int cnt = 0;
int bit = 1 << i;
for (int num : nums) {
if ((num & bit) != 0) {
cnt++;
}
}
cnt %= 3;
if (cnt == 1) result |= bit;
}
return result;
}
public static int singleNumber2(int[] nums) {
Map<Integer, Long> map = new HashMap<>(nums.length);
for (int n : nums) {
if (map.get(n) != null) {
Long val = map.get(n);
if (val == Long.MAX_VALUE) map.remove(n);
else map.put(n, Long.MAX_VALUE);
} else map.put(n, (long) n);
}
List<Integer> list = new ArrayList<>(map.keySet());
return list.get(0);
}
public static int singleNumber3(int[] nums) {
if (nums.length == 1) return nums[0];
Arrays.sort(nums);
int result = nums[0];
int cnt = 1;
for (int i = 1; i < nums.length; i++) {
if (nums[i] == result) cnt++;
else {
if (cnt == 3) {
result = nums[i];
cnt = 1;
} else {
break;
}
}
}
return result;
}
}
LeetCodeOJ 137. Single Number II 一题三解
标签:
原文地址:http://blog.csdn.net/bruce128/article/details/52078925