【每日刷题】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;
}