首页 > 其他分享 >力扣面试题 23 - 动物收容所

力扣面试题 23 - 动物收容所

时间:2024-11-22 10:42:54浏览次数:3  
标签:面试题 obj int 力扣 队列 收容所 result Animal AnimalShelf

题目:

动物收容所。有家动物收容所只收容狗与猫,且严格遵守“先进先出”的原则。在收养该收容所的动物时,收养人只能收养所有动物中“最老”(由其进入收容所的时间长短而定)的动物,或者可以挑选猫或狗(同时必须收养此类动物中“最老”的)。换言之,收养人不能自由挑选想收养的对象。请创建适用于这个系统的数据结构,实现各种操作方法,比如enqueuedequeueAnydequeueDogdequeueCat。允许使用Java内置的LinkedList数据结构。

enqueue方法有一个animal参数,animal[0]代表动物编号,animal[1]代表动物种类,其中 0 代表猫,1 代表狗。

dequeue*方法返回一个列表[动物编号, 动物种类],若没有可以收养的动物,则返回[-1,-1]

示例1:

 输入:
["AnimalShelf", "enqueue", "enqueue", "dequeueCat", "dequeueDog", "dequeueAny"]
[[], [[0, 0]], [[1, 0]], [], [], []]
 输出:
[null,null,null,[0,0],[-1,-1],[1,0]]

示例2:

 输入:
["AnimalShelf", "enqueue", "enqueue", "enqueue", "dequeueDog", "dequeueCat", "dequeueAny"]
[[], [[0, 0]], [[1, 0]], [[2, 1]], [], [], []]
 输出:
[null,null,null,null,[2,1],[0,0],[1,0]]

说明:

  1. 收纳所的最大容量为20000

思路:

  1. 使用一个双端链表的结构来表示动物队列。队列包含两种类型的动物:猫和狗。每个动物节点包含其编号和种类信息。
  2. 收养动物但不指定猫还是狗时,如何判断谁更“老”呢?可以通过比较序号的方式判断。

具体函数设计:

1. 数据结构设计

  • 使用了一个双端链表的结构来表示动物队列。队列包含两种类型的动物:猫和狗。每个动物节点包含其编号和种类信息。
  • 使用 *head*tail 分别表示队列的头部和尾部指针,便于在队列两端进行操作。
  • 需要分别处理猫、狗和任意动物的入队和出队操作。

2. animalShelfCreate 创建队列

  • 初始化一个空的 AnimalShelf 结构体,其中 headtail 都初始化为 NULL,表示队列为空。

3. animalShelfEnqueue 入队操作

  • 根据传入的动物数据(编号和种类),创建一个新的动物节点。
  • 如果队列为空(即 *tail == NULL),将新的动物节点作为队列的第一个元素,*head*tail 都指向该节点。
  • 如果队列不为空,则根据动物种类(猫或狗)将新节点添加到对应的队列末尾,更新 *tail

4. animalShelfDequeueAny 任意出队操作

  • 判断队列是否为空。如果队列为空,直接返回 NULL
  • 如果队列非空,返回头部节点(第一个入队的动物)。更新 *head,让它指向下一个动物节点。如果更新后队列为空,还需要将 *tail 置为 NULL

5. animalShelfDequeueDog 狗出队操作

  • 判断队列是否为空。如果为空,返回 NULL
  • 否则,从队列中寻找最早进入队列的狗并将其出队。更新头部指针 *head,并且如果队列为空,还需要将 *tail 置为 NULL

6. animalShelfDequeueCat 猫出队操作

  • 判断队列是否为空。如果为空,返回 NULL
  • 否则,从队列中寻找最早进入队列的猫并将其出队。更新头部指针 *head,并且如果队列为空,还需要将 *tail 置为 NULL

7. animalShelfFree 释放队列

  • 释放队列中所有节点的内存。

C代码如下:

// 定义 Animal 结构体
typedef struct Animal {
    int id;
    int type; // 0 表示猫,1 表示狗
    struct Animal* next;
} Animal;

// 定义 AnimalShelf 结构体
typedef struct {
    Animal* dogHead;
    Animal* catHead;
    Animal* dogTail;
    Animal* catTail;
} AnimalShelf;

// 创建 AnimalShelf
AnimalShelf* animalShelfCreate() {
    AnimalShelf* shelf = (AnimalShelf*)malloc(sizeof(AnimalShelf));
    shelf->dogHead = NULL;
    shelf->catHead = NULL;
    shelf->dogTail = NULL;
    shelf->catTail = NULL;
    return shelf;
}

// 辅助函数:将动物加入队列
void enqueueAnimal(Animal** head, Animal** tail, int id, int type) {
    Animal* newAnimal = (Animal*)malloc(sizeof(Animal));
    newAnimal->id = id;
    newAnimal->type = type;
    newAnimal->next = NULL;
    if (*tail) {
        (*tail)->next = newAnimal;
    } else {
        *head = newAnimal;
    }
    *tail = newAnimal;
}

// 辅助函数:从队列中移除动物
Animal* dequeueAnimal(Animal** head, Animal** tail) {
    if (!*head) return NULL;
    Animal* animal = *head;
    *head = (*head)->next;
    if (!*head) {
        *tail = NULL;
    }
    return animal;
}

int* animalShelfDequeueDog(AnimalShelf* obj, int* retSize);

int* animalShelfDequeueCat(AnimalShelf* obj, int* retSize);

// 加入动物
void animalShelfEnqueue(AnimalShelf* obj, int* animal, int animalSize) {
    if (animal[1] == 0) {
        enqueueAnimal(&obj->catHead, &obj->catTail, animal[0], animal[1]);
    } else if (animal[1] == 1) {
        enqueueAnimal(&obj->dogHead, &obj->dogTail, animal[0], animal[1]);
    }
}

// 收养任意动物
int* animalShelfDequeueAny(AnimalShelf* obj, int* retSize) {
    *retSize = 2;
    if (!obj->dogHead && !obj->catHead) {
        int* result = (int*)malloc(2 * sizeof(int));
        result[0] = -1;
        result[1] = -1;
        return result;
    }
    if (!obj->dogHead) return animalShelfDequeueCat(obj, retSize);
    if (!obj->catHead) return animalShelfDequeueDog(obj, retSize);

    if (obj->dogHead->id < obj->catHead->id) {
        return animalShelfDequeueDog(obj, retSize);
    } else {
        return animalShelfDequeueCat(obj, retSize);
    }
}

// 收养狗
int* animalShelfDequeueDog(AnimalShelf* obj, int* retSize) {
    *retSize = 2;
    Animal* dog = dequeueAnimal(&obj->dogHead, &obj->dogTail);
    if (!dog) {
        int* result = (int*)malloc(2 * sizeof(int));
        result[0] = -1;
        result[1] = -1;
        return result;
    }
    int* result = (int*)malloc(2 * sizeof(int));
    result[0] = dog->id;
    result[1] = dog->type;
    free(dog);
    return result;
}

// 收养猫
int* animalShelfDequeueCat(AnimalShelf* obj, int* retSize) {
    *retSize = 2;
    Animal* cat = dequeueAnimal(&obj->catHead, &obj->catTail);
    if (!cat) {
        int* result = (int*)malloc(2 * sizeof(int));
        result[0] = -1;
        result[1] = -1;
        return result;
    }
    int* result = (int*)malloc(2 * sizeof(int));
    result[0] = cat->id;
    result[1] = cat->type;
    free(cat);
    return result;
}

// 释放 AnimalShelf
void animalShelfFree(AnimalShelf* obj) {
    Animal* temp;
    while (obj->dogHead) {
        temp = obj->dogHead;
        obj->dogHead = obj->dogHead->next;
        free(temp);
    }
    while (obj->catHead) {
        temp = obj->catHead;
        obj->catHead = obj->catHead->next;
        free(temp);
    }
    free(obj);
}

标签:面试题,obj,int,力扣,队列,收容所,result,Animal,AnimalShelf
From: https://blog.csdn.net/chamao_/article/details/143905916

相关文章

  • 20.有效的括号-力扣(LeetCode)
    题目:解题思路:    首先要明确一个问题:配对的左右括号不一定是相邻的,例如:([])。    由上述,'(','[','{'可能不会在遍历整个字符串的过程中,立即找到配对的括号。括号的配对原则是:当遍历到右括号时去看后出现的左括号是否与之配对,那么很容易想到满足后进先出......
  • 阿里巴巴技术面试题-第五篇
    说在前面本篇文章是阿里技术面试题目汇总第五篇。后续将持续推出互联网大厂,如阿里,腾讯,百度,美团,头条等技术面试题目,以及答案,专家出题人分析汇总。欢迎大家点赞关注转发。往期回顾题目1:一颗现代处理器,每秒大概可以执行多少条简单的MOV指令,有哪些主要的影响因素?出题人:阿里巴巴......
  • 互联网大厂技术面试题-阿里篇(四)
    题目1:有一批气象观测站,现需要获取这些站点的观测数据,并存储到Hive中。但是气象局只提供了api查询,每次只能查询单个观测点。那么如果能够方便快速地获取到所有的观测点的数据?出题人:阿里巴巴出题专家:江岚/阿里巴巴数据技术高级技术专家参考答案:A.通过shell或python等调用......
  • 【力扣热题100】[Java版] 刷题笔记-234. 回文链表
    题目:234.回文链表给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。解题思路回文定义:是指正读和反读都相同的字符序列。将链表数据获取出来,再通过前后指针向中间遍历,数据一致,则是回文;如果不一致则不是回文。......
  • 面试题精选04-使用Linq怎么将数据分组之后按时间排序取最新1条数据
    实体类publicclassMovie{publicstringName{get;set;}publicstringArea{get;set;}publicDateTimeProductTime{get;set;}}初始化数据publicstaticList<Movie>InitData(){List<Movie>data=newList<Movie>()......
  • 面试题精选03-单例服务内使用作用域服务会存在什么问题
    存在的问题由于单例服务的生命周期远远超过作用域服务的生命周期,因此可能会在作用域服务被销毁后,尝试使用已经不再有效的服务实例。解决办法不在单例服务内直接使用作用域服务,而是通过依赖注入获取作用域服务。例如,你可以将需要使用的作用域服务作为构造函数参数传递到单例服务......
  • java高频面试题(八股文)
    基础/集合1.ArrayList/LinkedList有什么区别?1、数据结构: 在数据结构上,ArrayList 和 LinkedList 都是 “线性表”,都继承于 Java 的 List 接口。另外 LinkedList 还实现了 Java 的 Deque 接口,是基于链表的栈或队列,与之对应的是 ArrayDeque 基于数组的栈或队......
  • JVM 场景面试题【强烈推荐】
    前言:前面系列文章让我们对JVM及垃圾回收相关的知识有了一个基本的了解,JVM的知识比较偏概念,当然也有一些底层的源码可以去研读,但多数来说我们了解了JVM的原理即可,本篇我们将基于前面分享的JVM相关的原理知识,提取一些JVM中场景的面试题,希望可以帮助到有需要的朋友。......
  • Spring Cloud 经典面试题
    一、谈谈SpringCloud优缺点? SpringCloud的优点是:集成度高、生态丰富、可扩展性强、功能全面。SpringCloud的缺点是:学习曲线陡峭、有一定的性能开销、组件迭代快版本多、管理复杂。集成度高:SpringCloud集成了多个成熟的微服务组件(如Eureka、Zuul、Ribbon、Hystrix、Sl......
  • 力扣题目解析--合并k个升序链表
    题目给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例1:输入:lists=[[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[1->4->5,1->3->4,2->6]将它们合并到一个有序链表中得到。1->1->......