这是我参与8月更文挑战的第21天,活动详情查看:8月更文挑战
相关文章
LeetCode刷题汇总:LeetCode刷题
一、题目描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗
从简单题目开始刷,锻炼自己的思维能力,为面试准备~
二、思路分析
-
看看题目的示例,我们来理一理这个思路~
-
示例 1:
输入: [2,2,1] 输出: 1
-
示例2:
输入: [4,1,2,1,2] 输出: 4
-
唔,hashMap的key是唯一的,没毛病~
-
我们可以将数组中的所有值放入map中作为key,value理所当然为1。
-
循环遍历,如果再次出现,我们可以将value+1。
-
最后返回value为1的即是只出现一次的值!
三、AC 代码
-
hashMap暴力破解法:
class Solution { public int singleNumber(int[] nums) { Map<Integer, Integer> map = new HashMap<>(); //第一遍遍历,目的是添加值 for(int i = 0; i < nums.length; i++){ if(map.containsKey(nums[i])){ map.put(nums[i], map.get(nums[i])+1); } else{ map.put(nums[i], 1); } } //第二遍遍历,目的是找到value为1的值 for(Integer key : map.keySet()){ if(map.get(key) == 1){ return key; } } return 0; } }
- 这种方式毋庸置疑,很蠢很笨!
- 但是主要是这个思路,我们可以充分利用Map中的每一个特性来完成这个问题!
-
快速排序破解:
class Solution { public int singleNumber(int[] nums) { //先进行升序排列 Arrays.sort(nums); //枚举nums中的第偶数个数字 for(int i=0;i+1<nums.length;i+=2) { //如果数字和它后一位不相同,说明当前数字只出现了一个 if(nums[i]!=nums[i+1]) { return nums[i]; } } //如果前面所有的数字都出现了两次,说明答案是最后一个数字 return nums[nums.length-1]; } }
- 大家还记得前面的题目存在重复元素 | LeetCode刷题笔记
- 里面就用到了Arrays.sort(nums);
- 排序完成后证明,如果相等值得话肯定是左右相邻的!
- 我们只需要判断偶数位即可,因为最少出现一次嘛!
- 如果前面所有的数字都出现了两次,那么最后以为理所应当为唯一值!
四、总结
-
解题思路千千万,不管是本办法还好,还是奇思妙想的解法,能解决就是好办法!白猫黑猫能抓老鼠的猫就是好猫!
-
这里列几个LeetCode的其他大神的解法作为参考!
-
点击跳转:官方解法
-
点击跳转:异或算法
- 异或解法也太牛逼了吧!!!强烈推荐看一看!可以拓展自己的思路!
**路漫漫其修远兮,吾必将上下求索~ **如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah