day34 JZ56 数组中只出现一次的两个数字(Java)

99 阅读1分钟

题目来源: JZ56 数组中只出现一次的两个数字

题目描述:

  • 描述: 一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 数据范围: 数组长度2≤n≤1000,数组中每个数的大小0<val≤1000000 要求: 空间复杂度O(1),时间复杂度O(n)
示例1:
输入:[1,4,1,6]
返回值:[4,6]
说明:返回的结果中较小的数排在前面 

示例2:
输入:[1,2,3,3,2,9]
输出:[1,9]

思路:哈希表

  • 知识点:哈希表 思路:
    • 题目中要求找出出现一次的数字,那么这又是需要统计数组中元素出现的次数
    • 对于统计出现的次数,我们轻车熟路,直接使用哈希表进行辅助操作
  • 具体做法:
    • 1.对所给的数组进行遍历,将元素放入哈希表,如果元素是第一次出现,那么将元素存入key值,并将value+1,如果哈希表中已经有对应的元素,直接进行value+1的操作
    • 2.对数组进行第二次遍历,并检查哈希表中对应key值的value的大小,找到value=1的两个数字
    • 3.将找到的两个数字进行有序输出,因为题目要求返回结果中较小的数排在前面

具体实现:

import java.util.*;
public class Solution {
    public int[] FindNumsAppearOnce (int[] array) {
        HashMap<Integer, Integer> mp = new HashMap<Integer, Integer>(); 
        ArrayList<Integer> res = new ArrayList<Integer>();
        //遍历数组
        for(int i = 0; i < array.length; i++) 
            //统计每个数出现的频率
            if(!mp.containsKey(array[i]))
                mp.put(array[i], 1);
            else
                mp.put(array[i], mp.get(array[i]) + 1);
        //再次遍历数组
        for(int i = 0; i < array.length; i++) 
            //找到频率为1的两个数
            if(mp.get(array[i]) == 1) 
                res.add(array[i]);
        //整理次序
        if(res.get(0) < res.get(1)) 
            return new int[] {res.get(0), res.get(1)};
        else
            return new int[] {res.get(1), res.get(0)};
    }
}

复杂度分析:

  • 时间复杂度:O(n),其中n为数组长度,两次单独的遍历数组每个元素
  • 空间复杂度:O(n),哈希表的长度应该为(n−2)/2

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情