您的位置:首页 > 文旅 > 旅游 > 【每日刷题】Day53

【每日刷题】Day53

2025/3/12 11:28:10 来源:https://blog.csdn.net/2301_78022459/article/details/139361999  浏览:    关键词:【每日刷题】Day53

【每日刷题】Day53

🥕个人主页:开敲🍉

🔥所属专栏:每日刷题🍍

🌼文章目录🌼

1. 1019. 链表中的下一个更大节点 - 力扣(LeetCode)

2. 116. 填充每个节点的下一个右侧节点指针 - 力扣(LeetCode)

3. 412. Fizz Buzz - 力扣(LeetCode)

1. 1019. 链表中的下一个更大节点 - 力扣(LeetCode)

//思路:栈。将链表中的元素存入一个数组。遍历这个数组,将数组元素的下标入栈。

//入栈情况:① 如果当前栈中没有元素,直接入栈  ② 如果数组当前元素<数组以当前栈顶元素为下标的元素,直接入栈。

//出栈情况:如果数组当前元素>数组以当前栈顶元素为下标的元素,将答案数组中当前栈顶元素为下标的位置放为数组当前元素(也就是找到了下一个更大元素),并继续从栈顶往栈底比较,直到遇到数组当前元素<数组以当前栈顶元素为下标的元素的情况,break跳出循环,并将数组当前元素下标放入栈顶。

//当遍历完数组后,如果栈中还有元素,说明数组中以这些元素为下标的元素没有找到下一个更大的值,将答案数组中以栈中元素为下标的位置置为0。

typedef struct ListNode LN;


 

int* nextLargerNodes(struct ListNode* head, int* returnSize)

{

    int arr[10000] = {0};

    int stack[10000] = {0};

    int* ans = (int*)malloc(sizeof(LN)*10000);

    int num = 0;

    int count = 0;

    LN* pmove = head;

    while(pmove)//将链表元素存入数组

    {

        arr[num++] = pmove->val;

        pmove = pmove->next;

    }

    for(int i = 0;i<num;i++)//遍历数组

    {

        if(count==0||arr[i]<arr[stack[count-1]])//如果栈中没有元素或者数组当前元素<数组以当前栈顶元素为下标的元素,入栈

            stack[count++] = i;

        else

        {

            while(count)//否则,从栈顶往栈底遍历栈中的下标元素,直到遍历到栈底或者数组当前元素>数组以当前栈顶元素为下标的元素,跳出循环

            {

                if(arr[i]>arr[stack[count-1]])

                    ans[stack[count-1]] = arr[i];

                else

                    break;

                count--;

            }

            stack[count++] = i;//将当前数组元素下标放入栈顶

        }

    }

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

    {

        ans[stack[i]] = 0;//如果栈中还有元素,说明数组中以栈中元素为下标的元素没有找到下一个更大的值,将答案数组以栈中元素为下标的位置置为0。

    }

    *returnSize = num;

    return ans;

}

2. 116. 填充每个节点的下一个右侧节点指针 - 力扣(LeetCode)

//思路:层序遍历。将层序遍历的结果存入数组中(存放的元素为struct Node* 的指针),因为是完美二叉树,因此每一层的结点个数都满足 2^x 。因此,只需要根据每层的节点数改变遍历的次数。

typedef struct Node* QDataType;


 

//队列节点

typedef struct listnode

{

    QDataType val;

    struct listnode* next;

}LN;

//队列头尾指针

typedef struct queque

{

    LN* phead;

    LN* ptail;

    int size;

}QE;


 

//队列初始化

void QueInit(QE* qe)

{

    assert(qe);

    qe->phead = NULL;

    qe->ptail = NULL;

    qe->size = 0;

}


 

//判断队列是否为空

bool QueEmpty(QE* qe)

{

    assert(qe);

    return qe->size == 0;

}


 

//入列

void QuePush(QE* qe, QDataType x)

{

    assert(qe);

    LN* newnode = (LN*)malloc(sizeof(LN));

    if (newnode == NULL)

    {

        perror("malloc:");

        exit(-1);

    }

    newnode->next = NULL;

    newnode->val = x;

    if (qe->phead == NULL)

    {

        qe->phead = qe->ptail = newnode;

    }

    else

    {

        qe->ptail->next = newnode;

        qe->ptail = qe->ptail->next;

    }

    qe->size++;

}

//出列

void QuePop(QE* qe)

{

    assert(qe);

    assert(qe->phead != NULL);

    assert(qe->size > 0);

    LN* tmp = qe->phead->next;

    free(qe->phead);

    qe->phead = tmp;

    qe->size--;

}


 

//获取列头元素

QDataType QueGetHead(QE* qe)

{

    assert(qe);

    assert(qe->phead != NULL);

    return qe->phead->val;

}



 

struct Node* connect(struct Node* root)

{

    if(!root)

        return NULL;

    QDataType arr[10000] = {0};

    int count = 0;

    root->next = NULL;

    QE q;

    QueInit(&q);

    QuePush(&q,root);

    while(!QueEmpty(&q))//入列

    {

        QDataType tmp = QueGetHead(&q);

        arr[count++] = QueGetHead(&q);//将队头元素存入数组中

        QuePop(&q);

        if(tmp->left)//继续层序遍历

            QuePush(&q,tmp->left);

        if(tmp->right)

            QuePush(&q,tmp->right);

    }

    int i = 1;

    int flag = 1;

    while(i<count)//遍历数组

    {

        int j = pow(2,flag);

        while(j-1)//选择其中的2^flag次方个结点进行next操作

        {

            arr[i]->next = arr[i+1];

            i++;

            j--;

        }

        arr[i++]->next = NULL;//每一层的最后一个结点的next为NULL

        flag++;

    }

    return root;

}

3. 412. Fizz Buzz - 力扣(LeetCode)

//思路:题目不难,主要考察对动态内存管理知识的理解能力。

char ** fizzBuzz(int n, int* returnSize)

{

    char** ans = (char**)malloc(sizeof(char*)*n);//申请一块空间,存放指针

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

    {

        ans[i] = (char*)malloc(sizeof(char)*9);//对这块空间中的每个指针申请空间

    }

    for(int i = 1;i<=n;i++)

    {

        if(i%3==0&&i%5==0)

            strcpy(ans[i-1],"FizzBuzz");

        else if(i%3==0)

            strcpy(ans[i-1],"Fizz");

        else if(i%5==0)

            strcpy(ans[i-1],"Buzz");

        else

            sprintf(ans[i-1],"%d",i);

    }

    *returnSize = n;

    return ans;

}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com