码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCodeOJ 137. Single Number II 一题三解

时间:2016-07-31 15:58:03      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

    原题链接:https://leetcode.com/problems/single-number-ii/

    题目如下:

137. Single Number II

 
 My Submissions
  • Total Accepted: 91049
  • Total Submissions: 235598
  • Difficulty: Medium

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中解法

  1. 位操作。取所有元素的某一位上的和,对3取模,余数便是目标元素在该位的值。
  2. 用map。重复元素第二次塞进map时,value置为Long的最大值。第三次塞入的时候把这个entry删掉。最后只剩一个元素便是目标元素了。
  3. 排序。找只重复的那个。
    给出我的AC代码:
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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!