描述

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

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

提示:输出时按非降序排列。

示例
// 输入:
[1,4,1,6]
// 返回值:
[4,6]
// 说明:返回的结果中较小的数排在前面

// 输入:
[1,2,3,3,2,9]
// 返回值:
[1,9]
解题思路

哈希法:

  • 先遍历数组,以数为键名,出现次数为键值存入map(也可以是 array)
  • 再遍历 map,找出 val 为 1 的两个数,组成数组
  • 判断两个数大小,从小到大排序
代码实现
/**
 * [JZ56-中等] 数组中只出现一次的两个数字
 *
 * @param array int整型一维数组
 * @return int整型一维数组
 */
func findNumsAppearOnce(array []int) []int {
    hash := map[int]int{}

    // 统计每个数出现的次数
    for _, v := range array {
        if _, ok := hash[v]; ok {
            hash[v] += 1
        } else {
            hash[v] = 1
        }
    }

    // 遍历查找次数等于 1 的数
    result := []int{}
    for k, v := range hash {
        if v == 1 {
            result = append(result, k)
        }
    }

    // 排序 - 就两个数,判断下大小即可
    for i := 0; i < len(result)-1; i++ {
        if result[i] > result[i+1] {
            result[i], result[i+1] = result[i+1], result[i]
        }
    }

    return result
}

本文由 一切随风 创作,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论