【数组】【打卡95天】《剑指Offer》2刷:JZ56 数组中只出现一次的两个数字

1、题目描述

一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

数据范围:数组长度 2\le n \le 10002≤n≤1000,数组中每个数的大小 0 < val \le 10000000<val≤1000000
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)

2、算法分析

首先题目中要求的是两个只出现一次的数字,输出时按非降序输出,也就是正序输出。

首先对数组进行排序。

使用Map函数,注意,实现类是LinkedHashMap是有序的。

key存储的是数组中的值,value存储的是这个数值出现的次数。

遍历,最后判断value为1的,然后存储到大小为2的数组中。

3、代码实现

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型一维数组 
     * @return int整型一维数组
     */
    public int[] FindNumsAppearOnce (int[] array) {
        Map<Integer,Integer> map = new LinkedHashMap<>();
        Arrays.sort(array);
        // 求出现次数
        for(int i=0;i<array.length;i++){
            if(map.containsKey(array[i])){
                map.put(array[i],2);
            }else{
                map.put(array[i],1);
            }
        }
        int[] r = new int[2];
        int j = 0;
        // 将出现为1 的value对应的key存储到数组中。
        for(int a : map.keySet()){
            if(map.get(a) == 1){
                r[j] = a;
                j++;
            }
        }
        return r;
    }
}

Guess you like

Origin blog.csdn.net/Sunshineoe/article/details/121447375