数据结构 每日一练 :选择 + 编程

目录

选择

编程


数据结构 每日一练 :选择 + 编程_第1张图片

选择

A .   a[0][2*1]     B.  a[1][3]   C.  a[4-2][0]  D.  a[0][2+2]

答案:D

解析:题目给的是一个3行4列的数组,而D选项是 a[0][2+2] = a[0][4],相当于取得是第1行第5列的元素,越界了。需要注意的是数组下表是从0开始的。下标从0开始!下标从0开始!下标从0开始!

A.  r - f           B.  r - f + 1        C.  ( r - f ) mod n + 1    D.   ( r - f + n ) mod n

答案:D

解析:注意本题的索引下标是从1开始 所以循环队列中最多有n个元素。在循环队列中,头指针指向队列当中的第一个元素,而尾指针指向最后一个元素的下一位。

队头指针为front,队尾指针为rear;队列中元素的最大个数MaxSize

入队时队尾指针加1取模:(rear+1)%MaxSize

出队时队头指针加1取模:(front+1)%MaxSize

队列长度(元素个数):(rear-front+MaxSize)%MaxSize

队满条件:(rear+1)%MaxSize==front

队空条件:front == rear

数据结构 每日一练 :选择 + 编程_第2张图片

A.  1         B.  3       C.  4       D.  编译出错或其他地方不对

答案:D

解析:代码段中定义数组a方式错误,二维数组定义时不允许省略列数,无法编译通过。声明数组必须指定列!声明数组必须指定列!声明数组必须指定列!

A.  a[99-n]      B.  a[100-n]     C.  a[101-n]    D.  *(a + 101 - n)

答案:B

解析:数组元素的索引值从0开始,所以正数第n个元素的索引值是(n-1)。元素总数为100的数组倒数第n个元素的索引值是(100-n)。

A.  3              B.  4              C.  2                D.  5

答案:C

解析:二分查找即折半查找,mid = ( low + high ) / 2,且是向下取整的,第一次mid的指向32,然后high指向mid-1的位置;第二次mid指向15,正好与所要找的值相等。

编程

 题目:

给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。

数据范围:0≤n,m≤10,矩阵中任意元素都满足 ∣val∣≤100

要求:空间复杂度 O(nm) ,时间复杂度 O(nm)

思路:

        把矩阵看成一圈一圈的,每次循环遍历一个圈,每一圈的遍历中又分为上,右,下,左四个边界的遍历,每一个边界遍历完之后要向里层缩小。在遍历边界的时候要注意的是,每一个边的遍历必须是相同的规则,比如,下图中,上边界遍历从1开始,到倒数第二个元素3截止,遍历结束,即只遍历前三个元素,同样在其他的边进遍历的时候也是如此。这样才能保证所有的元素都会被遍历而且不会有重复。

        一轮控制一个变量,遍历上面一行时,变动列数;遍历右边一列时,变动行数;遍历下面一行时,变动列数;遍历左边一列时,变动行数。

        遍历一圈是4个for循环,但在一圈中的边界遍历的时候都有可能退出循环,所以每个for之后都要有一个循环出口,可以用元素的个数为条件,当元素个数超过矩阵中的元素个数的时候就退出循环。

数据结构 每日一练 :选择 + 编程_第3张图片    数据结构 每日一练 :选择 + 编程_第4张图片

核心代码

#include 
#include 
int* spiralOrder(int** matrix, int matrixRowLen, int* matrixColLen, int* returnSize ) {
    int* a;  //定义一个新的数组
    int row=matrixRowLen;//数组的行数
    int col=*matrixColLen;//数组的列数
    int cnt=row * (col);  //数组的总的元素个数
    *returnSize=cnt;      // 定义返回数组的大小
    a=(int *)malloc(sizeof(int)* cnt); //为新的数组申请空间
    int up=0,down=row-1,right=col-1,left=0;//上边界,下边界,右边界,左边界
    int i=0,j=0,t=0;  //i表示行,j表示列,t表示数组a的元素个数

    while(1){  //循环一圈
        for(j=left;j<=right;j++){  //遍历上边界
            a[t++]=matrix[up][j];
        }
        if(t>=cnt){     //循环出口
            break;
        }
        up++;            //上边界下移
        for(i=up;i<=down;i++){    //遍历右边界
            a[t++]=matrix[i][right];
        }
        if (t>=cnt) {
            break;
        }
        right--;         //右边界左移
        for(j=right;j>=left;j--){  //遍历下边界
            a[t++]=matrix[down][j]; 
        }
        if(t>=cnt){
            break;
        }
        down--;   //下边界上移
        for(i=down;i>=up;i--){   //遍历左边界
            a[t++]=matrix[i][left];
        }
        if(t>=cnt){
            break;
        }
        left++;   //左边界右移
    }
    return a ;
}

你可能感兴趣的:(数据结构,数据结构,每日一练,编程)