LeetCode:399.Evaluate Division 除法求值(C语言)

川长思鸟来 2023-01-02 13:29 242阅读 0赞

题目描述:
给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件,其中 equations[i] = [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi = values[i] 。每个 Ai 或 Bi 是一个表示单个变量的字符串。

另有一些以数组 queries 表示的问题,其中 queries[j] = [Cj, Dj] 表示第 j 个问题,请你根据已知条件找出 Cj / Dj = ? 的结果作为答案。

返回 所有问题的答案 。如果存在某个无法确定的答案,则用 -1.0 替代这个答案。

注意:输入总是有效的。你可以假设除法运算中不会出现除数为 0 的情况,且不存在任何矛盾的结果。

示例 1:

输入:equations = [[“a”,“b”],[“b”,“c”]], values = [2.0,3.0], queries = [[“a”,“c”],[“b”,“a”],[“a”,“e”],[“a”,“a”],[“x”,“x”]]
输出:[6.00000,0.50000,-1.00000,1.00000,-1.00000]
解释:
条件:a / b = 2.0, b / c = 3.0
问题:a / c = ?, b / a = ?, a / e = ?, a / a = ?, x / x = ?
结果:[6.0, 0.5, -1.0, 1.0, -1.0 ]

示例 2:

输入:equations = [[“a”,“b”],[“b”,“c”],[“bc”,“cd”]], values = [1.5,2.5,5.0], queries = [[“a”,“c”],[“c”,“b”],[“bc”,“cd”],[“cd”,“bc”]]
输出:[3.75000,0.40000,5.00000,0.20000]

示例 3:

输入:equations = [[“a”,“b”]], values = [0.5], queries = [[“a”,“b”],[“b”,“a”],[“a”,“c”],[“x”,“y”]]
输出:[0.50000,2.00000,-1.00000,-1.00000]

提示:

  1. 1 <= equations.length <= 20
  2. equations[i].length == 2
  3. 1 <= Ai.length, Bi.length <= 5
  4. values.length == equations.length
  5. 0.0 < values[i] <= 20.0
  6. 1 <= queries.length <= 20
  7. queries[i].length == 2
  8. 1 <= Cj.length, Dj.length <= 5
  9. Ai, Bi, Cj, Dj 由小写英文字母与数字组成

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/evaluate-division
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答:

  1. typedef struct {
  2. char *x;
  3. char *y;
  4. double z;
  5. UT_hash_handle hh;
  6. } Hash;
  7. Hash *hash;
  8. Hash* derive(Hash *p, double *t) {
  9. *t = 1;
  10. while (strcmp(p->x, p->y)) {
  11. *t *= p->z;
  12. char *s = p->y;
  13. HASH_FIND(hh, hash, s, strlen(s), p);
  14. }
  15. return p;
  16. }
  17. void _add(char *x, char *y, double z) {
  18. Hash *p1, *p2;
  19. HASH_FIND(hh, hash, x, strlen(x), p1);
  20. HASH_FIND(hh, hash, y, strlen(y), p2);
  21. if (p1 && p2) {
  22. //x、y已经出现过,若它们无联系,那么将他们合并关系
  23. double tx, ty;
  24. p1 = derive(p1, &tx);
  25. p2 = derive(p2, &ty);
  26. if (strcmp(p1->x, p2->x)) {
  27. p1->y = p2->x;
  28. p1->z = ty*z/tx;
  29. }
  30. } else if (p1) {
  31. double tx;
  32. p1 = derive(p1, &tx);
  33. Hash *p = malloc(sizeof(Hash));
  34. p->x = y;
  35. p->y = p1->x;
  36. p->z = tx/z;
  37. HASH_ADD_STR(hash, x, p);
  38. } else if (p2) {
  39. double ty;
  40. p2 = derive(p2, &ty);
  41. Hash *p = malloc(sizeof(Hash));
  42. p->x = x;
  43. p->y = p2->x;
  44. p->z = z/ty;
  45. HASH_ADD_STR(hash, x, p);
  46. } else {
  47. p1 = malloc(sizeof(Hash));
  48. p2 = malloc(sizeof(Hash));
  49. p1->x = x;
  50. p1->y = y;
  51. p1->z = z;
  52. HASH_ADD_STR(hash, x, p1);
  53. p2->x = y;
  54. p2->y = y;
  55. p2->z = 1;
  56. HASH_ADD_STR(hash, x, p2);
  57. }
  58. }
  59. double _div(char *x, char *y) {
  60. Hash *p1, *p2;
  61. HASH_FIND(hh, hash, x, strlen(x), p1);
  62. HASH_FIND(hh, hash, y, strlen(y), p2);
  63. if (p1 && p2) {
  64. double tx, ty;
  65. p1 = derive(p1, &tx);
  66. p2 = derive(p2, &ty);
  67. if (strcmp(p1->x, p2->x) == 0) {
  68. return tx/ty;
  69. }
  70. }
  71. return -1.0;
  72. }
  73. double* calcEquation(char *** equations, int equationsSize, int* equationsColSize, double* values, int valuesSize, char *** queries, int queriesSize, int* queriesColSize, int* returnSize){
  74. hash = NULL;
  75. for (int i=0; i<equationsSize; ++i) {
  76. _add(equations[i][0], equations[i][1], values[i]);
  77. }
  78. double *res = malloc(sizeof(double) * queriesSize);
  79. for (int i=0; i<queriesSize; ++i) {
  80. res[i] = _div(queries[i][0], queries[i][1]);
  81. }
  82. *returnSize = queriesSize;
  83. return res;
  84. }

运行结果 :
在这里插入图片描述

Notes:
完全参考https://leetcode-cn.com/problems/evaluate-division/solution/c-bing-cha-ji-by-dong-feng-32/

发表评论

表情:
评论列表 (有 0 条评论,242人围观)

还没有评论,来说两句吧...

相关阅读