风车呼呼呼 发表于 2025-2-12 23:19:09

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

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

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

测试用例:nums1=, nums2=

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

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct Tmp {
    double a;
    int len;
}tmp = {
    {0},
    0
};

void insert(struct Tmp* tmp, double value) {
    tmp->a = value;
    tmp->len++;
}

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
    int p1 = 0, p2 = 0, middle = (nums1Size + nums2Size) / 2;
    while (p1 < nums1Size && p2 < nums2Size) {
      if (nums1 < nums2) {
            insert(&tmp, nums1);
            p1++;
      }
      else {
            insert(&tmp, nums2);
            p2++;
      }
      if (tmp.len == middle+1) {
            break;
      }
    }
    while (p1 >= nums1Size && tmp.len < middle+1) {
      insert(&tmp, nums2);
      p2++;
    }
    while (p2 >= nums2Size && tmp.len < middle+1) {
      insert(&tmp, nums1);
      p1++;
    }

    if ((nums1Size + nums2Size) % 2) {
      return tmp.a;
    }
    else {
      return (tmp.a + tmp.a) / 2;
    }
}

int main() {
    int num1[] = { 1,2 };
    int num2[] = { 3,4 };
    double result = findMedianSortedArrays(num1, 2, num2, 2);
    return 0;
}

FishC 发表于 2025-2-12 23:19:25

你给出的代码有一些问题,导致在OJ上测试结果不正确。我们可以对代码进行修改来解决这些问题。以下是修改后的代码:

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

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
    int *merged = (int*)malloc((nums1Size + nums2Size) * sizeof(int));
    int i = 0, j = 0, k = 0;
   
    while (i < nums1Size && j < nums2Size) {
      if (nums1 < nums2) {
            merged = nums1;
      } else {
            merged = nums2;
      }
    }
    while (i < nums1Size) {
      merged = nums1;
    }
    while (j < nums2Size) {
      merged = nums2;
    }
   
    double median;
    if ((nums1Size + nums2Size) % 2 == 0) {
      median = (merged[(nums1Size + nums2Size) / 2 - 1] + merged[(nums1Size + nums2Size) / 2]) / 2.0;
    } else {
      median = merged[(nums1Size + nums2Size) / 2];
    }
   
    free(merged);
    return median;
}

int main() {
    int num1[] = {1, 2};
    int num2[] = {3, 4};
    double result = findMedianSortedArrays(num1, 2, num2, 2);
    printf("Median is: %.1f\n", result);
    return 0;
}

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: OJ测试结果与自己VS上运行不一致?