【每日刷题】Day39
🥕个人主页:开敲🍉
🔥所属专栏:每日刷题🍍
🌼文章目录🌼
[1. 622. 设计循环队列 - 力扣(LeetCode)](#1. 622. 设计循环队列 - 力扣(LeetCode))
[2. 387. 字符串中的第一个唯一字符 - 力扣(LeetCode)](#2. 387. 字符串中的第一个唯一字符 - 力扣(LeetCode))
[3. 2073. 买票需要的时间 - 力扣(LeetCode)](#3. 2073. 买票需要的时间 - 力扣(LeetCode))
1. 622. 设计循环队列 - 力扣(LeetCode)
//思路:顺序表。
typedef int QDataType;
typedef struct//循环队列结构体,包含有一数组,指向头和尾的变量head和tail,数组有效长度k
{
QDataType* arr;
int head;
int tail;
int k;
} MyCircularQueue;
MyCircularQueue* myCircularQueueCreate(int k)//创建循环队列并初始化
{
MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
obj->arr = malloc(sizeof(QDataType)*(k+1));
obj->head = obj->tail = 0;
obj->k = k;
return obj;
}
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)//入列
{
if((obj->tail+1)%(obj->k+1)==obj->head)//循环队列判满
{
return false;
}
obj->arr[obj->tail++] = value;//入列
obj->tail%=(obj->k+1);//设计为循环,当越界时可以回到0
return true;
}
bool myCircularQueueDeQueue(MyCircularQueue* obj)//出列
{
if(obj->head==obj->tail)//判空
{
return false;
}
obj->head++;
obj->head%=(obj->k+1);//同样是设计为循环,越界时回到0
return true;
}
int myCircularQueueFront(MyCircularQueue* obj)//获取队头元素
{
if(obj->head==obj->tail)//判空
{
return -1;
}
return (obj->arr[obj->head]);
}
int myCircularQueueRear(MyCircularQueue* obj)//获取队尾元素
{
if(obj->head==obj->tail)//判空
{
return -1;
}
return obj->arr[(obj->tail+obj->k)%(obj->k+1)];//这里比较难懂,可以原式是((obj->tail-1+k+1)%(k+1)),这里目的是为了处理tail为0时-1越界的情况
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj)//判空
{
return (obj->tail==obj->head);
}
bool myCircularQueueIsFull(MyCircularQueue* obj)//判满
{
return (obj->tail+1)%(obj->k+1)==obj->head;
}
void myCircularQueueFree(MyCircularQueue* obj)//释放
{
free(obj->arr);
free(obj);
}
2. 387. 字符串中的第一个唯一字符 - 力扣(LeetCode)
//思路:二次遍历。第一次遍历用哈希表存储字符出现的次数,第二次遍历根据哈希表判断该字符出现的次数,来判断是否为答案
int firstUniqChar(char* s)
{
int hash[26] = {0};
int i = 0;
for(i = 0;i<strlen(s);i++)//存储每个字符出现的个数
{
hash[s[i]-'a']+=1;
}
for(i = 0;i<strlen(s);i++)
{
if(hash[s[i]-'a']==1)//找到只出现一次的字符返回下标
{
return i;
}
}
return -1;
}
3. 2073. 买票需要的时间 - 力扣(LeetCode)
//思路:循环遍历数组。
int timeRequiredToBuy(int* tickets, int ticketsSize, int k)
{
int ans = 0;
int i = 0;
while(tickets[k]!=0)//第k个人没买完票循环继续
{
if(tickets[i]!=0)//每一个人买票,时间+1
{
ans++;
tickets[i]--;
}
i++;
i%=ticketsSize;//当遇到数组末尾时,回到头,模拟排队
}
return ans;
}