鱼C论坛

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

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

[复制链接]
发表于 7 天前 | 显示全部楼层 |阅读模式

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

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

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

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

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

为啥OJ上测试出来结果是1.5,自己VS运行是正确的2.5呢?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

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

void insert(struct Tmp* tmp, double value) {
    tmp->a[tmp->len] = 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[p1] < nums2[p2]) {
            insert(&tmp, nums1[p1]);
            p1++;
        }
        else {
            insert(&tmp, nums2[p2]);
            p2++;
        }
        if (tmp.len == middle+1) {
            break;
        }
    }
    while (p1 >= nums1Size && tmp.len < middle+1) {
        insert(&tmp, nums2[p2]);
        p2++;
    }
    while (p2 >= nums2Size && tmp.len < middle+1) {
        insert(&tmp, nums1[p1]);
        p1++;
    }

    if ((nums1Size + nums2Size) % 2) {
        return tmp.a[middle];
    }
    else {
        return (tmp.a[middle-1] + tmp.a[middle]) / 2;
    }
}

int main() {
    int num1[] = { 1,2 };
    int num2[] = { 3,4 };
    double result = findMedianSortedArrays(num1, 2, num2, 2);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
你给出的代码有一些问题,导致在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[i] < nums2[j]) {
            merged[k++] = nums1[i++];
        } else {
            merged[k++] = nums2[j++];
        }
    }
    while (i < nums1Size) {
        merged[k++] = nums1[i++];
    }
    while (j < nums2Size) {
        merged[k++] = nums2[j++];
    }
    
    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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-19 14:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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