当前位置:   article > 正文

[Leetcode 136][Easy]-只出现一次的数字

[Leetcode 136][Easy]-只出现一次的数字

目录

题目描述

具体思路


题目描述

原题链接

具体思路

①首先看到数组中重复的数字,想到快慢指针,但是数组的元素是乱序的不好求。因此先对数组排序。使用了STL库的sort函数,时间复杂度O(nlogn)不符合题目要求,空间复杂度O(1)。

  1. //快慢指针+sort
  2. int singleNumber(vector<int>& nums) {
  3. if(nums.size()==1) return nums[0];
  4. sort(nums.begin(),nums.end());
  5. if(nums[0]!=nums[1] && nums[1]==nums[2]) return nums[0];//排除第一个项是唯一数的情况
  6. int tar=-1;
  7. for(int l=0,r=1;r<nums.size()-1;r++){
  8. if(nums[l]!=nums[r]){
  9. if(nums[r+1]==nums[r]){
  10. l=r+1;
  11. }else{
  12. tar=nums[r];
  13. break;
  14. }
  15. }else{
  16. l=r;
  17. }
  18. }
  19. if(tar==-1) tar=nums[nums.size()-1];//排除最后一个项是唯一数的情况
  20. return tar;
  21. }

②后面研究,发现对于对于查找数组中唯一一个出现一次的元素,我们更适合使用线性扫描和位操作的方法。异或运算满足交换律,且一个数异或自己结果是0,一个数异或0结果是自己。因此把数组中所有元素进行异或运算,得到结果是唯一数

  1. int singleNumber(vector<int>& nums) {
  2. if(nums.size()==1) return nums[0];
  3. int ans=nums[0];
  4. for(int i=1;i<nums.size();i++){
  5. ans^=nums[i];
  6. }
  7. return ans;
  8. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/786253
推荐阅读
相关标签
  

闽ICP备14008679号