鱼C论坛

 找回密码
 立即注册
查看: 230|回复: 1

OJ测试结果与自己VS上运行不一致?

[复制链接]
发表于 2025-2-12 23:19:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 风车呼呼呼 于 2025-2-12 23:29 编辑

题目:
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

测试用例:nums1=[1,2], nums2=[3,4]

为啥OJ上测试出来结果是1.5,自己VS运行是正确的2.5呢?

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>

  4. struct Tmp {
  5.     double a[2000];
  6.     int len;
  7. }tmp = {
  8.     {0},
  9.     0
  10. };

  11. void insert(struct Tmp* tmp, double value) {
  12.     tmp->a[tmp->len] = value;
  13.     tmp->len++;
  14. }

  15. double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
  16.     int p1 = 0, p2 = 0, middle = (nums1Size + nums2Size) / 2;
  17.     while (p1 < nums1Size && p2 < nums2Size) {
  18.         if (nums1[p1] < nums2[p2]) {
  19.             insert(&tmp, nums1[p1]);
  20.             p1++;
  21.         }
  22.         else {
  23.             insert(&tmp, nums2[p2]);
  24.             p2++;
  25.         }
  26.         if (tmp.len == middle+1) {
  27.             break;
  28.         }
  29.     }
  30.     while (p1 >= nums1Size && tmp.len < middle+1) {
  31.         insert(&tmp, nums2[p2]);
  32.         p2++;
  33.     }
  34.     while (p2 >= nums2Size && tmp.len < middle+1) {
  35.         insert(&tmp, nums1[p1]);
  36.         p1++;
  37.     }

  38.     if ((nums1Size + nums2Size) % 2) {
  39.         return tmp.a[middle];
  40.     }
  41.     else {
  42.         return (tmp.a[middle-1] + tmp.a[middle]) / 2;
  43.     }
  44. }

  45. int main() {
  46.     int num1[] = { 1,2 };
  47.     int num2[] = { 3,4 };
  48.     double result = findMedianSortedArrays(num1, 2, num2, 2);
  49.     return 0;
  50. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-2-12 23:19:25 | 显示全部楼层
你给出的代码有一些问题,导致在OJ上测试结果不正确。我们可以对代码进行修改来解决这些问题。以下是修改后的代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
  4.     int *merged = (int*)malloc((nums1Size + nums2Size) * sizeof(int));
  5.     int i = 0, j = 0, k = 0;
  6.    
  7.     while (i < nums1Size && j < nums2Size) {
  8.         if (nums1[i] < nums2[j]) {
  9.             merged[k++] = nums1[i++];
  10.         } else {
  11.             merged[k++] = nums2[j++];
  12.         }
  13.     }
  14.     while (i < nums1Size) {
  15.         merged[k++] = nums1[i++];
  16.     }
  17.     while (j < nums2Size) {
  18.         merged[k++] = nums2[j++];
  19.     }
  20.    
  21.     double median;
  22.     if ((nums1Size + nums2Size) % 2 == 0) {
  23.         median = (merged[(nums1Size + nums2Size) / 2 - 1] + merged[(nums1Size + nums2Size) / 2]) / 2.0;
  24.     } else {
  25.         median = merged[(nums1Size + nums2Size) / 2];
  26.     }
  27.    
  28.     free(merged);
  29.     return median;
  30. }

  31. int main() {
  32.     int num1[] = {1, 2};
  33.     int num2[] = {3, 4};
  34.     double result = findMedianSortedArrays(num1, 2, num2, 2);
  35.     printf("Median is: %.1f\n", result);
  36.     return 0;
  37. }
复制代码


在这个版本的代码中,我们使用了额外的数组 merged 来存储合并后的数组,然后计算中位数。这样避免了原代码中的逻辑错误。

你的问题主要出现在以下几个方面:
- 没有正确地更新和使用结构体 Tmp
- 合并数组时的逻辑存在问题。
- 中位数计算时没有正确按照数组长度的奇偶性分别处理。

希望这些修改对你有帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-10 00:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表