From af0fe8a168fc05f241d6250e701dcd7d8f04d9f7 Mon Sep 17 00:00:00 2001 From: Jeffrey Hsu Date: Mon, 29 Sep 2025 10:56:06 +0800 Subject: [PATCH] 976 --- include/solution/976.h | 11 +++++++ src/976.c | 27 ++++++++++++++++++ tests/test_976.cpp | 65 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 include/solution/976.h create mode 100644 src/976.c create mode 100644 tests/test_976.cpp diff --git a/include/solution/976.h b/include/solution/976.h new file mode 100644 index 0000000..156e3a2 --- /dev/null +++ b/include/solution/976.h @@ -0,0 +1,11 @@ +#ifndef INC_976_H +#define INC_976_H +#ifdef __cplusplus +extern "C" +{ +#endif +int largestPerimeter(int* nums, int numsSize); +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/976.c b/src/976.c new file mode 100644 index 0000000..34edd1e --- /dev/null +++ b/src/976.c @@ -0,0 +1,27 @@ +#include +#include + +int cmp(const void *a, const void *b) +{ + return *(const int *)b - *(const int *)a; +} + +int largestPerimeter(int *nums, int numsSize) +{ + qsort(nums, numsSize, sizeof(int), cmp); + int i = 0, j = 1; + + while (i < numsSize - 2 && j < numsSize - 1) + { + int k = j + 1; + if (nums[i] < nums[j] + nums[k]) + return nums[i] + nums[j] + nums[k]; + else + { + j++; + i++; + } + } + + return 0; +} diff --git a/tests/test_976.cpp b/tests/test_976.cpp new file mode 100644 index 0000000..bacb115 --- /dev/null +++ b/tests/test_976.cpp @@ -0,0 +1,65 @@ +#include +#include +// 测试类定义 +class LargestPerimeterTest : public ::testing::Test +{ + protected: + void AssertLargestPerimeter(std::vector input, int expected) + { + int *nums = new int[input.size()]; + std::copy(input.begin(), input.end(), nums); + + int result = largestPerimeter(nums, input.size()); + ASSERT_EQ(result, expected); + + delete[] nums; + } +}; + +// 示例 1 +TEST_F(LargestPerimeterTest, Example1) +{ + // 输入: nums = [2,1,2] + // 输出: 5 + AssertLargestPerimeter({2, 1, 2}, 5); +} + +// 示例 2 +TEST_F(LargestPerimeterTest, Example2) +{ + // 输入: nums = [1,2,1,10] + // 输出: 0 + AssertLargestPerimeter({1, 2, 1, 10}, 0); +} + +// 边界测试:最小输入 +TEST_F(LargestPerimeterTest, SmallestInput) +{ + // 输入: nums = [3,4,5] + // 输出: 12 + AssertLargestPerimeter({3, 4, 5}, 12); +} + +// 边界测试:无法组成三角形的情况 +TEST_F(LargestPerimeterTest, CannotFormTriangle) +{ + // 输入: nums = [1,1,2] + // 输出: 0 + AssertLargestPerimeter({1, 1, 2}, 0); +} + +// 边界测试:重复元素 +TEST_F(LargestPerimeterTest, RepeatedElements) +{ + // 输入: nums = [3,3,3,3,3] + // 输出: 9 + AssertLargestPerimeter({3, 3, 3, 3, 3}, 9); +} + +// 边界测试:无有效三角形 +TEST_F(LargestPerimeterTest, NoValidTriangle) +{ + // 输入: nums = [1,1,1,10] + // 输出: 3 + AssertLargestPerimeter({1, 1, 1, 10}, 3); +}