• 关于数组的几道面试题


    1.求子数组的最大和
    题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)
            例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18
            如果不考虑时间复杂度,我们可以枚举出所有子数组并求出他们的和。不过非常遗憾的是,由于长度为n的数组有O(n2),具体是n*(n+1)/2个子数组;而且求一个长度为n的数组的和的时间复杂度为O(n)。因此这种思路的时间是O(n3)
      
    解题思路:很容易理解,当我们加上一个正数时,和会增加;当我们加上一个负数时,和会减少。如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零,不然的话这个负数将会减少接下来的和。
     

    #include <stdio.h>
    #include <stdlib.h>
    #include <limits.h>
    #include <malloc.h>

    int main()
    {
        int *ip;
        int j,length,max,sum;
        int start1 = 0 ,start2 = 0;
        
        printf("Please enter the array's length:");
        scanf("%d",&length);
        if((ip = (int*)malloc(length*sizeof(int)))==NULL)
        {
                fprintf(stderr,"Malloc memory failed !");
                exit(1);
        }
        printf("Enter eath element:");
        for(j = 0; j < length ; j ++)
        scanf("%d",ip+j);

        max = INT_MIN;
        for(sum = j = 0; j < length; j ++)
        {
                sum += *(ip+j);
                if(max < sum)
                {
                        start1 = start2;
                        max = sum;
                }
                if(sum < 0){
                        start2 = j+1;
                        sum = 0;
                        
                }
         }
         for(j = start1,sum = 0; sum != max; j ++)
                sum += *(ip+j);
         printf("\nThe subsequence from %d to %d,max sum is %d\n",start1,j-1,max);
      return 0;
    }

    2.求两个有序数组的共同元素

    给定两个含有n个元素的有序(非降序)整型数组a和b,求出其共同元素,比如

    a = 0, 1, 2, 3, 4

    b = 1, 3, 5, 7, 9

    输出 1, 3

    分析

    充分利用数组有序的性质,用两个指针i和j分别指向a和b,比较a[i]和b[j],根据比较结果移动指针,则有如下三种情况

    1. a[i] < b[j],则i增加1,继续比较

    2. a[i] == b[j],则i和j皆加1,继续比较

    3. a[i] < b[j],则j加1,继续比较

    重复以上过程直到i或j到达数组末尾。

    // 找出两个数组的共同元素

    void FindCommon(int* a, int* b, int n)
    {
        int i = 0;
        int j = 0 ;
        while (i < n && j < n)
        {
            if (a[i] < b[j])
                ++i ;
            else if(a[i] == b[j])
            {
                cout << a[i] << endl ;
                ++i ;
                ++j ;
            }
            else// a[i] > b[j]

                ++j ;
        }
    }

    3.数组的循环右移

    【题目】有一个整数数组,现要求实现这个整数数组的循环右移。如:12345 则循环右移两位后结果是:45123

    void RightCircleShift_04(int buffer[],int shift)

    {

        shift %= ARRSIZE;

        ReverseArray(buffer,1,ARRSIZE);

        ReverseArray(buffer,1,shift);

        ReverseArray(buffer,shift+1,ARRSIZE);

    }

    void ReverseArray(int buffer[],int start,int end)

    {

        int i,tt;

     

        if(end > ARRSIZE)

           return;

     

        start -= 1;

        end -= 1;

        while(start < end)

        {

           tt = buffer[start];

           buffer[start++] = buffer[end];

           buffer[end--] = tt;

        }

    }


       1、先将整个数组反转。

    2、然后再反转前shift个元素。

    3、接着再反转后N-shift个元素

    4.去除数组中重复数字问题

    (采用hash表法解决)

    void RemoveBufferRepNum_01(int buffer[])

    {

        int tBuffer[BUFFERSIZE];

        int i = 0,j = 0;

       

        for(i=0;i //初始化数组


           tBuffer[i] = INIT_NUM;

     

        for(i=0;i//剔除算法


        {

           if(tBuffer[buffer[i]] == INIT_NUM)

               tBuffer[buffer[i]] = buffer[i];

        }

     

        for(i=0;i

        {

           if(tBuffer[i] == INIT_NUM)

               continue;

           buffer[j++] = tBuffer[i];

        }

        while(j < BUFFERSIZE)

            buffer[j++] = INIT_NUM;

    }

  • 相关阅读:
    android的FATAL EXCEPTION: main错误
    ORA12560: TNS: 协议适配器错误
    BroadcastReceiver应用详解
    using C# 详解
    mysqlproxy0.8版本读写分离测试总结
    Mysql SHOW PROCESSLIST Sending data
    [转载]大型网站运维探讨和心得
    找出并optimization表
    mysql中普通索引和唯一索引的效率对比
    ps aux 中STAT 解释
  • 原文地址:https://www.cnblogs.com/lzjsky/p/1936376.html
Copyright © 2020-2023  润新知