zoukankan      html  css  js  c++  java
  • 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 }

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

  • 相关阅读:
    ASP.NET MVC —— Model之一模型模板
    【转】METADATATYPE的使用,MVC的MODEL层数据验证
    bootstrap 全局 CSS 样式
    jQuery EasyUI API 中文文档
    基础知识--:before伪元素和:after伪元素
    960CSS框架,之前有用过 了解下框架基本原理
    CSS框架960Grid从入门到精通一步登天
    web网页的表单排版利器--960css
    文本编辑器Nano实用快捷键
    yum服务器设置
  • 原文地址:https://www.cnblogs.com/laihaiteng/p/3776910.html
Copyright © 2011-2022 走看看