【每日刷题】Day53

【每日刷题】Day53

🥕个人主页:开敲🍉

🔥所属专栏:每日刷题🍍

🌼文章目录🌼

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

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

[3. 412. Fizz Buzz - 力扣(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;

}

相关推荐
ChoSeitaku30 分钟前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
DdddJMs__13536 分钟前
C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
c语言·leetcode·题解
Fuxiao___39 分钟前
不使用递归的决策树生成算法
算法
我爱工作&工作love我44 分钟前
1435:【例题3】曲线 一本通 代替三分
c++·算法
娃娃丢没有坏心思1 小时前
C++20 概念与约束(2)—— 初识概念与约束
c语言·c++·现代c++
白-胖-子1 小时前
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-统计数字
开发语言·c++·算法·蓝桥杯·等考·13级
workflower1 小时前
数据结构练习题和答案
数据结构·算法·链表·线性回归
好睡凯1 小时前
c++写一个死锁并且自己解锁
开发语言·c++·算法
Sunyanhui12 小时前
力扣 二叉树的直径-543
算法·leetcode·职场和发展
一个不喜欢and不会代码的码农2 小时前
力扣105:从先序和中序序列构造二叉树
数据结构·算法·leetcode