携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
😊 大家好,我是思淼MJ。
随着“后浪拍前浪”,于是我被拍到了沙滩上,一直在努力寻找自己的发展方向。都说:做事情规划固然重要,但行动更重要。于是就给自己订了个小目标,这就是这次挑战的由来,看看自己能坚持多久。欢迎小伙伴们,和我一起挑战打卡😊。
题目:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
解题思路:
- 因要求不使用额外空间来实现
- 使用
sort数组排序方法先对数组进行排序,其方法中可传递参数,来确定是以降/升序排列。比如数组:[2, 2, 4, 3, 6, 3, 4, 6, 5] - 因数组中元素只有一项是只出现过一次的,所以排序后的数组,出现两次的元素相邻的每两项都是相等的。
- 所以下面分别定义两个变量
x, y作为数组的索引,对数组进行遍历,对数组中的内容每两项进行比较,如相等则改变x, y的值,如两项不相等,则以x为下标的数字就是只出现了一次的元素。
代码部分:
function singleNumber(nums) {
nums.sort(function(a, b){return a - b});
let x = 0;
let y = 1;
for(let i = 0; i < nums.length; i++){
if(nums[x] === nums[y]) {
x += 2
y += 2
} else {
break;
}
}
return nums[x];
};
singleNumber([2, 2, 4, 3, 6, 3, 4, 6, 5])
其他方法:
如果不考虑时间复杂度和空间复杂度的限制,可以使用:
-
使用集合存储数字
-
使用哈希表存储每个数字和该数字出现的次数