C语言 | Leetcode C语言题解之第399题除法求值

news2024/9/27 5:42:10

题目:

题解:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

typedef struct hash_node_t
{
    char *key;
    double val;
    int distinguish_flag; // 用于区分不同的关系
    struct hash_node_t *p_next;
}HASH_NODE_T;

typedef struct hash_t
{
    HASH_NODE_T **hash_arr;
    int size;
}HASH_T;

HASH_T *hash_init(int size)
{
    HASH_T *hash_head = (HASH_T *)malloc(1 * sizeof(HASH_T));
    hash_head->hash_arr = (HASH_NODE_T **)calloc(26, sizeof(HASH_NODE_T *));
    hash_head->size = size;

    return hash_head;
}

bool hash_compare(HASH_T *hash_head, char *key, char *key1)
{
    int distinguish_flag = 0, distinguish_flag1 = 0;
    int pos = key[0] % hash_head->size;
    int pos1 = key1[0] % hash_head->size;
    HASH_NODE_T *now_node = hash_head->hash_arr[pos];
    HASH_NODE_T *now_node1 = hash_head->hash_arr[pos1];

    while(now_node)
    {
        if(!strcmp(now_node->key, key))
        {
            distinguish_flag = now_node->distinguish_flag;
            break;
        }
        now_node = now_node->p_next;
    }

    while(now_node1)
    {
        if(!strcmp(now_node1->key, key1))
        {
            distinguish_flag1 = now_node1->distinguish_flag;
            break;
        }
        now_node1 = now_node1->p_next;
    }

    if(distinguish_flag == distinguish_flag1)
    {
        return true;
    }

    return false;
}

HASH_NODE_T *hash_find(HASH_T *hash_head, char *key)
{
    int pos = key[0] % hash_head->size;
    HASH_NODE_T *now_node = hash_head->hash_arr[pos];

    while(now_node)
    {
        if(!strcmp(now_node->key, key))
        {
            break;
        }
        now_node = now_node->p_next;
    }

    return now_node;
}

void hash_put(HASH_T *hash_head, char *key, double val, int distinguish_flag)
{
    int pos = key[0] % hash_head->size;
    HASH_NODE_T *now_node = hash_head->hash_arr[pos];
    HASH_NODE_T *new_node = NULL;

    if(NULL == hash_find(hash_head, key)) // 哈希表没有这个键值
    {
        new_node = (HASH_NODE_T *)malloc(1 * sizeof(HASH_NODE_T));
        new_node->key = key;
        new_node->val = val;
        new_node->distinguish_flag = distinguish_flag;
        new_node->p_next = now_node;
        hash_head->hash_arr[pos] = new_node;
    }
}

void deal_flag_arr(char*** equations, int equationsSize, double* values, int *flag_arr, int index, HASH_T *hash_head, int distinguish_flag) // 优先处理后续有相关关系的方程
{
    double hash_val_0 = 0, hash_val_1 = 0; // 用于充当当前键值

    for(int i = 1; i < equationsSize; i++)
    {
        if(flag_arr[i])
        {
            continue;
        }
        if(!strcmp(equations[i][0], equations[index][0]))
        {
            hash_val_0 = hash_find(hash_head, equations[index][0])->val;
            hash_val_1 = hash_val_0 / values[i];
        }
        else if(!strcmp(equations[i][0], equations[index][1]))
        {
            hash_val_0 = hash_find(hash_head, equations[index][1])->val;
            hash_val_1 = hash_val_0 / values[i];
        }
        else if(!strcmp(equations[i][1], equations[index][0]))
        {
            hash_val_1 = hash_find(hash_head, equations[index][0])->val;
            hash_val_0 = hash_val_1 * values[i];
        }
        else if(!strcmp(equations[i][1], equations[index][1]))
        {
            hash_val_1 = hash_find(hash_head, equations[index][1])->val;
            hash_val_0 = hash_val_1 * values[i];
        }
        else
        {
            continue;
        }

        flag_arr[i] = 1;
        hash_put(hash_head, equations[i][0], hash_val_0, distinguish_flag);
        hash_put(hash_head, equations[i][1], hash_val_1, distinguish_flag);

        deal_flag_arr(equations, equationsSize, values, flag_arr, i, hash_head, distinguish_flag); // 寻找后续是否存在已有的对应关系
    }
}

double hash_node_val(HASH_T *hash_head, char *equations)
{
    double hash_val = 0;
    HASH_NODE_T *now_node = hash_find(hash_head, equations); // 当前哈希节点

    if(now_node)
    {
        hash_val = now_node->val;
    }
    else
    {
        hash_val = -1;
    }

    return hash_val;
}

double* calcEquation(char*** equations, int equationsSize, int* equationsColSize, double* values, int valuesSize, char*** queries, int queriesSize, int* queriesColSize, int* returnSize) {
    HASH_T *hash_head = hash_init(26);
    double *return_arr = (double *)malloc(queriesSize * sizeof(double));
    double hash_val_0 = 0, hash_val_1 = 0; // 用于充当当前键值
    int *flag_arr = (int *)calloc(equationsSize, sizeof(int)); // 用于记录该对应关系是否已经判断过
    *returnSize = queriesSize;
    int distinguish_flag = 0; // 用于区分不同的关系
    bool equation_flag = false; // 用于区分不同的关系

    for(int i = 0; i < equationsSize; i++) // 把所有已知对应关系放入哈希表
    {
        if(flag_arr[i]) // 跳过已经使用过的对应关系
        {
            continue;
        }

        distinguish_flag++;

        hash_val_0 = hash_node_val(hash_head, equations[i][0]);
        hash_val_1 = hash_node_val(hash_head, equations[i][1]);

        if(-1 == hash_val_0 && -1 == hash_val_1) // 键值计算
        {
            hash_val_1 = distinguish_flag;
            hash_val_0 = hash_val_1 * values[i];
        }
        else if(-1 == hash_val_0 && -1 != hash_val_1)
        {
            distinguish_flag = hash_find(hash_head, equations[i][1])->distinguish_flag;
            hash_val_0 = hash_val_1 * values[i];
        }
        else if(-1 != hash_val_0 && -1 == hash_val_1)
        {
            distinguish_flag = hash_find(hash_head, equations[i][0])->distinguish_flag;
            hash_val_1 = hash_val_0 / values[i];
        }

        hash_put(hash_head, equations[i][0], hash_val_0, distinguish_flag);
        hash_put(hash_head, equations[i][1], hash_val_1, distinguish_flag);

        deal_flag_arr(equations, equationsSize, values, flag_arr, i, hash_head, distinguish_flag); // 寻找后续是否存在已有的对应关系
    }

    for(int i = 0; i < queriesSize; i++) // 开始计算查询数据结果
    {
        equation_flag = hash_compare(hash_head, queries[i][0], queries[i][1]); // 比对二者是否处于同一个关系对应体系中
        if(!equation_flag)
        {
            return_arr[i] = -1;
            continue;
        }

        hash_val_0 = hash_node_val(hash_head, queries[i][0]);
        hash_val_1 = hash_node_val(hash_head, queries[i][1]);

        if(-1 == hash_val_0 || -1 == hash_val_1) // 结果计算
        {
            return_arr[i] = -1;
        }
        else
        {
            return_arr[i] = hash_val_0 / hash_val_1;
        }
    }

    return return_arr;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2137807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

clip论文阅读(Learning Transferable Visual Models From Natural Language Supervision)

目录 摘要训练pre-train model的过程将pre-train model应用于下游任务应用&#xff08;待更新&#xff09; 论文/项目地址&#xff1a;https://github.com/OpenAI/CLIP 提供了clip的pre-trained model的权重&#xff0c;也可安装使用pre-trained model 摘要 使用标签标注的图…

【IEEEACM Fellow、CCF组委】第三届人工智能与智能信息处理国际学术会议(AIIIP 2024)

第三届人工智能与智能信息处理国际学术会议&#xff08;AIIIP 2024&#xff09; 2024 3rd International Conference on Artificial Intelligence and Intelligent Information Processing 中国-天津 | 2024年10月25-27日 | 会议官网&#xff1a;www.aiiip.net 会…

【CTF MISC】XCTF GFSJ1086 [简单] 简单的base编码 Writeup(Base64编码+循环解码+Base92编码)

[简单] 简单的base编码 你懂base编码吗&#xff1f; 工具 在线BASE92编码解码&#xff1a;https://ctf.bugku.com/tool/base92 解法 Vm0wd2QyUXlVWGxWV0d4V1YwZDRWMVl3WkRSV01WbDNXa1JTVjAxV2JETlhhMUpUVmpBeFYySkVUbGhoTVVwVVZtcEJlRll5U2tWVWJHaG9UVlZ3VlZadGNFSmxSbGw1V…

数据集 wider person 户外密集行人检测 >> DataBall

数据集 wider person 用于野外密集行人检测的多样化数据集 行人检测 目标检测 户外密集行人检测的多样化数据集 WiderPerson: A Diverse Dataset for Dense Pedestrian Detection in the Wild article{zhang2019widerperson, Author {Zhang, Shifeng and Xie, Yiliang and Wa…

蛋白质结构变换中的四元数和旋转矩阵介绍

在蛋白质结构变换中,四元数和旋转矩阵都是用来描述旋转的重要工具。 一、旋转矩阵 定义与形式: 旋转矩阵是一个 33 的矩阵,用于将一个向量在三维空间中进行旋转操作。它可以表示为:其中,每个元素都是实数,且满足一定的正交性条件,即旋转矩阵的逆等于它的转置。作用原理…

Stanley算法原理

Stanley Controller与Pure Pursuit算法类似&#xff0c;其同样是基于几何追踪的轨迹跟踪控制器&#xff0c;但是与Pure Pursuit不同的是&#xff0c;Stanley Controller算法基于前轮中心点为参考点进行控制&#xff0c;没有预瞄距离&#xff0c;以前轮中心点与最近参考轨迹点进…

『功能项目』切换职业面板【48】

我们打开上一篇47技能冷却蒙版的项目&#xff0c; 本章要做的事情是切换职业UI面板的功能 首先双击打开Canvas预制体在左上主角面板信息中新建一个button按钮 重命名&#xff08;父物体是按钮Button&#xff0c;子物体Image即可&#xff09; 创建一个Image 设计一下布局 复制三…

每日学习一个数据结构-B+树

文章目录 什么是B树示意图B树的基本特点B树的优点B树的应用场 B树分裂和合并的机制节点分裂节点合并注意事项 什么是B树 B树是一种自平衡的树数据结构&#xff0c;广泛应用于数据库和操作系统的索引结构中&#xff0c;特别是在MySQL的InnoDB存储引擎中。它通过保持数据排序&am…

Linux基础-Makefile的编写、以及编写第一个Linux程序:进度条(模拟在 方便下载的同时,更新图形化界面)

目录 一、Linux项目自动化构建工具-make/Makefile ​编辑 背景&#xff1a; makefile小技巧&#xff1a; 二、Linux第一个小程序&#xff0d;进度条 先导&#xff1a; 1.如何利用/r,fflush(stdout)来实现我们想要的效果&#xff1b; 2.写一个倒计时&#xff1a; 进度条…

[数据集][目标检测]智慧交通铁路人员危险行为躺站坐检测数据集VOC+YOLO格式3766张4类别

图片数量(jpg文件个数)&#xff1a;3766 标注数量(xml文件个数)&#xff1a;3766 标注数量(txt文件个数)&#xff1a;3766 标注类别数&#xff1a;4 标注类别名称:["sitting","sleeping","standing","track"] 每个类别标注的框数&…

可解释性机器学习中的局部解释

可解释性机器学习可以被分成两大类&#xff0c;第一大类叫做局部的解释&#xff0c;第二大类叫做全局的 解释&#xff0c;如图 1 所示。局部的解释是&#xff0c;比如有一个图像分类器&#xff0c;输入一张图片&#xff0c;它会判断出 是一只猫&#xff0c;机器要回答问题是为什…

微分方程人口模型以及Matlab代码实现

马尔萨斯模型 模型假设 1.设x(t)表示t时刻的人口数,且x(t)连续可微。 2.人口的增长率r是常数(增长率出生率-死亡率)。 3.人口数量的变化是封闭的,即没有人口迁移&#xff0c;且人口数量的增加与减少只取决于人口中个体的生育和死亡,且每一个体都具有同样的生育能力与死亡率。…

Parallels Desktop 20 for Mac中文版发布了?会哪些新功能

Parallels Desktop 20 for Mac 正式发布&#xff0c;完全支持 macOS Sequoia 和 Windows 11 24H2&#xff0c;并且在企业版中引入了全新的管理门户。 据介绍&#xff0c;新版本针对 Windows、macOS 和 Linux 虚拟机进行了大量更新&#xff0c;最大的亮点是全新推出的 Parallels…

项目升级必备!TS装饰器:简化代码、增加功能的利器 | TypeScript入门指南07

嘿&#xff0c;朋友&#xff01;听说过TS里的装饰器没&#xff1f;就像给代码加了个‘魔法贴’&#xff0c;轻轻一点&#xff0c;功能升级&#xff0c;结构清晰。这篇文章&#xff0c;咱们聊聊这背后的魔法是怎么一回事&#xff01; ts 入门指南系列 Ts vs Js 谁适合前端开发&a…

【笔记】位运算

文章目录 位运算简介与运算&或运算|异或运算^证明 取反~左移<<右移>> 位运算技巧判断奇偶性求出x二进制的第i位将二进制的第i位设置成1将二进制的第i位设置成0判断是否为2的若干次方获取x的最低位的1用lowbit运算统计1的个数例题 位运算简介 位运算&#xff1…

【吊打面试官系列-Redis面试题】使用过 Redis 分布式锁么,它是什么回事?

大家好&#xff0c;我是锋哥。今天分享关于【使用过 Redis 分布式锁么&#xff0c;它是什么回事&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 使用过 Redis 分布式锁么&#xff0c;它是什么回事&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资…

对目录的操作、获取文件信息

目录 一、目录操作 二、获取文件的相关信息 1、演示获取文件的相关信息 2、注意事项和细节 一、目录操作 需求&#xff1a; 1&#xff09;创建一级目录 d://aaa 2&#xff09;创建多级目录 d://bbb//ccc 3&#xff09;删除目录 d://aaa和d://bbb//ccc import os# 1&am…

自定义AI模型的调优、部署与评测

为了让大语言模型的AI能力更贴近业务需求&#xff0c;本文详细介绍了在阿里云百炼创建自定义模型的最佳实践。即便不清楚大模型的技术细节&#xff0c;您也能按照本篇的操作指引创建一个有效的自定义模型&#xff0c;从而轻松地为业务场景添加大模型服务能力。 自定义模型概述…

深度学习数据集交通类常见图像分类、目标检测、分割图像数据集(深度学习数据集 - 交通类解决方案)

深度学习数据集 - 交通类解决方案 引言&#xff1a; 随着自动驾驶技术的发展以及智能交通系统的普及&#xff0c;对于高质量、多样化的交通数据集的需求日益增长。我们提供一系列精心准备的数据集&#xff0c;旨在帮助研究人员和工程师解决实际问题&#xff0c;推动技术创新。…

arcgisPro修改要素XY容差

1、在arcgisPro中XY容差的默认值为1个毫米&#xff0c;及0.001米。为了更精细的数据&#xff0c;需要提高这个精度&#xff0c;如何提高呢&#xff1f; 2、如果直接在数据库下新建要素类&#xff0c;容差只能调至0.0002米。所以&#xff0c;需要在数据库下新建要素数据集。 3…