【问题描述】[中等]
在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
示例 1:
输入:nums = [3,4,3,3]
输出:4
示例 2:
输入:nums = [9,1,7,9,7,9,7]
输出:1
限制:
1 <= nums.length <= 10000
1 <= nums[i] < 2^31
【解答思路】
1. HashMap
时间复杂度:O(N) 空间复杂度:O(1)
public int singleNumber(int[] nums) {
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
for (int n : nums) {
if (map.containsKey(n)) {
map.put(n,map.get(n)+1);
} else {
map.put(n,1);
}
}
int i = 0;
// for(int n : map.keySet()) {
// if(map.get(n)==1)
// return n;
// }
for(Map.Entry<Integer,Integer> d:map.entrySet()){
if(d.getValue()==1)
return d.getKey();
}
return -1;
}
二三解题思路
2. 有限状态自动机
时间复杂度:O(N) 空间复杂度:O(1)
class Solution {
public int singleNumber(int[] nums) {
int ones = 0, twos = 0;
for(int num : nums){
ones = ones ^ num & ~twos;
twos = twos ^ num & ~ones;
}
return ones;
}
}
3. 遍历统计
时间复杂度:O(N) 空间复杂度:O(1)
class Solution {
public int singleNumber(int[] nums) {
int[] counts = new int[32];
for(int num : nums) {
for(int j = 0; j < 32; j++) {
counts[j] += num & 1;
num >>>= 1;
}
}
int res = 0, m = 3;
for(int i = 0; i < 32; i++) {
res <<= 1;
res |= counts[31 - i] % m;
}
return res;
}
}
【总结】
1.遍历 HashMap 四种方法
public static void main(String[] args) {
Map<String,String> map=new HashMap<String,String>();
map.put("1", "value1");
map.put("2", "value2");
map.put("3", "value3");
map.put("4", "value4");
//第一种:普通使用,二次取值(性能差)
System.out.println("\n通过Map.keySet遍历key和value:");
for(String key:map.keySet())
{
System.out.println("Key: "+key+" Value: "+map.get(key));
}
//第二种(性能比第一种好,一次取值)
System.out.println("\n通过Map.entrySet使用iterator遍历key和value: ");
Iterator map1it=map.entrySet().iterator();
while(map1it.hasNext())
{
Map.Entry<String, String> entry=(Entry<String, String>) map1it.next();
System.out.println("Key: "+entry.getKey()+" Value: "+entry.getValue());
}
//第三种:推荐,尤其是容量大时
System.out.println("\n通过Map.entrySet遍历key和value");
for(Map.Entry<String, String> entry: map.entrySet())
{
System.out.println("Key: "+ entry.getKey()+ " Value: "+entry.getValue());
}
//第四种
System.out.println("\n通过Map.values()遍历所有的value,但不能遍历key");
for(String v:map.values())
{
System.out.println("The value is "+v);
}
}
2.状态机 数电 设计逻辑电路的状态转换图
3.个人认为掌握方法一 HashMap和 方法三 统计遍历 足够了 ,有数电或对状态机感兴趣的可以使用方法二
位运算 判相等异或^ 取位与&1 置位或|1
转载链接:https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof/solution/mian-shi-ti-56-ii-shu-zu-zhong-shu-zi-chu-xian-d-4/