挑战「LeetCode」每日一题第1天

136 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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])

其他方法:

如果不考虑时间复杂度和空间复杂度的限制,可以使用:

  • 使用集合存储数字

  • 使用哈希表存储每个数字和该数字出现的次数