题目
描述
一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
数据范围:数组长度 2<= n<= 1000,数组中每个数的大小 0 < val <= 10000000
要求:空间复杂度 O(1),时间复杂度 O(n)
提示:输出时按非降序排列。
示例1
输入:[1,4,1,6]
返回值:[4,6]
说明:**返回的结果中较小的数排在前面**
第一种:对数组进行排序后,遍历比较前后的值是否相同,不同添加进新数组,相同索引值++
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型一维数组
* @return int整型一维数组
*/
function FindNumsAppearOnce(array) {
// write code here
array.sort();
let res = [];
for (let i = 0; i < array.length - 1; i++) {
if (array[i] != array[i + 1]) {
res.push(array[i]);
} else {
i++; // 相同后移一位
}
}
if (res.length != 2) res.push(array.pop()); //没有两位数最后一位只出现一次
return res;
}
module.exports = {
FindNumsAppearOnce: FindNumsAppearOnce,
};
第二种:使用Map存储数组对应的出现次数
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型一维数组
* @return int整型一维数组
*/
function FindNumsAppearOnce(array) {
// write code here
let map = new Map();
for (let val of array) {
let count = map.get(val);
if (count === undefined) map.set(val, 1);
else map.set(val, ++count); // 注意:后自增会错误
}
let res = [];
for (let [key, count] of map) {
if (count === 1) res.push(key);
}
// 注意:小数在前面
if (res[0] > res[1]) return [res[1], res[0]];
return res;
}
module.exports = {
FindNumsAppearOnce: FindNumsAppearOnce,
};
小知识
- 前自增和后自增区别:
- 单独使用,无区别,都会使变量++
- 表达式中,前自增会先自增在返回值,后自增会先返回值再自增
- for… of遍历Map
let iterable = new Map([["a", 1], ["b", 2], ["c", 3]]);
for (let entry of iterable) {
console.log(entry);
}
// ["a", 1]
// ["b", 2]
// ["c", 3]
for (let [key, value] of iterable) {
console.log(value);
}
// 1
// 2
// 3
- Map中set()和get()方法
- set() 方法为 Map 对象添加或更新一个指定了键(key)(value)的(新)键值对。
- get() 方法返回某个 Map 对象中的一个指定元素。
const map1 = new Map();
map1.set('bar', 'foo');
console.log(map1.get('bar'));
// expected output: "foo"