• leetcode


    今天开始刷leetcode上的题,争取校招前刷过一遍,从AC率最高的题目开始刷,不废话了,看题

    题目:Single Number

    Given an array of integers, every element appears twice except for one. Find that single one.

    Note:
    Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

    个人思路:

    1、对数组排序(从小到大或者从大到小)

    2、从第一个数开始,与它后面一个数比较,若相同,说明数组中有两个这样的数,若不同,说明数组中只有一个这样的数,也即是我们要获得的数

    代码(main里面的代码用于测试,提交时只需提交必要代码即可):

     1 #include <algorithm>
     2 #include <iostream>
     3 
     4 using namespace std;
     5 
     6 class Solution
     7 {
     8 public:
     9     int singleNumber(int A[], int n)
    10     {
    11         int index;
    12         sort(&A[0], &A[n]);
    13         for (index = 0; index < n; index += 2)
    14         {
    15             if (A[index] != A[index + 1])
    16             {
    17                 break;
    18             }
    19         }
    20 
    21         return A[index];
    22     };
    23 };
    24 
    25 int main()
    26 {
    27     int A[] = {1, 2, 1, 3, 3, 4, 2, 5, 4};
    28     Solution s;
    29     int single = s.singleNumber(A, 9);
    30     cout << single << endl;
    31 
    32     system("pause");
    33     return 0;
    34 }

    上面的代码先排序,然后遍历数组,由于不是很清楚sort函数的时间复杂度,姑且当作O(nlogn)吧,总的来说,成功AC了,但整个代码的时间复杂度为O(nlogn)

    且题目的要求为:Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

    上网查找了线性时间复杂度算法,并且实践了一下,在这里与大家分享,原文链接:http://www.cnblogs.com/changchengxiao/p/3413294.html

    思路:

    1、对于异或运算,有a ^ b = b ^ a和0^ a = a

    2、那么遍历数组时,将数组所有元素进行异或处理,相同的元素异或结果为0,则最终的异或结果即为只出现一次的元素

    代码:

     1 #include <algorithm>
     2 #include <iostream>
     3 
     4 using namespace std;
     5 
     6 class Solution
     7 {
     8 public:
     9     int singleNumber(int A[], int n)
    10     {
    11         //个人思路
    12         /*
    13         int index;
    14         sort(&A[0], &A[n]);
    15         for (index = 0; index < n; index += 2)
    16         {
    17             if (A[index] != A[index + 1])
    18             {
    19                 break;
    20             }
    21         }
    22 
    23         return A[index];
    24         */
    25 
    26         //网上思路
    27         int result = 0;
    28         for (int i = 0; i < n; ++i)
    29         {
    30             result ^= A[i];
    31         }
    32 
    33         return result;
    34     };
    35 };
    36 
    37 int main()
    38 {
    39     int A[] = {1, 2, 1, 3, 3, 4, 2, 5, 4};
    40     Solution s;
    41     int single = s.singleNumber(A, 9);
    42     cout << single << endl;
    43 
    44     system("pause");
    45     return 0;
    46 }

    原文链接中还有两个扩展题,可以看看,好了,就到这吧

  • 相关阅读:
    Linux下PCI设备驱动程序开发 PCI驱动程序实现(三)
    一个动态内存管理模块的实现
    【Linux device driver】设备驱动程序概述(一)
    Linux PCI设备驱动程序开发 PCI 体系结构(一)
    [linux driver]用I/O命令访问PCI总线设备配置空间
    【Linux device driver】网络设备驱动程序(二)
    【Linux device driver】网络设备驱动注意的问题(三)
    C++中的引用、const引用和非const引用
    C++的数组和指针
    “指向const对象的指针” 和 “const指针”
  • 原文地址:https://www.cnblogs.com/laihaiteng/p/3776910.html
Copyright © 2020-2023  润新知