• 算法题1


    题目1:两个二进制数的异或结果

    两个二进制数异或结果 是 这两个二进制数差的绝对值,即表达为如下: a^b = |a-b| (按位相减)

    解答过程:

          二进制数a与b异或,即a和b两个数按位进行,如果对应位相同,即为0(这个时候相当于对应位算术相减),如果不相同,即为1(这个时候相当于对应位算术相减的绝对值)。由于二进制每个位只有两种状态,要么是0,要么是1,则按位异或操作可以表达为按位相减后取绝对值。
    题目2:递归函数最终会结束,那么这个函数一定(不定项选择):
    1. 使用了局部变量 2. 有一个分支不调用自身
    3. 使用了全局变量或者使用了一个或多个参数

    这是一道简单的选择题,但包含的内容并不算简单,而不定项选择更加大了难度。我一眼看去,自然就选择了2和3。
    1显然不是,局部变量只在一次调用局部范围有效,出了这次调用的范围就无效了,它不能控制递归的结束。(这个选项是考查局部变量生命周期/有效范围的问题)需要注意的就是局部变量不是局部静态变量。
    对于2,很自然了,如果没有一个分支不调用自身,递归就不会结束了。(这是在考查递归的定义)
    对于3,这是最有迷惑性的,因为使用全局变量或使用一个或多个参数的确可以控制递归的结束,但是不是只有这两种方式呢?所以题目中指出了"一定"。答案是并不是只有这两种方式。

        * 我们知道局部静态变量存放在堆中而不是栈中,所以它在程序生命周期内都是存在的,只是只有在函数内才能被访问,其内容是上次处理后的内容或是初始化后的内容,调用多次都同一个变量实例。所以局部静态变量是可以控制递归函数最终结束的。
          在C语言中,可以用
          static int a;
          来定义,在Delphi中可以用
          const a:integer;
          来定义(注意编译器开关$J+)
          这里会有很多人认为局部静态变量就是全局变量,这是错误的,全局变量应该是生命周期和有效作用域都有全局性,而局总静态变量只有生命周期是全局的,而作用域是只在函数体内有效。


        * 可能通过异常来控制递归的结束。其实这种情况很常见,每个应用程序的缺省栈空间大小是不会太大的,很容易因为堆栈溢出而让递归函数终止。此外,还可以会发生其它的异常,比如内存空间不足、除零等等。这些异常都可以让递归函数终止。
        * 我们一般所说的全局变量都是针对一个应用程序而言的,所以我们还可以利用BIOS或OS的一些数据或一些标准库的全局值来控制递归过程的终止。比如利用日期时间、利用库中的随机数等等。
        * 我们还可以把一些数据写入到BIOS或OS的系统数据区,也可以把数据写入到一个文件中,以此来控制递归函数的终止。
        * 还有......还没想到

    呵呵,所以,正确答案是2,只有这一个。

    以上终止条件,我只想到前两个,后面的是综合了其他人的"创意":D

    题目3:T(n) = 25T(n/5)+n^2的时间复杂度?
    T(n) = 25T(n/5)+n^2 = 25(25T(n/25)+n^2/25)+n^2
    = 625T(n/25)+n^2+n^2 = 625T(n/25) + 2n^2
    = 25^2 * T( n/ ( 5^2 ) ) + 2 * n*n
    = 625(25T(n/125)+n^2/625) + 2n^2
    = 625*25*T(n/125) + 3n^2
    = 25^3 * T( n/ ( 5^3 ) ) + 3 * n*n
    = ....
    = 25 ^ x * T( n / 5^x ) + x * n^2

    T(n) = 25T(n/5)+n^2
    T(0) = 25T(0) + n^2 ==> T(0) = 0
    T(1) = 25T(0)+n^2 ==> T(1) = 1

    x = lg 5 n

    25 ^ x * T( n / 5^x ) + x * n^2
    = n^2 * 1 + lg 5 n * n^2
    = n^2*(lgn)

    题目4:实现两个N*N矩阵的乘法,矩阵由一维数组表示

    void matrix_mul(int a[][], int b[][], int c[][])

    {

      for(int j=0;j<N;j++)

      {

        int sum=0;

        for(int i=0;i<N;i++)

        {

          for(int k=0;k<N;k++)

            c[j][i]+=a[j][k]+b[k][i];

        }

      }

    }

    题目5:找到单向链表中间那个元素,如果有两个则取前面一个

    用两个指针,一个步长为1,另一个步长为2,当步长为2的指针走到链表尾部时,步长为1的指针的指向就是中间那个元素。

    题目6:长度为n的整数数组,找出其中任意(n-1)个乘积最大的那一组,只能用乘法,不可以用除法。要求对算法的时间复杂度和空间复杂度作出分析,不要求写程序。

    令这 N 个数的乘积为 P,
        1) 如果 P<0,则剔除其中最大的负整数即可;
        2) 如果 P=0,
            2.1) 若这 N 个数中有且仅有一个为“0”。若其他数之积为正,则剔除“0”;否则剔除
    最大的负整数
            2.2) 若这 N 个数中至少有两个为“0”,则随便剔除一个数均可;
        3) 如果 P>0,如果有正数,则剔除其中最小的正整数即可;否则,剔除最小的负整数

        时间复杂度:遍历数组,获得正整数个数 cp,负整数个数 cn,0 的个数 cz,需要 O(N) 时间;找被剔除的数最坏情况下需要 O(N) 时间。输出结果需要 O(N) 时间。因此,时间复杂度为 O(N)。

        空间复杂度:数组存储需要 O(N) 空间,cp, cn, cz 和被剔除的数的下标各需要 O(1) 空间。因此,空间复杂度为 O(N)。

  • 相关阅读:
    MSF——客户端渗透之VBScript感染
    (136)leetcode刷题Python笔记——只出现一次的数字
    两道CTF Web的题目
    (1)leetcode刷题Python笔记——两数之和
    Pikachu漏洞练习平台实验——越权漏洞(八)
    Pikachu漏洞练习平台实验——php反序列化、XXE、SSRF(九)
    MVP Docs Champion (2020)
    Azure DevOps Server 集成操作Windows系统文件管理器
    Azure DevOps Server (TFS) 数据分析Analytics(一):使用OData扩展分析服务数据
    Azure DevOps Server (TFS)搜索功能三:wiki维基搜索
  • 原文地址:https://www.cnblogs.com/wwwfj/p/3213365.html
Copyright © 2020-2023  润新知