• LeetCode 136. 只出现一次的数字


    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

    说明:

    你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

    示例 1:

    输入: [2,2,1]
    输出: 1
    

    示例 2:

    输入: [4,1,2,1,2]
    输出: 4

     方法一:暴力算法,双重遍历,并作标记,暴力的找出没有重复的元素。当然,该算法不具有线性时间复杂度。

     1 int singleNumber(int* nums, int numsSize){
     2     int i,j,flag=1;
     3     for(i=0;i<numsSize;i++){
     4         flag=1;
     5         for(j=0;j<numsSize;j++){
     6             if(i==j){
     7                 continue;
     8             }else if(nums[i]==nums[j]){
     9                 flag=0;
    10                 break;
    11             }
    12         }
    13         if(flag==1){
    14             break;
    15         }
    16     }
    17     return nums[i];
    18 }

    方法二:快速排序+遍历数组,该方法符合题目要求,但并不是最优解。

     1 int cmp(const void *a,const void *b)
     2 {
     3     return *(int*)a-*(int*)b;
     4 }
     5 int singleNumber(int* nums, int numsSize){
     6     qsort(nums,numsSize,sizeof(nums[0]),cmp);
     7     int i;
     8     for(i=0;i<numsSize-1;i++){
     9         if(nums[i]==nums[i+1]){
    10             i++;
    11         }else{
    12             return nums[i];
    13         }
    14     }
    15     return nums[numsSize-1];
    16 }

    方法三:位运算,异或操作(^),因为a^a=0,而a^a^b=b,所以我们使用异或,可以最快速的解决这道题目。

    1 int singleNumber(int* nums, int numsSize){
    2     int i,k=nums[0];
    3     for(i=1;i<numsSize;i++){
    4         k=k^nums[i];
    5     }    
    6     return k;
    7 }
  • 相关阅读:
    用价值链分析软件开发及杂感
    《恰如其分的软件架构》笔记摘要
    观察者模式
    Js中Date对象
    Js中Currying的应用
    read命令
    模板方法模式
    两两交换链表中的节点
    享元模式
    Js中Array对象
  • 原文地址:https://www.cnblogs.com/woju/p/12770009.html
Copyright © 2020-2023  润新知