diff --git a/include/solution/345.h b/include/solution/345.h new file mode 100644 index 0000000..56f1f6e --- /dev/null +++ b/include/solution/345.h @@ -0,0 +1,11 @@ +#ifndef INC_345_H +#define INC_345_H +#ifdef __cplusplus +extern "C" +{ +#endif + char *reverseVowels(char *s); +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/345.c b/src/345.c new file mode 100644 index 0000000..36d403e --- /dev/null +++ b/src/345.c @@ -0,0 +1,32 @@ +#include +#include + +#define equal(x) \ + ((x) == 'a' || (x) == 'A' || (x) == 'e' || (x) == 'E' || (x) == 'i' || (x) == 'I' || (x) == 'o' || (x) == 'O' || \ + (x) == 'u' || (x) == 'U') + +#define swap(x, y, cb) \ + do \ + { \ + char t = x; \ + x = y; \ + y = t; \ + cb; \ + } while (0) + +char *reverseVowels(char *s) +{ + for (int i = 0, j = strlen(s) - 1, f = 1; i < j;) + { + if (f && equal(s[i])) + f = 0; + else if (f) + i++; + else if (!f && equal(s[j])) + swap(s[i], s[j], (f = 1, i++, j--)); + else + j--; + } + + return s; +} \ No newline at end of file diff --git a/tests/test_345.cpp b/tests/test_345.cpp new file mode 100644 index 0000000..f9d0bd4 --- /dev/null +++ b/tests/test_345.cpp @@ -0,0 +1,29 @@ +#include +#include + +class ReverseVowelsTest : public ::testing::Test +{ + protected: + // 测试包装器 + void AssertReverseVowels(const std::string &input, const std::string &expected) + { + char buffer[1024]; + strncpy(buffer, input.c_str(), sizeof(buffer)); + buffer[sizeof(buffer) - 1] = '\0'; // 保证结尾 + + char *result = reverseVowels(buffer); + EXPECT_STREQ(result, expected.c_str()); + } +}; + +// 示例 1 +TEST_F(ReverseVowelsTest, Example1) +{ + AssertReverseVowels("IceCreAm", "AceCreIm"); +} + +// 示例 2 +TEST_F(ReverseVowelsTest, Example2) +{ + AssertReverseVowels("leetcode", "leotcede"); +}