Compare commits
53 Commits
572479248d
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 6e2206cabe | |||
| 89a41445ef | |||
| cdb5602c47 | |||
| 3559f83475 | |||
| 6f30721f1b | |||
| 9a8260a3b6 | |||
| fc2fd50bac | |||
| aa3f652a8f | |||
| b6a1850f48 | |||
| 737c8e17dd | |||
| 2cf5db11bd | |||
| 7ae0aeb744 | |||
| cf633352b5 | |||
| 45162bb934 | |||
| dc222231e6 | |||
| 8fadb725e1 | |||
| e862aea336 | |||
| e580f911cb | |||
| 727096b8e6 | |||
| 36c5339b1f | |||
| 2e8537eb7f | |||
| 6731384638 | |||
| 91167d0d3b | |||
| fc2d54f926 | |||
| c0a4f0649b | |||
| 050164b61b | |||
| af0fe8a168 | |||
| f6e998beff | |||
| 5f7ef7b880 | |||
| b9a758a025 | |||
| cb718130f7 | |||
| f54c320ebf | |||
| 6df3e30818 | |||
| 2a7d5ed0cc | |||
| 882ac55f7f | |||
| bb4071ea04 | |||
| 4b5d8c5c22 | |||
| e924811683 | |||
| e3b069be8c | |||
| 084c5f7e11 | |||
| 33f3b72bfa | |||
| 3fcbb0e5ad | |||
| 72843d1812 | |||
| ec59538a98 | |||
| ed2072aef8 | |||
| 7325a22989 | |||
| 321cb6c439 | |||
| 98b0294f80 | |||
| 58a56e3926 | |||
| 44e5b938c9 | |||
| 3d6aa12717 | |||
| 5f09521d43 | |||
| c69a6b5ca9 |
36
.gitea/workflows/test.yaml
Normal file
36
.gitea/workflows/test.yaml
Normal file
@@ -0,0 +1,36 @@
|
||||
name: Gitea CTest Workflow
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "main", "master" ]
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout Code
|
||||
run: |
|
||||
git clone https://cantyonion.site/git/cantyonion/leetcode.git .
|
||||
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
sudo sed -i 's@//.*archive.ubuntu.com@//mirrors.ustc.edu.cn@g' /etc/apt/sources.list.d/ubuntu.sources
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y build-essential cmake
|
||||
|
||||
- name: Configure CMake
|
||||
# -B build 创建构建目录,-S . 指定源代码在当前目录
|
||||
run: cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
|
||||
|
||||
- name: Build with CMake
|
||||
# 使用 --parallel 充分利用 Runner 核心数
|
||||
run: cmake --build build --parallel $(nproc)
|
||||
|
||||
- name: Run CTest via CMake
|
||||
# 在 build 目录下运行 ctest
|
||||
# --output-on-failure 可以在测试失败时直接看到 log
|
||||
run: |
|
||||
cd build
|
||||
ctest --output-on-failure --parallel $(nproc)
|
||||
@@ -1,9 +1,15 @@
|
||||
cmake_minimum_required(VERSION 3.30)
|
||||
cmake_minimum_required(VERSION 3.25)
|
||||
project(leetcode C CXX)
|
||||
|
||||
set(CMAKE_C_STANDARD 11)
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
set(GTEST_VERSION 1.17.0)
|
||||
enable_testing()
|
||||
|
||||
if (MSVC)
|
||||
message(FATAL_ERROR "MSVC is not supported. Please use GCC or Clang.")
|
||||
endif ()
|
||||
|
||||
include_directories(include)
|
||||
|
||||
@@ -12,9 +18,6 @@ include(FetchContent)
|
||||
add_compile_options(
|
||||
-Wall
|
||||
-Wextra
|
||||
-O0
|
||||
-g3
|
||||
-fno-omit-frame-pointer
|
||||
)
|
||||
|
||||
if (UNIX)
|
||||
@@ -25,50 +28,17 @@ if (UNIX)
|
||||
add_link_options(
|
||||
-fsanitize=address
|
||||
-fsanitize=undefined
|
||||
-lm
|
||||
)
|
||||
endif ()
|
||||
|
||||
FetchContent_Declare(
|
||||
googletest
|
||||
URL https://github.com/google/googletest/releases/download/v1.15.2/googletest-1.15.2.tar.gz
|
||||
URL_HASH MD5=7e11f6cfcf6498324ac82d567dcb891e
|
||||
URL https://gh-proxy.org/https://github.com/google/googletest/releases/download/v${GTEST_VERSION}/googletest-${GTEST_VERSION}.tar.gz
|
||||
)
|
||||
|
||||
FetchContent_MakeAvailable(googletest)
|
||||
|
||||
add_executable(13 src/13.c)
|
||||
add_executable(88 src/88.c)
|
||||
add_executable(100 src/100.c)
|
||||
add_executable(101 src/101.c)
|
||||
add_executable(104 src/104.c)
|
||||
add_executable(108 src/108.c)
|
||||
add_executable(110 src/110.c)
|
||||
add_executable(111 src/111.c)
|
||||
add_executable(112 src/119.c)
|
||||
add_executable(136 src/136.c)
|
||||
add_executable(141 src/141.c)
|
||||
add_executable(144 src/144.c)
|
||||
add_executable(145 src/145.c)
|
||||
add_executable(160 src/160.c)
|
||||
add_executable(168 src/168.c)
|
||||
add_executable(169 src/169.c)
|
||||
add_executable(171 src/171.c)
|
||||
add_executable(190 src/190.c)
|
||||
add_executable(191 src/191.c)
|
||||
add_executable(202 src/202.c)
|
||||
add_executable(219 src/219.c)
|
||||
add_executable(225 src/225.c)
|
||||
add_executable(228 src/228.c)
|
||||
add_executable(231 src/231.c)
|
||||
add_executable(258 src/258.c)
|
||||
add_executable(263 src/263.c)
|
||||
add_executable(268 src/268.c)
|
||||
add_executable(278 src/278.c)
|
||||
add_executable(338 src/338.c)
|
||||
add_executable(374 src/374.c)
|
||||
add_executable(2786 src/2786.c)
|
||||
add_executable(3110 src/3110.c)
|
||||
|
||||
file(GLOB SRC_FILES "src/*.c")
|
||||
|
||||
set(EXECUTABLE_SOURCES
|
||||
@@ -96,7 +66,6 @@ set(EXECUTABLE_SOURCES
|
||||
"${CMAKE_SOURCE_DIR}/src/225.c"
|
||||
"${CMAKE_SOURCE_DIR}/src/228.c"
|
||||
"${CMAKE_SOURCE_DIR}/src/231.c"
|
||||
"${CMAKE_SOURCE_DIR}/src/258.c"
|
||||
"${CMAKE_SOURCE_DIR}/src/263.c"
|
||||
"${CMAKE_SOURCE_DIR}/src/268.c"
|
||||
"${CMAKE_SOURCE_DIR}/src/278.c"
|
||||
@@ -106,6 +75,11 @@ set(EXECUTABLE_SOURCES
|
||||
"${CMAKE_SOURCE_DIR}/src/3110.c"
|
||||
)
|
||||
|
||||
foreach (src_file IN LISTS EXECUTABLE_SOURCES)
|
||||
get_filename_component(exe_name "${src_file}" NAME_WE)
|
||||
add_executable(${exe_name} ${src_file})
|
||||
endforeach ()
|
||||
|
||||
set(LIBRARY_SOURCES)
|
||||
|
||||
foreach (SRC_FILE ${SRC_FILES})
|
||||
|
||||
16
include/solution/1025.h
Normal file
16
include/solution/1025.h
Normal file
@@ -0,0 +1,16 @@
|
||||
// This file is generated by mkfile.py
|
||||
// Date: 2025-12-05
|
||||
|
||||
#ifndef INC_1025_H
|
||||
#define INC_1025_H
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
bool divisorGame(int n);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif // INC_1025_H
|
||||
14
include/solution/1039.h
Normal file
14
include/solution/1039.h
Normal file
@@ -0,0 +1,14 @@
|
||||
// This file is generated by mkfile.py
|
||||
// Date: 2025-09-29
|
||||
|
||||
#ifndef INC_1039_H
|
||||
#define INC_1039_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int minScoreTriangulation(int *values, int valuesSize);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif // INC_1039_H
|
||||
14
include/solution/1137.h
Normal file
14
include/solution/1137.h
Normal file
@@ -0,0 +1,14 @@
|
||||
// This file is generated by mkfile.py
|
||||
// Date: 2025-12-05
|
||||
|
||||
#ifndef INC_1137_H
|
||||
#define INC_1137_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int tribonacci(int n);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif // INC_1137_H
|
||||
11
include/solution/1233.h
Normal file
11
include/solution/1233.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#ifndef INC_1233_H
|
||||
#define INC_1233_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
char **removeSubfolders(char **folder, int folderSize, int *returnSize);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
12
include/solution/1290.h
Normal file
12
include/solution/1290.h
Normal file
@@ -0,0 +1,12 @@
|
||||
#ifndef INC_1290_H
|
||||
#define INC_1290_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
#include <ListNode.h>
|
||||
int getDecimalValue(struct ListNode *head);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
17
include/solution/1353.h
Normal file
17
include/solution/1353.h
Normal file
@@ -0,0 +1,17 @@
|
||||
//
|
||||
// Created by gint on 2025/7/7.
|
||||
//
|
||||
|
||||
#ifndef INC_1353_H
|
||||
#define INC_1353_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
int maxEvents(int **events, int eventsSize, int *eventsColSize);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif // INC_1353_H
|
||||
15
include/solution/1534.h
Normal file
15
include/solution/1534.h
Normal file
@@ -0,0 +1,15 @@
|
||||
//
|
||||
// Created by xfj12 on 2025/4/14.
|
||||
//
|
||||
|
||||
#ifndef INC_1534_H
|
||||
#define INC_1534_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int countGoodTriplets(int *arr, int arrSize, int a, int b, int c);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif // INC_1534_H
|
||||
14
include/solution/1668.h
Normal file
14
include/solution/1668.h
Normal file
@@ -0,0 +1,14 @@
|
||||
// This file is generated by mkfile.py
|
||||
// Date: 2025-12-05
|
||||
|
||||
#ifndef INC_1668_H
|
||||
#define INC_1668_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int maxRepeating(char *sequence, char *word);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif // INC_1668_H
|
||||
11
include/solution/1717.h
Normal file
11
include/solution/1717.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#ifndef INC_1717_H
|
||||
#define INC_1717_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int maximumGain(char *s, int x, int y);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
11
include/solution/1900.h
Normal file
11
include/solution/1900.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#ifndef INC_1900_H
|
||||
#define INC_1900_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int *earliestAndLatest(int n, int firstPlayer, int secondPlayer, int *returnSize);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
11
include/solution/1957.h
Normal file
11
include/solution/1957.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#ifndef INC_1957_H
|
||||
#define INC_1957_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
char *makeFancyString(char *s);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
11
include/solution/2163.h
Normal file
11
include/solution/2163.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#ifndef INC_2163_H
|
||||
#define INC_2163_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
long long minimumDifference(int *nums, int numsSize);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
36
include/solution/232.h
Normal file
36
include/solution/232.h
Normal file
@@ -0,0 +1,36 @@
|
||||
#ifndef INC_232_H
|
||||
#define INC_232_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
#include <stdbool.h>
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int *base;
|
||||
int ptr;
|
||||
int size;
|
||||
} stack;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
stack *s1;
|
||||
stack *s2;
|
||||
} MyQueue;
|
||||
|
||||
MyQueue *myQueueCreate();
|
||||
|
||||
void myQueuePush(MyQueue *obj, int x);
|
||||
|
||||
int myQueuePop(MyQueue *obj);
|
||||
|
||||
int myQueuePeek(MyQueue *obj);
|
||||
|
||||
bool myQueueEmpty(MyQueue *obj);
|
||||
|
||||
void myQueueFree(MyQueue *obj);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
11
include/solution/2410.h
Normal file
11
include/solution/2410.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#ifndef INC_2410_H
|
||||
#define INC_2410_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int matchPlayersAndTrainers(int *players, int playersSize, int *trainers, int trainersSize);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
11
include/solution/258.h
Normal file
11
include/solution/258.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#ifndef INC_258_H
|
||||
#define INC_258_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int addDigits(int num);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
15
include/solution/2712.h
Normal file
15
include/solution/2712.h
Normal file
@@ -0,0 +1,15 @@
|
||||
//
|
||||
// Created by xfj12 on 2025/3/27.
|
||||
//
|
||||
|
||||
#ifndef INC_2712_H
|
||||
#define INC_2712_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
long long minimumCost(char *s);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif // INC_2712_H
|
||||
15
include/solution/2716.h
Normal file
15
include/solution/2716.h
Normal file
@@ -0,0 +1,15 @@
|
||||
//
|
||||
// Created by xfj12 on 2025/3/28.
|
||||
//
|
||||
|
||||
#ifndef INC_2716_H
|
||||
#define INC_2716_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int minimizedStringLength(char *s);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif // INC_2716_H
|
||||
12
include/solution/290.h
Normal file
12
include/solution/290.h
Normal file
@@ -0,0 +1,12 @@
|
||||
#ifndef INC_290_H
|
||||
#define INC_290_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
#include <stdbool.h>
|
||||
bool wordPattern(char *pattern, char *s);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
21
include/solution/303.h
Normal file
21
include/solution/303.h
Normal file
@@ -0,0 +1,21 @@
|
||||
#ifndef INC_303_H
|
||||
#define INC_303_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
typedef struct
|
||||
{
|
||||
int *data;
|
||||
int size;
|
||||
} NumArray;
|
||||
|
||||
NumArray *numArrayCreate(int *nums, int numsSize);
|
||||
|
||||
int numArraySumRange(NumArray *obj, int left, int right);
|
||||
|
||||
void numArrayFree(NumArray *obj);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
12
include/solution/3136.h
Normal file
12
include/solution/3136.h
Normal file
@@ -0,0 +1,12 @@
|
||||
#ifndef INC_3136_H
|
||||
#define INC_3136_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
#include <stdbool.h>
|
||||
bool isValid(char *word);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
15
include/solution/3169.h
Normal file
15
include/solution/3169.h
Normal file
@@ -0,0 +1,15 @@
|
||||
//
|
||||
// Created by gint on 2025/7/11.
|
||||
//
|
||||
|
||||
#ifndef INC_3169_H
|
||||
#define INC_3169_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int countDays(int days, int **meetings, int meetingsSize, int *meetingsColSize);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif // INC_3169_H
|
||||
11
include/solution/3201.h
Normal file
11
include/solution/3201.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#ifndef INC_3201_H
|
||||
#define INC_3201_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int maximumLength(int *nums, int numsSize);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
11
include/solution/3202.h
Normal file
11
include/solution/3202.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#ifndef INC_3202_H
|
||||
#define INC_3202_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int maximumLength(int *nums, int numsSize, int k);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
12
include/solution/326.h
Normal file
12
include/solution/326.h
Normal file
@@ -0,0 +1,12 @@
|
||||
#ifndef INC_326_H
|
||||
#define INC_326_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
#include <stdbool.h>
|
||||
bool isPowerOfThree(int n);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
14
include/solution/3397.h
Normal file
14
include/solution/3397.h
Normal file
@@ -0,0 +1,14 @@
|
||||
// This file is generated by mkfile.py
|
||||
// Date: 2025-10-18
|
||||
|
||||
#ifndef INC_3397_H
|
||||
#define INC_3397_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int maxDistinctElements(int* nums, int numsSize, int k);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif // INC_3397_H
|
||||
11
include/solution/345.h
Normal file
11
include/solution/345.h
Normal file
@@ -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
|
||||
11
include/solution/387.h
Normal file
11
include/solution/387.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#ifndef INC_387_H
|
||||
#define INC_387_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int firstUniqChar(char *s);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
12
include/solution/392.h
Normal file
12
include/solution/392.h
Normal file
@@ -0,0 +1,12 @@
|
||||
#ifndef INC_392_H
|
||||
#define INC_392_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
#include <stdbool.h>
|
||||
bool isSubsequence(char *s, char *t);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
14
include/solution/509.h
Normal file
14
include/solution/509.h
Normal file
@@ -0,0 +1,14 @@
|
||||
// This file is generated by mkfile.py
|
||||
// Date: 2025-12-05
|
||||
|
||||
#ifndef INC_509_H
|
||||
#define INC_509_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int fib(int n);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif // INC_509_H
|
||||
14
include/solution/746.h
Normal file
14
include/solution/746.h
Normal file
@@ -0,0 +1,14 @@
|
||||
// This file is generated by mkfile.py
|
||||
// Date: 2025-12-05
|
||||
|
||||
#ifndef INC_746_H
|
||||
#define INC_746_H
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
int minCostClimbingStairs(int *cost, int costSize);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif // INC_746_H
|
||||
11
include/solution/976.h
Normal file
11
include/solution/976.h
Normal file
@@ -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
|
||||
41
mkfile.py
Executable file
41
mkfile.py
Executable file
@@ -0,0 +1,41 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
import sys
|
||||
import datetime
|
||||
|
||||
if len(sys.argv) != 2:
|
||||
print("Usage: mkfile.py <filename>")
|
||||
sys.exit(1)
|
||||
|
||||
filename = sys.argv[1]
|
||||
|
||||
# create header file
|
||||
with open(f"./include/solution/{filename.lower()}.h", "w") as f:
|
||||
f.write("// This file is generated by mkfile.py\n")
|
||||
f.write(f"// Date: {datetime.datetime.now().strftime('%Y-%m-%d')}\n\n")
|
||||
f.write(f"#ifndef INC_{filename.upper()}_H\n")
|
||||
f.write(f"#define INC_{filename.upper()}_H\n")
|
||||
f.write("#ifdef __cplusplus\n")
|
||||
f.write("extern \"C\"\n")
|
||||
f.write("{\n")
|
||||
f.write("#endif\n\n")
|
||||
f.write("#ifdef __cplusplus\n")
|
||||
f.write("}\n")
|
||||
f.write("#endif\n")
|
||||
f.write(f"#endif // INC_{filename.upper()}_H\n")
|
||||
f.close()
|
||||
|
||||
# create source file
|
||||
with open(f"./src/{filename.lower()}.c", "w") as f:
|
||||
f.write("// This file is generated by mkfile.py\n")
|
||||
f.write(f"// Date: {datetime.datetime.now().strftime('%Y-%m-%d')}\n\n")
|
||||
f.write(f'#include <solution/{filename.lower()}.h>\n')
|
||||
f.close()
|
||||
|
||||
# create test file
|
||||
with open(f"./tests/test_{filename.lower()}.cpp", "w") as f:
|
||||
f.write("// This file is generated by mkfile.py\n")
|
||||
f.write(f"// Date: {datetime.datetime.now().strftime('%Y-%m-%d')}\n\n")
|
||||
f.write(f'#include <solution/{filename.lower()}.h>\n')
|
||||
f.write("#include <gtest/gtest.h>\n")
|
||||
f.close()
|
||||
7
src/1025.c
Normal file
7
src/1025.c
Normal file
@@ -0,0 +1,7 @@
|
||||
// This file is generated by mkfile.py
|
||||
// Date: 2025-12-05
|
||||
#include <solution/1025.h>
|
||||
bool divisorGame(int n)
|
||||
{
|
||||
return n % 2 == 0;
|
||||
}
|
||||
30
src/1039.c
Normal file
30
src/1039.c
Normal file
@@ -0,0 +1,30 @@
|
||||
// This file is generated by mkfile.py
|
||||
// Date: 2025-09-29
|
||||
|
||||
#include <limits.h>
|
||||
#include <solution/1039.h>
|
||||
|
||||
#define min(x, y) (x) < (y) ? (x) : (y)
|
||||
|
||||
int minScoreTriangulation(int *values, int valuesSize)
|
||||
{
|
||||
int dp[valuesSize][valuesSize];
|
||||
for (int i = 0; i < valuesSize; i++)
|
||||
for (int j = 0; j < valuesSize; j++)
|
||||
dp[i][j] = 0;
|
||||
|
||||
for (int len = 2; len < valuesSize; len++)
|
||||
{
|
||||
for (int i = 0; i + len < valuesSize; i++)
|
||||
{
|
||||
int j = i + len;
|
||||
dp[i][j] = INT_MAX;
|
||||
|
||||
for (int k = i + 1; k < j; k++)
|
||||
{
|
||||
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j] + values[i] * values[j] * values[k]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return dp[0][valuesSize - 1];
|
||||
}
|
||||
17
src/1137.c
Normal file
17
src/1137.c
Normal file
@@ -0,0 +1,17 @@
|
||||
// This file is generated by mkfile.py
|
||||
// Date: 2025-12-05
|
||||
|
||||
#include <solution/1137.h>
|
||||
int tribonacci(int n)
|
||||
{
|
||||
int dp[n + 1];
|
||||
dp[0] = 0;
|
||||
if (n >= 1)
|
||||
dp[1] = 1;
|
||||
if (n >= 2)
|
||||
dp[2] = 1;
|
||||
for (int i = 3; i <= n; i++)
|
||||
dp[i] = dp[i - 3] + dp[i - 2] + dp[i - 1];
|
||||
|
||||
return dp[n];
|
||||
}
|
||||
30
src/1233.c
Normal file
30
src/1233.c
Normal file
@@ -0,0 +1,30 @@
|
||||
#include <solution/1233.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
bool startwith(char *p, char *s)
|
||||
{
|
||||
for (; *p && *s; p++, s++)
|
||||
if (*p != *s)
|
||||
return false;
|
||||
|
||||
return (!*p && *s) || (!*p && !*s);
|
||||
}
|
||||
|
||||
char **removeSubfolders(char **folder, int folderSize, int *returnSize)
|
||||
{
|
||||
char **ret = malloc(sizeof(char *));
|
||||
*returnSize = 1;
|
||||
|
||||
ret[0] = folder[0];
|
||||
for (int i = 1; i < folderSize; i++)
|
||||
{
|
||||
if (startwith(ret[*(returnSize)-1], folder[i]))
|
||||
continue;
|
||||
|
||||
ret = realloc(ret, sizeof(char *) * ++(*returnSize));
|
||||
ret[*returnSize - 1] = folder[i];
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
12
src/1290.c
Normal file
12
src/1290.c
Normal file
@@ -0,0 +1,12 @@
|
||||
#include <solution/1290.h>
|
||||
|
||||
int getDecimalValue(struct ListNode *head)
|
||||
{
|
||||
int x = 0;
|
||||
while (head)
|
||||
{
|
||||
x = (x << 1) + head->val;
|
||||
head = head->next;
|
||||
}
|
||||
return x;
|
||||
}
|
||||
91
src/1353.c
Normal file
91
src/1353.c
Normal file
@@ -0,0 +1,91 @@
|
||||
//
|
||||
// Created by gint on 2025/7/7.
|
||||
//
|
||||
#include <stdlib.h>
|
||||
|
||||
int cmpEvent(const void *a, const void *b)
|
||||
{
|
||||
int *eventA = *(int **)a;
|
||||
int *eventB = *(int **)b;
|
||||
return eventA[0] - eventB[0];
|
||||
}
|
||||
|
||||
int compare(const void *a, const void *b)
|
||||
{
|
||||
return *(int *)a - *(int *)b;
|
||||
}
|
||||
|
||||
// 简易小根堆操作
|
||||
void push(int *heap, int *size, int val)
|
||||
{
|
||||
int i = (*size)++;
|
||||
heap[i] = val;
|
||||
while (i > 0 && heap[(i - 1) / 2] > heap[i])
|
||||
{
|
||||
int tmp = heap[i];
|
||||
heap[i] = heap[(i - 1) / 2];
|
||||
heap[(i - 1) / 2] = tmp;
|
||||
i = (i - 1) / 2;
|
||||
}
|
||||
}
|
||||
|
||||
int pop(int *heap, int *size)
|
||||
{
|
||||
int result = heap[0];
|
||||
heap[0] = heap[--(*size)];
|
||||
int i = 0;
|
||||
while (i * 2 + 1 < *size)
|
||||
{
|
||||
int j = i * 2 + 1;
|
||||
if (j + 1 < *size && heap[j + 1] < heap[j])
|
||||
j++;
|
||||
if (heap[i] <= heap[j])
|
||||
break;
|
||||
int tmp = heap[i];
|
||||
heap[i] = heap[j];
|
||||
heap[j] = tmp;
|
||||
i = j;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
int maxEvents(int **events, int eventsSize, int *eventsColSize)
|
||||
{
|
||||
qsort(events, eventsSize, sizeof(int *), cmpEvent);
|
||||
|
||||
int minDay = events[0][0], maxDay = 0;
|
||||
for (int i = 0; i < eventsSize; i++)
|
||||
{
|
||||
if (events[i][1] > maxDay)
|
||||
maxDay = events[i][1];
|
||||
}
|
||||
|
||||
int heap[eventsSize];
|
||||
int heapSize = 0;
|
||||
|
||||
int day = minDay, idx = 0, res = 0;
|
||||
|
||||
for (day = minDay; day <= maxDay; day++)
|
||||
{
|
||||
// 把今天开始的会议加进堆
|
||||
while (idx < eventsSize && events[idx][0] == day)
|
||||
{
|
||||
push(heap, &heapSize, events[idx][1]);
|
||||
idx++;
|
||||
}
|
||||
|
||||
// 去掉已过期的会议
|
||||
while (heapSize > 0 && heap[0] < day)
|
||||
{
|
||||
pop(heap, &heapSize);
|
||||
}
|
||||
|
||||
// 选择今天可以开的最早结束的会议
|
||||
if (heapSize > 0)
|
||||
{
|
||||
pop(heap, &heapSize);
|
||||
res++;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
17
src/1534.c
Normal file
17
src/1534.c
Normal file
@@ -0,0 +1,17 @@
|
||||
//
|
||||
// Created by xfj12 on 2025/4/14.
|
||||
//
|
||||
#include <stdlib.h>
|
||||
#include <solution/1534.h>
|
||||
int countGoodTriplets(int *arr, int arrSize, int a, int b, int c)
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
for (int i = 0; i < arrSize; i++)
|
||||
for (int j = i + 1; j < arrSize; j++)
|
||||
for (int k = j + 1; k < arrSize; k++)
|
||||
if (abs(arr[i] - arr[j]) <= a && abs(arr[j] - arr[k]) <= b && abs(arr[i] - arr[k]) <= c)
|
||||
count++;
|
||||
|
||||
return count;
|
||||
}
|
||||
38
src/1668.c
Normal file
38
src/1668.c
Normal file
@@ -0,0 +1,38 @@
|
||||
// This file is generated by mkfile.py
|
||||
// Date: 2025-12-05
|
||||
|
||||
#include <solution/1668.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
|
||||
#define max(x, y) ((x) > (y) ? (x) : (y))
|
||||
|
||||
int maxRepeating(char *sequence, char *word)
|
||||
{
|
||||
int n = strlen(sequence), m = strlen(word);
|
||||
if (n < m)
|
||||
return 0;
|
||||
|
||||
int dp[n];
|
||||
memset(dp, 0, sizeof(dp));
|
||||
for (int i = m - 1; i < n; i++)
|
||||
{
|
||||
bool valid = true;
|
||||
for (int j = 0; j < m; j++)
|
||||
{
|
||||
if (sequence[i - m + 1 + j] != word[j])
|
||||
{
|
||||
valid = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (valid)
|
||||
dp[i] = (i == m - 1 ? 0 : dp[i - m]) + 1;
|
||||
}
|
||||
|
||||
int ret = dp[0];
|
||||
for (int i = 1; i < n; i++)
|
||||
ret = max(ret, dp[i]);
|
||||
|
||||
return ret;
|
||||
}
|
||||
91
src/1717.c
Normal file
91
src/1717.c
Normal file
@@ -0,0 +1,91 @@
|
||||
#include <solution/1717.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char *base;
|
||||
size_t size;
|
||||
size_t top;
|
||||
} stack_t;
|
||||
|
||||
void init_stack(stack_t *s)
|
||||
{
|
||||
s->base = malloc(sizeof(char) * 10);
|
||||
s->size = 10;
|
||||
s->top = 0;
|
||||
}
|
||||
|
||||
void push(stack_t *s, char c)
|
||||
{
|
||||
if (s->top + 1 >= s->size)
|
||||
{
|
||||
s->size += 10;
|
||||
s->base = realloc(s->base, sizeof(char) * s->size);
|
||||
}
|
||||
s->base[++(s->top)] = c;
|
||||
}
|
||||
|
||||
char pop(stack_t *s)
|
||||
{
|
||||
if (s->top == 0)
|
||||
return '\0';
|
||||
return s->base[(s->top)--];
|
||||
}
|
||||
|
||||
void clear(stack_t *s)
|
||||
{
|
||||
s->top = 0;
|
||||
}
|
||||
|
||||
char top(stack_t *s)
|
||||
{
|
||||
return s->base[s->top];
|
||||
}
|
||||
|
||||
char *sts(stack_t *s)
|
||||
{
|
||||
char *ret = malloc(sizeof(char) * (s->top + 1));
|
||||
|
||||
memcpy(ret, s->base + 1, s->top);
|
||||
ret[s->top] = '\0';
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void delete_stack(stack_t *s)
|
||||
{
|
||||
free(s->base);
|
||||
}
|
||||
|
||||
char *del(char *s, char m1, char m2, int *score, int v)
|
||||
{
|
||||
stack_t st;
|
||||
init_stack(&st);
|
||||
while (*s)
|
||||
{
|
||||
if (top(&st) == m1 && *s == m2)
|
||||
{
|
||||
s += 1, *score += v;
|
||||
pop(&st);
|
||||
}
|
||||
else
|
||||
push(&st, *(s++));
|
||||
}
|
||||
|
||||
char *r = sts(&st);
|
||||
delete_stack(&st);
|
||||
return r;
|
||||
}
|
||||
|
||||
int maximumGain(char *s, int x, int y)
|
||||
{
|
||||
int score = 0;
|
||||
if (x > y)
|
||||
del(del(s, 'a', 'b', &score, x), 'b', 'a', &score, y);
|
||||
else
|
||||
del(del(s, 'b', 'a', &score, y), 'a', 'b', &score, x);
|
||||
|
||||
return score;
|
||||
}
|
||||
6
src/1900.c
Normal file
6
src/1900.c
Normal file
@@ -0,0 +1,6 @@
|
||||
#include <solution/1900.h>
|
||||
|
||||
int *earliestAndLatest(int n, int firstPlayer, int secondPlayer, int *returnSize)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
13
src/1957.c
Normal file
13
src/1957.c
Normal file
@@ -0,0 +1,13 @@
|
||||
#include <solution/1957.h>
|
||||
#include <string.h>
|
||||
|
||||
char *makeFancyString(char *s)
|
||||
{
|
||||
int d[26] = {0};
|
||||
int len = strlen(s);
|
||||
for (int i = len - 1; i >= 0; i--)
|
||||
if (++(d[s[i] - 'a']) > 3)
|
||||
for (int j = i; j < len - 1; j++)
|
||||
s[j] = s[j + 1];
|
||||
return s;
|
||||
}
|
||||
4
src/2163.c
Normal file
4
src/2163.c
Normal file
@@ -0,0 +1,4 @@
|
||||
#include <solution/2163.h>
|
||||
long long minimumDifference(int *nums, int numsSize)
|
||||
{
|
||||
}
|
||||
@@ -2,7 +2,7 @@
|
||||
// Created by xfj12 on 2025/3/24.
|
||||
//
|
||||
#include <assert.h>
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
bool containsNearbyDuplicate(int *nums, int numsSize, int k)
|
||||
|
||||
72
src/232.c
Normal file
72
src/232.c
Normal file
@@ -0,0 +1,72 @@
|
||||
#include <solution/232.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
MyQueue *myQueueCreate()
|
||||
{
|
||||
MyQueue *q = (MyQueue *)malloc(sizeof(MyQueue));
|
||||
q->s1 = (stack *)malloc(sizeof(stack));
|
||||
q->s2 = (stack *)malloc(sizeof(stack));
|
||||
|
||||
q->s1->size = q->s2->size = 10;
|
||||
q->s1->ptr = q->s2->ptr = 0;
|
||||
|
||||
q->s1->base = (int *)malloc(sizeof(int) * 10);
|
||||
q->s2->base = (int *)malloc(sizeof(int) * 10);
|
||||
|
||||
return q;
|
||||
}
|
||||
|
||||
void myQueuePush(MyQueue *obj, int x)
|
||||
{
|
||||
if (obj->s1->ptr > obj->s1->size)
|
||||
{
|
||||
obj->s1->base = (int *)realloc(obj->s1->base, sizeof(int) * (obj->s1->size + 10));
|
||||
obj->s2->base = (int *)realloc(obj->s2->base, sizeof(int) * (obj->s1->size + 10));
|
||||
obj->s1->size = obj->s2->size = obj->s1->size + 10;
|
||||
}
|
||||
obj->s1->base[(obj->s1->ptr)++] = x;
|
||||
}
|
||||
|
||||
int myQueuePop(MyQueue *obj)
|
||||
{
|
||||
int ret;
|
||||
|
||||
while (obj->s1->ptr)
|
||||
obj->s2->base[(obj->s2->ptr)++] = obj->s1->base[--(obj->s1->ptr)];
|
||||
|
||||
ret = obj->s2->base[--(obj->s2->ptr)];
|
||||
|
||||
while (obj->s2->ptr)
|
||||
obj->s1->base[(obj->s1->ptr)++] = obj->s2->base[--(obj->s2->ptr)];
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int myQueuePeek(MyQueue *obj)
|
||||
{
|
||||
int ret;
|
||||
|
||||
while (obj->s1->ptr)
|
||||
obj->s2->base[(obj->s2->ptr)++] = obj->s1->base[--(obj->s1->ptr)];
|
||||
|
||||
ret = obj->s2->base[obj->s2->ptr - 1];
|
||||
|
||||
obj->s1->ptr = obj->s2->ptr;
|
||||
obj->s2->ptr = 0;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool myQueueEmpty(MyQueue *obj)
|
||||
{
|
||||
return !obj->s1->ptr;
|
||||
}
|
||||
|
||||
void myQueueFree(MyQueue *obj)
|
||||
{
|
||||
free(obj->s1->base);
|
||||
free(obj->s2->base);
|
||||
free(obj->s1);
|
||||
free(obj->s2);
|
||||
free(obj);
|
||||
}
|
||||
30
src/2410.c
Normal file
30
src/2410.c
Normal file
@@ -0,0 +1,30 @@
|
||||
#include <solution/2410.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int cmp(const void *a, const void *b)
|
||||
{
|
||||
return *(int *)a - *(int *)b;
|
||||
}
|
||||
|
||||
int matchPlayersAndTrainers(int *players, int playersSize, int *trainers, int trainersSize)
|
||||
{
|
||||
qsort(trainers, trainersSize, sizeof(int), cmp);
|
||||
qsort(players, playersSize, sizeof(int), cmp);
|
||||
|
||||
int match = 0;
|
||||
for (int i = 0, j = 0; i < playersSize && j < trainersSize; i++)
|
||||
{
|
||||
for (; j < trainersSize; j++)
|
||||
{
|
||||
if (trainers[j] >= players[i])
|
||||
{
|
||||
match++;
|
||||
j++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return match;
|
||||
}
|
||||
19
src/258.c
19
src/258.c
@@ -1,15 +1,16 @@
|
||||
//
|
||||
// Created by xfj12 on 2025/3/24.
|
||||
//
|
||||
#include <solution/258.h>
|
||||
|
||||
int addDigits(int num)
|
||||
{
|
||||
int total = 0;
|
||||
do
|
||||
{
|
||||
|
||||
} while ();
|
||||
}
|
||||
|
||||
int main()
|
||||
int n = 0;
|
||||
while (num)
|
||||
{
|
||||
n += num % 10;
|
||||
num /= 10;
|
||||
}
|
||||
num = n;
|
||||
} while (num >= 10);
|
||||
return num;
|
||||
}
|
||||
|
||||
18
src/2712.c
Normal file
18
src/2712.c
Normal file
@@ -0,0 +1,18 @@
|
||||
//
|
||||
// Created by xfj12 on 2025/3/27.
|
||||
//
|
||||
#include <solution/2712.h>
|
||||
#include <string.h>
|
||||
#define min(a, b) (a < b) ? (a) : (b)
|
||||
|
||||
long long minimumCost(char *s)
|
||||
{
|
||||
int n = strlen(s);
|
||||
long long ans = 0;
|
||||
|
||||
for (int i = 1; i < n; i++)
|
||||
if (s[i] != s[i - 1])
|
||||
ans += min(i, n - i);
|
||||
|
||||
return ans;
|
||||
}
|
||||
26
src/2716.c
Normal file
26
src/2716.c
Normal file
@@ -0,0 +1,26 @@
|
||||
//
|
||||
// Created by xfj12 on 2025/3/28.
|
||||
//
|
||||
#include <solution/2716.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
int minimizedStringLength(char *s)
|
||||
{
|
||||
int n = strlen(s);
|
||||
int size = 0;
|
||||
char *temp = malloc(n);
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
bool flag = true;
|
||||
for (int j = 0; j < size && flag; j++)
|
||||
if (s[i] == temp[j])
|
||||
flag = false;
|
||||
if (flag)
|
||||
temp[size++] = s[i];
|
||||
}
|
||||
|
||||
free(temp);
|
||||
return size;
|
||||
}
|
||||
73
src/290.c
Normal file
73
src/290.c
Normal file
@@ -0,0 +1,73 @@
|
||||
#include <solution/290.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
char *foundValue(char **d, char k)
|
||||
{
|
||||
int idx = k - 'a';
|
||||
return d[idx];
|
||||
}
|
||||
|
||||
int foundKeyCount(char **d, char *v)
|
||||
{
|
||||
int count = 0;
|
||||
for (int i = 0; i < 26; i++)
|
||||
if (d[i] && strcmp(v, d[i]) == 0)
|
||||
count++;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
void freeDict(char **d)
|
||||
{
|
||||
for (int i = 0; i < 26; i++)
|
||||
free(d[i]);
|
||||
free(d);
|
||||
}
|
||||
|
||||
int insertValue(char **d, char k, char *v)
|
||||
{
|
||||
int idx = k - 'a';
|
||||
if (d[idx] != NULL)
|
||||
return -1;
|
||||
d[idx] = malloc(strlen(v) + 1);
|
||||
memcpy(d[idx], v, strlen(v) + 1);
|
||||
|
||||
return foundKeyCount(d, v);
|
||||
}
|
||||
|
||||
bool preCheck(char *p, char *s)
|
||||
{
|
||||
int s_count = 0;
|
||||
for (; *s != '\0'; s++)
|
||||
if (*s == ' ')
|
||||
s_count++;
|
||||
return s_count + 1 == strlen(p);
|
||||
}
|
||||
|
||||
bool wordPattern(char *pattern, char *s)
|
||||
{
|
||||
if (!preCheck(pattern, s))
|
||||
return false;
|
||||
|
||||
char **d = calloc(26, sizeof(char *));
|
||||
char *token = strtok(s, " ");
|
||||
|
||||
for (int i = 0; i < strlen(pattern) && token != NULL; i++, token = strtok(NULL, " "))
|
||||
{
|
||||
switch (insertValue(d, pattern[i], token))
|
||||
{
|
||||
case 1:
|
||||
break;
|
||||
case -1:
|
||||
if (strcmp(token, foundValue(d, pattern[i])) == 0)
|
||||
break;
|
||||
default:
|
||||
freeDict(d);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
freeDict(d);
|
||||
return true;
|
||||
}
|
||||
44
src/303.c
Normal file
44
src/303.c
Normal file
@@ -0,0 +1,44 @@
|
||||
#define PREFIX
|
||||
|
||||
#include <solution/303.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef PREFIX
|
||||
#else
|
||||
#include <string.h>
|
||||
#endif
|
||||
|
||||
NumArray *numArrayCreate(int *nums, int numsSize)
|
||||
{
|
||||
NumArray *ret = malloc(sizeof(NumArray));
|
||||
ret->size = numsSize;
|
||||
#ifdef PREFIX
|
||||
ret->data = malloc(sizeof(int) * (numsSize + 1));
|
||||
ret->data[0] = 0;
|
||||
for (int i = 0; i < numsSize; i++)
|
||||
ret->data[i + 1] = ret->data[i] + nums[i];
|
||||
#else
|
||||
ret->data = malloc(sizeof(int) * numsSize);
|
||||
memcpy(ret->data, nums, sizeof(int) * numsSize);
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
int numArraySumRange(NumArray *obj, int left, int right)
|
||||
{
|
||||
#ifdef PREFIX
|
||||
return obj->data[right + 1] - obj->data[left];
|
||||
#else
|
||||
int sum = 0;
|
||||
for (int i = left; i <= right; i++)
|
||||
sum += obj->data[i];
|
||||
|
||||
return sum;
|
||||
#endif
|
||||
}
|
||||
|
||||
void numArrayFree(NumArray *obj)
|
||||
{
|
||||
free(obj->data);
|
||||
free(obj);
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
#include <assert.h>
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
//
|
||||
// Created by xfj12 on 2025/3/24.
|
||||
|
||||
33
src/3136.c
Normal file
33
src/3136.c
Normal file
@@ -0,0 +1,33 @@
|
||||
#include <ctype.h>
|
||||
#include <solution/3136.h>
|
||||
|
||||
bool isVowel(char c)
|
||||
{
|
||||
return c == 'a' || c == 'A' || c == 'e' || c == 'E' || c == 'i' || c == 'I' || c == 'o' || c == 'O' || c == 'u' ||
|
||||
c == 'U';
|
||||
}
|
||||
|
||||
bool isConsonant(char c)
|
||||
{
|
||||
return ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) && !isVowel(c);
|
||||
}
|
||||
|
||||
bool isValid(char *word)
|
||||
{
|
||||
int length = 0;
|
||||
bool haveVowel = false;
|
||||
bool haveConsonant = false;
|
||||
|
||||
for (; *word != '\0'; word++, length++)
|
||||
{
|
||||
haveVowel = haveVowel || isVowel(*word);
|
||||
haveConsonant = haveConsonant || isConsonant(*word);
|
||||
if (!isdigit(*word) && !isVowel(*word) && !isConsonant(*word))
|
||||
return false;
|
||||
}
|
||||
|
||||
if (length < 3)
|
||||
return false;
|
||||
|
||||
return haveVowel && haveConsonant;
|
||||
}
|
||||
42
src/3169.c
Normal file
42
src/3169.c
Normal file
@@ -0,0 +1,42 @@
|
||||
//
|
||||
// Created by gint on 2025/7/11.
|
||||
//
|
||||
#include <solution/3169.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
int cmpMeetings(const void *a, const void *b)
|
||||
{
|
||||
int *ma = *(int **)a;
|
||||
int *mb = *(int **)b;
|
||||
if (ma[0] != mb[0])
|
||||
return ma[0] - mb[0];
|
||||
return ma[1] - mb[1];
|
||||
}
|
||||
|
||||
void mergeMeeting(int *meetingA, int *meetingB)
|
||||
{
|
||||
meetingA[0] = meetingA[0] < meetingB[0] ? meetingA[0] : meetingB[0];
|
||||
meetingA[1] = meetingA[1] > meetingB[1] ? meetingA[1] : meetingB[1];
|
||||
}
|
||||
|
||||
int countDays(int days, int **meetings, int meetingsSize, int *meetingsColSize)
|
||||
{
|
||||
int count = 0;
|
||||
qsort(meetings, meetingsSize, sizeof(int *), cmpMeetings);
|
||||
|
||||
for (int i = 1; i < meetingsSize; i++)
|
||||
if (meetings[i - 1][1] >= meetings[i][0])
|
||||
mergeMeeting(meetings[i], meetings[i - 1]);
|
||||
|
||||
for (int i = 1; i < meetingsSize; i++)
|
||||
if (meetings[i - 1][0] != meetings[i][0])
|
||||
count += meetings[i][0] - meetings[i - 1][1] - 1;
|
||||
|
||||
if (meetings[0][0] != 1)
|
||||
count += meetings[0][0] - 1;
|
||||
|
||||
if (meetings[meetingsSize - 1][1] < days)
|
||||
return count + days - meetings[meetingsSize - 1][1];
|
||||
|
||||
return count;
|
||||
}
|
||||
13
src/3201.c
Normal file
13
src/3201.c
Normal file
@@ -0,0 +1,13 @@
|
||||
#include <solution/3201.h>
|
||||
|
||||
#define max(x, y) ((x) > (y) ? (x) : (y))
|
||||
|
||||
int maximumLength(int *nums, int numsSize)
|
||||
{
|
||||
int odd = 0, even = 0, odd_cnt = 0;
|
||||
|
||||
for (int i = 0; i < numsSize; i++)
|
||||
nums[i] & 1 ? (odd = even + 1, odd_cnt++) : (even = odd + 1);
|
||||
|
||||
return max(max(even, odd), max(odd_cnt, numsSize - odd_cnt));
|
||||
}
|
||||
5
src/3202.c
Normal file
5
src/3202.c
Normal file
@@ -0,0 +1,5 @@
|
||||
#include <solution/3202.h>
|
||||
|
||||
int maximumLength(int *nums, int numsSize, int k)
|
||||
{
|
||||
}
|
||||
23
src/326.c
Normal file
23
src/326.c
Normal file
@@ -0,0 +1,23 @@
|
||||
#define METHOD 2
|
||||
#include <solution/326.h>
|
||||
|
||||
bool isPowerOfThree(int n)
|
||||
{
|
||||
#if METHOD == 1
|
||||
if (n <= 0)
|
||||
return false;
|
||||
|
||||
while (n != 1)
|
||||
{
|
||||
if (n % 3 != 0)
|
||||
return false;
|
||||
n /= 3;
|
||||
}
|
||||
|
||||
return true;
|
||||
#elif METHOD == 2
|
||||
// 在题目给定的 32 位有符号整数的范围内,最大的 3 的幂为 3^19 = 1162261467。
|
||||
// 我们只需要判断 n 是否是 3^19 的约数即可。
|
||||
return n > 0 && 1162261467 % n == 0;
|
||||
#endif
|
||||
}
|
||||
35
src/338.c
35
src/338.c
@@ -1,13 +1,44 @@
|
||||
//
|
||||
// Created by aurora on 2024/9/16.
|
||||
//
|
||||
#include <assert.h>
|
||||
#include <solution/338.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define ASSERT(x, expect) \
|
||||
do \
|
||||
{ \
|
||||
int retSize; \
|
||||
int *ret; \
|
||||
ret = countBits(x, &retSize); \
|
||||
for (int i = 0; i < retSize; i++) \
|
||||
assert(ret[i] == expect[i]); \
|
||||
free(ret); \
|
||||
} while (0)
|
||||
|
||||
int *countBits(int n, int *returnSize)
|
||||
{
|
||||
return 0;
|
||||
*returnSize = n + 1;
|
||||
int *ret = (int *)malloc(sizeof(int) * (*returnSize));
|
||||
ret[0] = 0;
|
||||
for (int i = 1; i <= n; i++)
|
||||
{
|
||||
ret[i] = ret[i >> 1] + (i & 1);
|
||||
// equal to the following expression
|
||||
// if (i % 2 == 0)
|
||||
// ret[i] = ret[i / 2];
|
||||
// else
|
||||
// ret[i] = ret[i - 1] + 1;
|
||||
}
|
||||
|
||||
int main() {
|
||||
return ret;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
int t1[] = {0, 1, 1};
|
||||
ASSERT(2, t1);
|
||||
int t2[] = {0, 1, 1, 2, 1, 2};
|
||||
ASSERT(5, t2);
|
||||
return 0;
|
||||
}
|
||||
41
src/3397.c
Normal file
41
src/3397.c
Normal file
@@ -0,0 +1,41 @@
|
||||
// This file is generated by mkfile.py
|
||||
// Date: 2025-10-18
|
||||
|
||||
#include <solution/3397.h>
|
||||
#include <stdlib.h>
|
||||
int cmp(const void *a, const void *b)
|
||||
{
|
||||
return *(int *)a - *(int *)b;
|
||||
}
|
||||
|
||||
int maxDistinctElements(int *nums, int numsSize, int k)
|
||||
{
|
||||
if (numsSize == 0)
|
||||
return 0;
|
||||
|
||||
qsort(nums, numsSize, sizeof(int), cmp);
|
||||
int result = 1;
|
||||
int prev = nums[0] - k;
|
||||
|
||||
for (int i = 1; i < numsSize; i++)
|
||||
{
|
||||
int min = nums[i] - k;
|
||||
int max = nums[i] + k;
|
||||
|
||||
if (prev >= min)
|
||||
{
|
||||
if (max <= prev)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
prev += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
prev = min;
|
||||
}
|
||||
result++;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
32
src/345.c
Normal file
32
src/345.c
Normal file
@@ -0,0 +1,32 @@
|
||||
#include <solution/345.h>
|
||||
#include <string.h>
|
||||
|
||||
#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;
|
||||
}
|
||||
17
src/387.c
Normal file
17
src/387.c
Normal file
@@ -0,0 +1,17 @@
|
||||
#include <solution/387.h>
|
||||
#include <string.h>
|
||||
|
||||
int firstUniqChar(char *s)
|
||||
{
|
||||
int hash[26];
|
||||
memset(hash, 0, sizeof(int) * 26);
|
||||
|
||||
for (int idx = 0; s[idx]; idx++)
|
||||
hash[s[idx] - 'a']++;
|
||||
|
||||
for (int idx = 0; s[idx]; idx++)
|
||||
if (hash[s[idx] - 'a'] == 1)
|
||||
return idx;
|
||||
|
||||
return -1;
|
||||
}
|
||||
10
src/392.c
Normal file
10
src/392.c
Normal file
@@ -0,0 +1,10 @@
|
||||
#include <solution/392.h>
|
||||
|
||||
bool isSubsequence(char *s, char *t)
|
||||
{
|
||||
for (; *s && *t; t++)
|
||||
if (*s == *t)
|
||||
s++;
|
||||
|
||||
return !*s;
|
||||
}
|
||||
14
src/509.c
Normal file
14
src/509.c
Normal file
@@ -0,0 +1,14 @@
|
||||
// This file is generated by mkfile.py
|
||||
// Date: 2025-12-05
|
||||
|
||||
#include <solution/509.h>
|
||||
int fib(int n)
|
||||
{
|
||||
int dp[n + 1];
|
||||
dp[0] = 0;
|
||||
if (n >= 1)
|
||||
dp[1] = 1;
|
||||
for (int i = 2; i <= n; i++)
|
||||
dp[i] = dp[i - 1] + dp[i - 2];
|
||||
return dp[n];
|
||||
}
|
||||
15
src/746.c
Normal file
15
src/746.c
Normal file
@@ -0,0 +1,15 @@
|
||||
// This file is generated by mkfile.py
|
||||
// Date: 2025-12-05
|
||||
|
||||
#include <solution/746.h>
|
||||
|
||||
#define min(x, y) ((x) < (y) ? (x) : (y))
|
||||
int minCostClimbingStairs(int *cost, int costSize)
|
||||
{
|
||||
int dp[costSize + 1];
|
||||
dp[0] = dp[1] = 0;
|
||||
for (int i = 2; i <= costSize; i++)
|
||||
dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
|
||||
|
||||
return dp[costSize];
|
||||
}
|
||||
27
src/976.c
Normal file
27
src/976.c
Normal file
@@ -0,0 +1,27 @@
|
||||
#include <solution/976.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
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;
|
||||
}
|
||||
@@ -10,5 +10,3 @@ foreach (TEST_SRC ${TEST_SOURCES})
|
||||
|
||||
add_test(NAME ${TEST_NAME} COMMAND ${TEST_NAME})
|
||||
endforeach ()
|
||||
|
||||
enable_testing()
|
||||
45
tests/test_1025.cpp
Normal file
45
tests/test_1025.cpp
Normal file
@@ -0,0 +1,45 @@
|
||||
// This file is generated by mkfile.py
|
||||
// Date: 2025-12-05
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/1025.h>
|
||||
|
||||
// Tests for divisorGame (LeetCode 1025)
|
||||
class DivisorGameTest : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
void AssertDivisorGame(int n, bool expected)
|
||||
{
|
||||
ASSERT_EQ(divisorGame(n), expected);
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(DivisorGameTest, One)
|
||||
{
|
||||
AssertDivisorGame(1, false);
|
||||
}
|
||||
|
||||
TEST_F(DivisorGameTest, Two)
|
||||
{
|
||||
AssertDivisorGame(2, true);
|
||||
}
|
||||
|
||||
TEST_F(DivisorGameTest, Three)
|
||||
{
|
||||
AssertDivisorGame(3, false);
|
||||
}
|
||||
|
||||
TEST_F(DivisorGameTest, Four)
|
||||
{
|
||||
AssertDivisorGame(4, true);
|
||||
}
|
||||
|
||||
TEST_F(DivisorGameTest, LargeEven)
|
||||
{
|
||||
AssertDivisorGame(100, true);
|
||||
}
|
||||
|
||||
TEST_F(DivisorGameTest, LargeOdd)
|
||||
{
|
||||
AssertDivisorGame(101, false);
|
||||
}
|
||||
45
tests/test_1039.cpp
Normal file
45
tests/test_1039.cpp
Normal file
@@ -0,0 +1,45 @@
|
||||
// This file is generated by mkfile.py
|
||||
// Date: 2025-09-29
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/1039.h>
|
||||
|
||||
|
||||
class MinScoreTriangulationTest : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
void AssertMinScoreTriangulation(std::vector<int> input, int expected)
|
||||
{
|
||||
int *values = new int[input.size()];
|
||||
std::copy(input.begin(), input.end(), values);
|
||||
|
||||
int result = minScoreTriangulation(values, input.size());
|
||||
ASSERT_EQ(result, expected);
|
||||
|
||||
delete[] values;
|
||||
}
|
||||
};
|
||||
|
||||
// 示例 1
|
||||
TEST_F(MinScoreTriangulationTest, Example1)
|
||||
{
|
||||
// 输入: values = [1,2,3]
|
||||
// 输出: 6
|
||||
AssertMinScoreTriangulation({1, 2, 3}, 6);
|
||||
}
|
||||
|
||||
// 示例 2
|
||||
TEST_F(MinScoreTriangulationTest, Example2)
|
||||
{
|
||||
// 输入: values = [3,7,4,5]
|
||||
// 输出: 144
|
||||
AssertMinScoreTriangulation({3, 7, 4, 5}, 144);
|
||||
}
|
||||
|
||||
// 示例 3
|
||||
TEST_F(MinScoreTriangulationTest, Example3)
|
||||
{
|
||||
// 输入: values = [1,3,1,4,1,5]
|
||||
// 输出: 13
|
||||
AssertMinScoreTriangulation({1, 3, 1, 4, 1, 5}, 13);
|
||||
}
|
||||
41
tests/test_1137.cpp
Normal file
41
tests/test_1137.cpp
Normal file
@@ -0,0 +1,41 @@
|
||||
// This file is generated by mkfile.py
|
||||
// Date: 2025-12-05
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/1137.h>
|
||||
|
||||
// Tests for tribonacci (LeetCode 1137)
|
||||
class TribonacciTest : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
void AssertTribo(int n, int expected)
|
||||
{
|
||||
ASSERT_EQ(tribonacci(n), expected);
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(TribonacciTest, BaseCases)
|
||||
{
|
||||
AssertTribo(0, 0);
|
||||
AssertTribo(1, 1);
|
||||
AssertTribo(2, 1);
|
||||
}
|
||||
|
||||
TEST_F(TribonacciTest, SmallNumbers)
|
||||
{
|
||||
AssertTribo(3, 2);
|
||||
AssertTribo(4, 4);
|
||||
AssertTribo(5, 7);
|
||||
}
|
||||
|
||||
TEST_F(TribonacciTest, MediumNumbers)
|
||||
{
|
||||
AssertTribo(10, 149);
|
||||
AssertTribo(15, 3136);
|
||||
}
|
||||
|
||||
TEST_F(TribonacciTest, UpperBound)
|
||||
{
|
||||
AssertTribo(25, 1389537);
|
||||
AssertTribo(37, 2082876103);
|
||||
}
|
||||
52
tests/test_1233.cpp
Normal file
52
tests/test_1233.cpp
Normal file
@@ -0,0 +1,52 @@
|
||||
#include <algorithm>
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/1233.h>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
bool ArrayEquals(char **actual, int actualSize, const std::vector<std::string> &expected)
|
||||
{
|
||||
if (actualSize != expected.size())
|
||||
return false;
|
||||
|
||||
std::vector<std::string> actualVec(actual, actual + actualSize);
|
||||
return std::is_permutation(actualVec.begin(), actualVec.end(), expected.begin());
|
||||
}
|
||||
|
||||
// 测试类
|
||||
class RemoveSubfoldersTest : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
void AssertFolders(std::vector<std::string> input, std::vector<std::string> expected)
|
||||
{
|
||||
int returnSize = 0;
|
||||
std::vector<char *> c_input;
|
||||
for (auto &s : input)
|
||||
c_input.push_back(const_cast<char *>(s.c_str()));
|
||||
|
||||
char **result = removeSubfolders(c_input.data(), (int)c_input.size(), &returnSize);
|
||||
ASSERT_TRUE(ArrayEquals(result, returnSize, expected));
|
||||
|
||||
// 可选释放 result 内存,如果实现中是动态分配的(free)
|
||||
// 例如:for (int i = 0; i < returnSize; ++i) free(result[i]);
|
||||
// free(result);
|
||||
}
|
||||
};
|
||||
|
||||
// 示例 1
|
||||
TEST_F(RemoveSubfoldersTest, Example1)
|
||||
{
|
||||
AssertFolders({"/a", "/a/b", "/c/d", "/c/d/e", "/c/f"}, {"/a", "/c/d", "/c/f"});
|
||||
}
|
||||
|
||||
// 示例 2
|
||||
TEST_F(RemoveSubfoldersTest, Example2)
|
||||
{
|
||||
AssertFolders({"/a", "/a/b/c", "/a/b/d"}, {"/a"});
|
||||
}
|
||||
|
||||
// 示例 3
|
||||
TEST_F(RemoveSubfoldersTest, Example3)
|
||||
{
|
||||
AssertFolders({"/a/b/c", "/a/b/ca", "/a/b/d"}, {"/a/b/c", "/a/b/ca", "/a/b/d"});
|
||||
}
|
||||
48
tests/test_1290.cpp
Normal file
48
tests/test_1290.cpp
Normal file
@@ -0,0 +1,48 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/1290.h>
|
||||
|
||||
class GetDecimalValueTest : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
// 构建链表:vector -> ListNode*
|
||||
ListNode *buildList(const std::vector<int> &values)
|
||||
{
|
||||
ListNode dummy{0, nullptr};
|
||||
ListNode *current = &dummy;
|
||||
for (int v : values)
|
||||
{
|
||||
current->next = new ListNode{v, nullptr};
|
||||
current = current->next;
|
||||
}
|
||||
return dummy.next;
|
||||
}
|
||||
|
||||
// 释放链表
|
||||
void freeList(ListNode *head)
|
||||
{
|
||||
while (head)
|
||||
{
|
||||
ListNode *tmp = head;
|
||||
head = head->next;
|
||||
delete tmp;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// 示例 1: [1, 0, 1] → 5
|
||||
TEST_F(GetDecimalValueTest, Binary101)
|
||||
{
|
||||
ListNode *head = buildList({1, 0, 1});
|
||||
int expected = 5;
|
||||
EXPECT_EQ(getDecimalValue(head), expected);
|
||||
freeList(head);
|
||||
}
|
||||
|
||||
// 示例 2: [0] → 0
|
||||
TEST_F(GetDecimalValueTest, Binary0)
|
||||
{
|
||||
ListNode *head = buildList({0});
|
||||
int expected = 0;
|
||||
EXPECT_EQ(getDecimalValue(head), expected);
|
||||
freeList(head);
|
||||
}
|
||||
58
tests/test_1353.cpp
Normal file
58
tests/test_1353.cpp
Normal file
@@ -0,0 +1,58 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/1353.h>
|
||||
|
||||
// 辅助函数:创建二维数组
|
||||
int **create2DArray(const std::vector<std::vector<int>> &input, int *colSizeArray)
|
||||
{
|
||||
int **arr = new int *[input.size()];
|
||||
for (size_t i = 0; i < input.size(); ++i)
|
||||
{
|
||||
arr[i] = new int[input[i].size()];
|
||||
colSizeArray[i] = static_cast<int>(input[i].size());
|
||||
for (size_t j = 0; j < input[i].size(); ++j)
|
||||
{
|
||||
arr[i][j] = input[i][j];
|
||||
}
|
||||
}
|
||||
return arr;
|
||||
}
|
||||
|
||||
// 辅助函数:释放二维数组
|
||||
void free2DArray(int **arr, int size)
|
||||
{
|
||||
for (int i = 0; i < size; ++i)
|
||||
{
|
||||
delete[] arr[i];
|
||||
}
|
||||
delete[] arr;
|
||||
}
|
||||
|
||||
// Test1
|
||||
TEST(MaxEventsTest, Test1)
|
||||
{
|
||||
std::vector<std::vector<int>> input = {{1, 2}, {2, 3}, {3, 4}};
|
||||
int eventsSize = static_cast<int>(input.size());
|
||||
int *eventsColSize = new int[eventsSize];
|
||||
int **events = create2DArray(input, eventsColSize);
|
||||
|
||||
int expected = 3;
|
||||
EXPECT_EQ(maxEvents(events, eventsSize, eventsColSize), expected);
|
||||
|
||||
free2DArray(events, eventsSize);
|
||||
delete[] eventsColSize;
|
||||
}
|
||||
|
||||
// Test2
|
||||
TEST(MaxEventsTest, Test2)
|
||||
{
|
||||
std::vector<std::vector<int>> input = {{1, 2}, {2, 3}, {3, 4}, {1, 2}};
|
||||
int eventsSize = static_cast<int>(input.size());
|
||||
int *eventsColSize = new int[eventsSize];
|
||||
int **events = create2DArray(input, eventsColSize);
|
||||
|
||||
int expected = 4;
|
||||
EXPECT_EQ(maxEvents(events, eventsSize, eventsColSize), expected);
|
||||
|
||||
free2DArray(events, eventsSize);
|
||||
delete[] eventsColSize;
|
||||
}
|
||||
23
tests/test_1534.cpp
Normal file
23
tests/test_1534.cpp
Normal file
@@ -0,0 +1,23 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/1534.h>
|
||||
|
||||
TEST(CountGoodTripletsTest, Test1)
|
||||
{
|
||||
int arr[] = {3, 0, 1, 1, 9, 7};
|
||||
int arrSize = sizeof(arr) / sizeof(arr[0]);
|
||||
int a = 7, b = 2, c = 3;
|
||||
int expected = 4;
|
||||
|
||||
EXPECT_EQ(countGoodTriplets(arr, arrSize, a, b, c), expected);
|
||||
}
|
||||
|
||||
// 测试用例 2
|
||||
TEST(CountGoodTripletsTest, Test2)
|
||||
{
|
||||
int arr[] = {1, 1, 2, 2, 3};
|
||||
int arrSize = sizeof(arr) / sizeof(arr[0]);
|
||||
int a = 0, b = 0, c = 1;
|
||||
int expected = 0;
|
||||
|
||||
EXPECT_EQ(countGoodTriplets(arr, arrSize, a, b, c), expected);
|
||||
}
|
||||
49
tests/test_1668.cpp
Normal file
49
tests/test_1668.cpp
Normal file
@@ -0,0 +1,49 @@
|
||||
// This file is generated by mkfile.py
|
||||
// Date: 2025-12-05
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/1668.h>
|
||||
|
||||
#include <string>
|
||||
|
||||
// Tests for maxRepeating (LeetCode 1668)
|
||||
class MaxRepeatingTest : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
void AssertMaxRepeating(const std::string &sequence, const std::string &word, int expected)
|
||||
{
|
||||
int result = maxRepeating(const_cast<char *>(sequence.c_str()), const_cast<char *>(word.c_str()));
|
||||
ASSERT_EQ(result, expected);
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(MaxRepeatingTest, Example1)
|
||||
{
|
||||
AssertMaxRepeating("ababc", "ab", 2);
|
||||
}
|
||||
|
||||
TEST_F(MaxRepeatingTest, Example2)
|
||||
{
|
||||
AssertMaxRepeating("ababc", "ba", 1);
|
||||
}
|
||||
|
||||
TEST_F(MaxRepeatingTest, RepeatedMany)
|
||||
{
|
||||
AssertMaxRepeating("abababab", "ab", 4);
|
||||
}
|
||||
|
||||
TEST_F(MaxRepeatingTest, OverlappingNotAllowed)
|
||||
{
|
||||
// word = "aa", repeated twice is "aaaa" which appears, so answer 2
|
||||
AssertMaxRepeating("aaaaa", "aa", 2);
|
||||
}
|
||||
|
||||
TEST_F(MaxRepeatingTest, ShorterThanWord)
|
||||
{
|
||||
AssertMaxRepeating("a", "aa", 0);
|
||||
}
|
||||
|
||||
TEST_F(MaxRepeatingTest, SingleCharWord)
|
||||
{
|
||||
AssertMaxRepeating("aaaa", "a", 4);
|
||||
}
|
||||
30
tests/test_1717.cpp
Normal file
30
tests/test_1717.cpp
Normal file
@@ -0,0 +1,30 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/1717.h>
|
||||
|
||||
class MaximumGainTest : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
void AssertMaximumGain(const std::string &input, int x, int y, int expected)
|
||||
{
|
||||
char *s = strdup(input.c_str()); // 复制字符串,防止修改原始数据
|
||||
int result = maximumGain(s, x, y);
|
||||
ASSERT_EQ(result, expected);
|
||||
free(s);
|
||||
}
|
||||
};
|
||||
|
||||
// 示例 1
|
||||
TEST_F(MaximumGainTest, Example1)
|
||||
{
|
||||
// 输入:s = "cdbcbbaaabab", x = 4, y = 5
|
||||
// 输出:19
|
||||
AssertMaximumGain("cdbcbbaaabab", 4, 5, 19);
|
||||
}
|
||||
|
||||
// 示例 2
|
||||
TEST_F(MaximumGainTest, Example2)
|
||||
{
|
||||
// 输入:s = "aabbaaxybbaabb", x = 5, y = 4
|
||||
// 输出:20
|
||||
AssertMaximumGain("aabbaaxybbaabb", 5, 4, 20);
|
||||
}
|
||||
34
tests/test_1900.cpp
Normal file
34
tests/test_1900.cpp
Normal file
@@ -0,0 +1,34 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/1900.h>
|
||||
|
||||
class EarliestAndLatestTest : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
void AssertResult(int *result, int resultSize, const std::vector<int> &expected)
|
||||
{
|
||||
ASSERT_EQ(resultSize, expected.size());
|
||||
for (int i = 0; i < resultSize; ++i)
|
||||
{
|
||||
EXPECT_EQ(result[i], expected[i]) << "Mismatch at index " << i;
|
||||
}
|
||||
free(result); // 符合题意:假设函数使用 malloc 分配内存
|
||||
}
|
||||
};
|
||||
|
||||
// Test 1: 输入:n = 11, firstPlayer = 2, secondPlayer = 4,输出:[3,4]
|
||||
TEST_F(EarliestAndLatestTest, Test1)
|
||||
{
|
||||
int returnSize = 0;
|
||||
int *result = earliestAndLatest(11, 2, 4, &returnSize);
|
||||
std::vector<int> expected = {3, 4};
|
||||
AssertResult(result, returnSize, expected);
|
||||
}
|
||||
|
||||
// Test 2: 输入:n = 5, firstPlayer = 1, secondPlayer = 5,输出:[1,1]
|
||||
TEST_F(EarliestAndLatestTest, Test2)
|
||||
{
|
||||
int returnSize = 0;
|
||||
int *result = earliestAndLatest(5, 1, 5, &returnSize);
|
||||
std::vector<int> expected = {1, 1};
|
||||
AssertResult(result, returnSize, expected);
|
||||
}
|
||||
37
tests/test_1957.cpp
Normal file
37
tests/test_1957.cpp
Normal file
@@ -0,0 +1,37 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/1957.h>
|
||||
#include <string>
|
||||
|
||||
class MakeFancyStringTest : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
void AssertFancyString(const std::string &input, const std::string &expected)
|
||||
{
|
||||
char *c_input = strdup(input.c_str()); // 复制一份以防原始修改
|
||||
char *result = makeFancyString(c_input);
|
||||
|
||||
ASSERT_STREQ(result, expected.c_str());
|
||||
|
||||
// 如函数返回的是 malloc 分配的,则应释放
|
||||
// free(result);
|
||||
free(c_input);
|
||||
}
|
||||
};
|
||||
|
||||
// 示例 1:leeetcode → leetcode
|
||||
TEST_F(MakeFancyStringTest, Example1)
|
||||
{
|
||||
AssertFancyString("leeetcode", "leetcode");
|
||||
}
|
||||
|
||||
// 示例 2:aaabaaaa → aabaa
|
||||
TEST_F(MakeFancyStringTest, Example2)
|
||||
{
|
||||
AssertFancyString("aaabaaaa", "aabaa");
|
||||
}
|
||||
|
||||
// 示例 3:aab → aab
|
||||
TEST_F(MakeFancyStringTest, Example3)
|
||||
{
|
||||
AssertFancyString("aab", "aab");
|
||||
}
|
||||
26
tests/test_2163.cpp
Normal file
26
tests/test_2163.cpp
Normal file
@@ -0,0 +1,26 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/2163.h>
|
||||
|
||||
class MinimumDifferenceTest : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
void AssertMinimumDifference(std::vector<int> input, long long expected)
|
||||
{
|
||||
long long result = minimumDifference(input.data(), static_cast<int>(input.size()));
|
||||
EXPECT_EQ(result, expected);
|
||||
}
|
||||
};
|
||||
|
||||
// 示例 1
|
||||
TEST_F(MinimumDifferenceTest, Example1)
|
||||
{
|
||||
std::vector<int> nums = {3, 1, 2};
|
||||
AssertMinimumDifference(nums, -1);
|
||||
}
|
||||
|
||||
// 示例 2
|
||||
TEST_F(MinimumDifferenceTest, Example2)
|
||||
{
|
||||
std::vector<int> nums = {7, 9, 5, 8, 1, 3};
|
||||
AssertMinimumDifference(nums, 1);
|
||||
}
|
||||
49
tests/test_232.cpp
Normal file
49
tests/test_232.cpp
Normal file
@@ -0,0 +1,49 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/232.h>
|
||||
|
||||
class MyQueueTest : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
MyQueue *queue;
|
||||
|
||||
void SetUp() override
|
||||
{
|
||||
queue = myQueueCreate();
|
||||
ASSERT_NE(queue, nullptr); // 确保创建成功
|
||||
}
|
||||
|
||||
void TearDown() override
|
||||
{
|
||||
myQueueFree(queue);
|
||||
}
|
||||
};
|
||||
|
||||
// Test1 对应你提供的操作序列
|
||||
TEST_F(MyQueueTest, BasicOperations)
|
||||
{
|
||||
// ["MyQueue", "push", "push", "peek", "pop", "empty"]
|
||||
// [[], [1], [2], [], [], []]
|
||||
|
||||
myQueuePush(queue, 1); // queue: [1]
|
||||
myQueuePush(queue, 2); // queue: [1, 2]
|
||||
|
||||
int peeked = myQueuePeek(queue); // should return 1
|
||||
EXPECT_EQ(peeked, 1);
|
||||
|
||||
int popped = myQueuePop(queue); // should return 1, queue becomes [2]
|
||||
EXPECT_EQ(popped, 1);
|
||||
|
||||
bool isEmpty = myQueueEmpty(queue); // should return false
|
||||
EXPECT_FALSE(isEmpty);
|
||||
}
|
||||
|
||||
TEST_F(MyQueueTest, PushPeekEmpty)
|
||||
{
|
||||
myQueuePush(queue, 1); // queue: [1]
|
||||
|
||||
int peeked = myQueuePeek(queue); // should return 1
|
||||
EXPECT_EQ(peeked, 1);
|
||||
|
||||
bool isEmpty = myQueueEmpty(queue); // should return false
|
||||
EXPECT_FALSE(isEmpty);
|
||||
}
|
||||
14189
tests/test_2410.cpp
Normal file
14189
tests/test_2410.cpp
Normal file
File diff suppressed because it is too large
Load Diff
23
tests/test_258.cpp
Normal file
23
tests/test_258.cpp
Normal file
@@ -0,0 +1,23 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/258.h>
|
||||
|
||||
// 测试类定义
|
||||
class AddDigitsTest : public ::testing::Test
|
||||
{
|
||||
};
|
||||
|
||||
// 示例 1:输入 38,输出 2
|
||||
TEST_F(AddDigitsTest, Example1)
|
||||
{
|
||||
int input = 38;
|
||||
int expected = 2;
|
||||
EXPECT_EQ(addDigits(input), expected);
|
||||
}
|
||||
|
||||
// 示例 2:输入 0,输出 0
|
||||
TEST_F(AddDigitsTest, Example2)
|
||||
{
|
||||
int input = 0;
|
||||
int expected = 0;
|
||||
EXPECT_EQ(addDigits(input), expected);
|
||||
}
|
||||
19
tests/test_2712.cpp
Normal file
19
tests/test_2712.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/2712.h>
|
||||
//
|
||||
// Created by xfj12 on 2025/3/27.
|
||||
//
|
||||
TEST(MinimumCostTest, Test1)
|
||||
{
|
||||
char s[] = "0011";
|
||||
long long expected = 2;
|
||||
EXPECT_EQ(minimumCost(s), expected);
|
||||
}
|
||||
|
||||
// 测试用例 2
|
||||
TEST(MinimumCostTest, Test2)
|
||||
{
|
||||
char s[] = "010101";
|
||||
long long expected = 9;
|
||||
EXPECT_EQ(minimumCost(s), expected);
|
||||
}
|
||||
34
tests/test_2716.cpp
Normal file
34
tests/test_2716.cpp
Normal file
@@ -0,0 +1,34 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/2716.h>
|
||||
|
||||
// 测试用例 1
|
||||
TEST(MinimizedStringLengthTest, Test1)
|
||||
{
|
||||
char s[] = "aaabc";
|
||||
int expected = 3;
|
||||
EXPECT_EQ(minimizedStringLength(s), expected);
|
||||
}
|
||||
|
||||
// 测试用例 2
|
||||
TEST(MinimizedStringLengthTest, Test2)
|
||||
{
|
||||
char s[] = "cbbd";
|
||||
int expected = 3;
|
||||
EXPECT_EQ(minimizedStringLength(s), expected);
|
||||
}
|
||||
|
||||
// 测试用例 3
|
||||
TEST(MinimizedStringLengthTest, Test3)
|
||||
{
|
||||
char s[] = "dddaaa";
|
||||
int expected = 2;
|
||||
EXPECT_EQ(minimizedStringLength(s), expected);
|
||||
}
|
||||
|
||||
// 测试用例 4
|
||||
TEST(MinimizedStringLengthTest, Test4)
|
||||
{
|
||||
char s[] = "baadccab";
|
||||
int expected = 4;
|
||||
EXPECT_EQ(minimizedStringLength(s), expected);
|
||||
}
|
||||
62
tests/test_290.cpp
Normal file
62
tests/test_290.cpp
Normal file
@@ -0,0 +1,62 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/290.h>
|
||||
|
||||
class WordPatternTest : public ::testing::Test
|
||||
{
|
||||
};
|
||||
|
||||
// 示例 1: 输入 pattern = "abba", s = "dog cat cat dog" 输出 true
|
||||
TEST_F(WordPatternTest, Example1)
|
||||
{
|
||||
char pattern[] = "abba";
|
||||
char s[] = "dog cat cat dog";
|
||||
EXPECT_TRUE(wordPattern(pattern, s));
|
||||
}
|
||||
|
||||
// 示例 2: 输入 pattern = "abba", s = "dog cat cat fish" 输出 false
|
||||
TEST_F(WordPatternTest, Example2)
|
||||
{
|
||||
char pattern[] = "abba";
|
||||
char s[] = "dog cat cat fish";
|
||||
EXPECT_FALSE(wordPattern(pattern, s));
|
||||
}
|
||||
|
||||
// 示例 3: 输入 pattern = "aaaa", s = "dog cat cat dog" 输出 false
|
||||
TEST_F(WordPatternTest, Example3)
|
||||
{
|
||||
char pattern[] = "aaaa";
|
||||
char s[] = "dog cat cat dog";
|
||||
EXPECT_FALSE(wordPattern(pattern, s));
|
||||
}
|
||||
|
||||
// 示例 4: 输入 pattern = "abba", s = "dog dog dog dog" 输出 false
|
||||
TEST_F(WordPatternTest, Example4)
|
||||
{
|
||||
char pattern[] = "abba";
|
||||
char s[] = "dog dog dog dog";
|
||||
EXPECT_FALSE(wordPattern(pattern, s));
|
||||
}
|
||||
|
||||
// 示例 5: 输入 pattern = "abc", s = "dog cat dog" 输出 false
|
||||
TEST_F(WordPatternTest, Example5)
|
||||
{
|
||||
char pattern[] = "abc";
|
||||
char s[] = "dog cat dog";
|
||||
EXPECT_FALSE(wordPattern(pattern, s));
|
||||
}
|
||||
|
||||
// 示例 6: 输入 pattern = "aaa", s = "aa aa aa aa" 输出 false
|
||||
TEST_F(WordPatternTest, Example6)
|
||||
{
|
||||
char pattern[] = "aaa";
|
||||
char s[] = "aa aa aa aa";
|
||||
EXPECT_FALSE(wordPattern(pattern, s));
|
||||
}
|
||||
|
||||
// 示例 7: 输入 pattern = "e", s = "eukera" 输出 false
|
||||
TEST_F(WordPatternTest, Example7)
|
||||
{
|
||||
char pattern[] = "e";
|
||||
char s[] = "eukera";
|
||||
EXPECT_TRUE(wordPattern(pattern, s));
|
||||
}
|
||||
38
tests/test_303.cpp
Normal file
38
tests/test_303.cpp
Normal file
@@ -0,0 +1,38 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/303.h>
|
||||
|
||||
class NumArrayTest : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
NumArray *numArray = nullptr;
|
||||
|
||||
void SetUp() override
|
||||
{
|
||||
int init[] = {-2, 0, 3, -5, 2, -1};
|
||||
numArray = numArrayCreate(init, sizeof(init) / sizeof(int));
|
||||
ASSERT_NE(numArray, nullptr); // 确保初始化成功
|
||||
}
|
||||
|
||||
void TearDown() override
|
||||
{
|
||||
numArrayFree(numArray);
|
||||
}
|
||||
};
|
||||
|
||||
// 示例测试:sumRange(0, 2) == 1
|
||||
TEST_F(NumArrayTest, SumRange_0_2)
|
||||
{
|
||||
EXPECT_EQ(numArraySumRange(numArray, 0, 2), 1);
|
||||
}
|
||||
|
||||
// 示例测试:sumRange(2, 5) == -1
|
||||
TEST_F(NumArrayTest, SumRange_2_5)
|
||||
{
|
||||
EXPECT_EQ(numArraySumRange(numArray, 2, 5), -1);
|
||||
}
|
||||
|
||||
// 示例测试:sumRange(0, 5) == -3
|
||||
TEST_F(NumArrayTest, SumRange_0_5)
|
||||
{
|
||||
EXPECT_EQ(numArraySumRange(numArray, 0, 5), -3);
|
||||
}
|
||||
35
tests/test_3136.cpp
Normal file
35
tests/test_3136.cpp
Normal file
@@ -0,0 +1,35 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/3136.h>
|
||||
|
||||
// 测试类定义
|
||||
class IsValidTest : public ::testing::Test
|
||||
{
|
||||
};
|
||||
|
||||
// 示例 1:输入 "234Adas",输出 true
|
||||
TEST_F(IsValidTest, ValidWord)
|
||||
{
|
||||
char word[] = "234Adas";
|
||||
EXPECT_TRUE(isValid(word));
|
||||
}
|
||||
|
||||
// 示例 2:输入 "b3",输出 false(长度 < 3 且无元音)
|
||||
TEST_F(IsValidTest, TooShortNoVowel)
|
||||
{
|
||||
char word[] = "b3";
|
||||
EXPECT_FALSE(isValid(word));
|
||||
}
|
||||
|
||||
// 示例 3:输入 "a3$e",输出 false(包含非法字符 $ 且无辅音)
|
||||
TEST_F(IsValidTest, HasSymbolNoConsonant)
|
||||
{
|
||||
char word[] = "a3$e";
|
||||
EXPECT_FALSE(isValid(word));
|
||||
}
|
||||
|
||||
// 示例 3:输入 "3pp",输出 false(无元音)
|
||||
TEST_F(IsValidTest, NoConsonant)
|
||||
{
|
||||
char word[] = "3pp";
|
||||
EXPECT_FALSE(isValid(word));
|
||||
}
|
||||
96
tests/test_3169.cpp
Normal file
96
tests/test_3169.cpp
Normal file
@@ -0,0 +1,96 @@
|
||||
//
|
||||
// Created by gint on 2025/7/11.
|
||||
//
|
||||
#include <solution/3169.h>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <vector>
|
||||
|
||||
// 工具函数:创建二维数组
|
||||
int **create2DArray(const std::vector<std::vector<int>> &input, int *colSizeArray)
|
||||
{
|
||||
int **arr = new int *[input.size()];
|
||||
for (size_t i = 0; i < input.size(); ++i)
|
||||
{
|
||||
arr[i] = new int[input[i].size()];
|
||||
colSizeArray[i] = static_cast<int>(input[i].size());
|
||||
for (size_t j = 0; j < input[i].size(); ++j)
|
||||
{
|
||||
arr[i][j] = input[i][j];
|
||||
}
|
||||
}
|
||||
return arr;
|
||||
}
|
||||
|
||||
// 工具函数:释放二维数组
|
||||
void free2DArray(int **arr, int size)
|
||||
{
|
||||
for (int i = 0; i < size; ++i)
|
||||
{
|
||||
delete[] arr[i];
|
||||
}
|
||||
delete[] arr;
|
||||
}
|
||||
|
||||
// Test1
|
||||
TEST(CountDaysTest, Test1)
|
||||
{
|
||||
int days = 10;
|
||||
std::vector<std::vector<int>> input = {{5, 7}, {1, 3}, {9, 10}};
|
||||
int meetingsSize = static_cast<int>(input.size());
|
||||
int *meetingsColSize = new int[meetingsSize];
|
||||
int **meetings = create2DArray(input, meetingsColSize);
|
||||
|
||||
int expected = 2;
|
||||
EXPECT_EQ(countDays(days, meetings, meetingsSize, meetingsColSize), expected);
|
||||
|
||||
free2DArray(meetings, meetingsSize);
|
||||
delete[] meetingsColSize;
|
||||
}
|
||||
|
||||
// Test2
|
||||
TEST(CountDaysTest, Test2)
|
||||
{
|
||||
int days = 5;
|
||||
std::vector<std::vector<int>> input = {{2, 4}, {1, 3}};
|
||||
int meetingsSize = static_cast<int>(input.size());
|
||||
int *meetingsColSize = new int[meetingsSize];
|
||||
int **meetings = create2DArray(input, meetingsColSize);
|
||||
|
||||
int expected = 1;
|
||||
EXPECT_EQ(countDays(days, meetings, meetingsSize, meetingsColSize), expected);
|
||||
|
||||
free2DArray(meetings, meetingsSize);
|
||||
delete[] meetingsColSize;
|
||||
}
|
||||
|
||||
// Test3
|
||||
TEST(CountDaysTest, Test3)
|
||||
{
|
||||
int days = 6;
|
||||
std::vector<std::vector<int>> input = {{1, 6}};
|
||||
int meetingsSize = static_cast<int>(input.size());
|
||||
int *meetingsColSize = new int[meetingsSize];
|
||||
int **meetings = create2DArray(input, meetingsColSize);
|
||||
|
||||
int expected = 0;
|
||||
EXPECT_EQ(countDays(days, meetings, meetingsSize, meetingsColSize), expected);
|
||||
|
||||
free2DArray(meetings, meetingsSize);
|
||||
delete[] meetingsColSize;
|
||||
}
|
||||
|
||||
TEST(CountDaysTest, Test4)
|
||||
{
|
||||
int days = 8;
|
||||
std::vector<std::vector<int>> input = {{3, 4}, {4, 8}, {2, 5}, {3, 8}};
|
||||
int meetingsSize = static_cast<int>(input.size());
|
||||
int *meetingsColSize = new int[meetingsSize];
|
||||
int **meetings = create2DArray(input, meetingsColSize);
|
||||
|
||||
int expected = 1;
|
||||
EXPECT_EQ(countDays(days, meetings, meetingsSize, meetingsColSize), expected);
|
||||
|
||||
free2DArray(meetings, meetingsSize);
|
||||
delete[] meetingsColSize;
|
||||
}
|
||||
38
tests/test_3201.cpp
Normal file
38
tests/test_3201.cpp
Normal file
@@ -0,0 +1,38 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/3201.h>
|
||||
|
||||
class MaximumLengthTest : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
// 提供统一断言接口
|
||||
void AssertMaximumLength(const std::vector<int> &input, int expected)
|
||||
{
|
||||
int *arr = const_cast<int *>(input.data());
|
||||
int result = maximumLength(arr, input.size());
|
||||
EXPECT_EQ(result, expected);
|
||||
}
|
||||
};
|
||||
|
||||
// 示例 1:输入 [1,2,3,4],输出 4
|
||||
TEST_F(MaximumLengthTest, IncreasingSequence)
|
||||
{
|
||||
AssertMaximumLength({1, 2, 3, 4}, 4);
|
||||
}
|
||||
|
||||
// 示例 2:输入 [1,2,1,1,2,1,2],输出 6
|
||||
TEST_F(MaximumLengthTest, AlternatingSequence)
|
||||
{
|
||||
AssertMaximumLength({1, 2, 1, 1, 2, 1, 2}, 6);
|
||||
}
|
||||
|
||||
// 示例 3:输入 [1,3],输出 2
|
||||
TEST_F(MaximumLengthTest, ShortSequence)
|
||||
{
|
||||
AssertMaximumLength({1, 3}, 2);
|
||||
}
|
||||
|
||||
// 示例 4:输入 [4,51,68],输出 3
|
||||
TEST_F(MaximumLengthTest, TEST4)
|
||||
{
|
||||
AssertMaximumLength({4, 51, 68}, 3);
|
||||
}
|
||||
25
tests/test_3202.cpp
Normal file
25
tests/test_3202.cpp
Normal file
@@ -0,0 +1,25 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/3202.h>
|
||||
|
||||
class MaximumLengthWithKTest : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
void AssertMaximumLength(const std::vector<int> &nums, int k, int expected)
|
||||
{
|
||||
int *arr = const_cast<int *>(nums.data());
|
||||
int result = maximumLength(arr, nums.size(), k);
|
||||
EXPECT_EQ(result, expected);
|
||||
}
|
||||
};
|
||||
|
||||
// 示例 1:nums = [1,2,3,4,5], k = 2 => 输出 5
|
||||
TEST_F(MaximumLengthWithKTest, AllIncreasing)
|
||||
{
|
||||
AssertMaximumLength({1, 2, 3, 4, 5}, 2, 5);
|
||||
}
|
||||
|
||||
// 示例 2:nums = [1,4,2,3,1,4], k = 3 => 输出 4
|
||||
TEST_F(MaximumLengthWithKTest, AlternatingValidPairs)
|
||||
{
|
||||
AssertMaximumLength({1, 4, 2, 3, 1, 4}, 3, 4);
|
||||
}
|
||||
35
tests/test_326.cpp
Normal file
35
tests/test_326.cpp
Normal file
@@ -0,0 +1,35 @@
|
||||
#include <climits>
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/326.h>
|
||||
|
||||
class IsPowerOfThreeTest : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
void AssertIsPowerOfThree(int input, bool expected)
|
||||
{
|
||||
EXPECT_EQ(isPowerOfThree(input), expected);
|
||||
}
|
||||
};
|
||||
|
||||
// 示例测试用例
|
||||
TEST_F(IsPowerOfThreeTest, ExampleTrueCases)
|
||||
{
|
||||
AssertIsPowerOfThree(27, true);
|
||||
AssertIsPowerOfThree(9, true);
|
||||
AssertIsPowerOfThree(1, true); // 3^0 = 1
|
||||
AssertIsPowerOfThree(3, true);
|
||||
}
|
||||
|
||||
TEST_F(IsPowerOfThreeTest, ExampleFalseCases)
|
||||
{
|
||||
AssertIsPowerOfThree(0, false);
|
||||
AssertIsPowerOfThree(45, false);
|
||||
AssertIsPowerOfThree(-3, false);
|
||||
AssertIsPowerOfThree(10, false);
|
||||
}
|
||||
|
||||
TEST_F(IsPowerOfThreeTest, EdgeCases)
|
||||
{
|
||||
AssertIsPowerOfThree(INT_MIN, false);
|
||||
AssertIsPowerOfThree(INT_MAX, false); // INT_MAX = 2^31 - 1,不是3的幂
|
||||
}
|
||||
32
tests/test_3397.cpp
Normal file
32
tests/test_3397.cpp
Normal file
@@ -0,0 +1,32 @@
|
||||
// This file is generated by mkfile.py
|
||||
// Date: 2025-10-18
|
||||
|
||||
#include <solution/3397.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
class MaxDistinctElementsTest : public ::testing::Test {
|
||||
protected:
|
||||
void AssertMaxDistinctElements(std::vector<int> nums, int k, int expected) {
|
||||
int* arr = new int[nums.size()];
|
||||
std::copy(nums.begin(), nums.end(), arr);
|
||||
|
||||
int result = maxDistinctElements(arr, nums.size(), k);
|
||||
ASSERT_EQ(result, expected);
|
||||
|
||||
delete[] arr;
|
||||
}
|
||||
};
|
||||
|
||||
// 示例 1
|
||||
TEST_F(MaxDistinctElementsTest, Example1) {
|
||||
// 输入:nums = [1,2,2,3,3,4], k = 2
|
||||
// 输出:6
|
||||
AssertMaxDistinctElements({1, 2, 2, 3, 3, 4}, 2, 6);
|
||||
}
|
||||
|
||||
// 示例 2
|
||||
TEST_F(MaxDistinctElementsTest, Example2) {
|
||||
// 输入:nums = [4,4,4,4], k = 1
|
||||
// 输出:3
|
||||
AssertMaxDistinctElements({4, 4, 4, 4}, 1, 3);
|
||||
}
|
||||
29
tests/test_345.cpp
Normal file
29
tests/test_345.cpp
Normal file
@@ -0,0 +1,29 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/345.h>
|
||||
|
||||
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");
|
||||
}
|
||||
51
tests/test_387.cpp
Normal file
51
tests/test_387.cpp
Normal file
@@ -0,0 +1,51 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/387.h>
|
||||
|
||||
class FirstUniqCharTest : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
void AssertFirstUniqChar(const std::string &input, int expected)
|
||||
{
|
||||
char buf[1001];
|
||||
strncpy(buf, input.c_str(), sizeof(buf));
|
||||
buf[1000] = '\0'; // 防止越界
|
||||
int result = firstUniqChar(buf);
|
||||
EXPECT_EQ(result, expected);
|
||||
}
|
||||
};
|
||||
|
||||
// 示例 1:leetcode → 'l' 是第一个唯一字符,索引 0
|
||||
TEST_F(FirstUniqCharTest, Example1)
|
||||
{
|
||||
AssertFirstUniqChar("leetcode", 0);
|
||||
}
|
||||
|
||||
// 示例 2:loveleetcode → 'v' 是第一个唯一字符,索引 2
|
||||
TEST_F(FirstUniqCharTest, Example2)
|
||||
{
|
||||
AssertFirstUniqChar("loveleetcode", 2);
|
||||
}
|
||||
|
||||
// 示例 3:aabb → 没有唯一字符,返回 -1
|
||||
TEST_F(FirstUniqCharTest, Example3)
|
||||
{
|
||||
AssertFirstUniqChar("aabb", -1);
|
||||
}
|
||||
|
||||
// 边界测试:空字符串
|
||||
TEST_F(FirstUniqCharTest, EmptyString)
|
||||
{
|
||||
AssertFirstUniqChar("", -1);
|
||||
}
|
||||
|
||||
// 边界测试:单字符
|
||||
TEST_F(FirstUniqCharTest, SingleChar)
|
||||
{
|
||||
AssertFirstUniqChar("z", 0);
|
||||
}
|
||||
|
||||
// 更多测试:末尾唯一字符
|
||||
TEST_F(FirstUniqCharTest, UniqueAtEnd)
|
||||
{
|
||||
AssertFirstUniqChar("aabbc", 4); // 'c' 是唯一字符
|
||||
}
|
||||
66
tests/test_392.cpp
Normal file
66
tests/test_392.cpp
Normal file
@@ -0,0 +1,66 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/392.h>
|
||||
|
||||
class IsSubsequenceTest : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
void AssertIsSubsequence(const std::string &s, const std::string &t, bool expected)
|
||||
{
|
||||
char s_buf[1001], t_buf[1001];
|
||||
strncpy(s_buf, s.c_str(), sizeof(s_buf));
|
||||
s_buf[1000] = '\0';
|
||||
strncpy(t_buf, t.c_str(), sizeof(t_buf));
|
||||
t_buf[1000] = '\0';
|
||||
bool result = isSubsequence(s_buf, t_buf);
|
||||
EXPECT_EQ(result, expected);
|
||||
}
|
||||
};
|
||||
|
||||
// 示例 1:s = "abc", t = "ahbgdc" → true
|
||||
TEST_F(IsSubsequenceTest, Example1)
|
||||
{
|
||||
AssertIsSubsequence("abc", "ahbgdc", true);
|
||||
}
|
||||
|
||||
// 示例 2:s = "axc", t = "ahbgdc" → false
|
||||
TEST_F(IsSubsequenceTest, Example2)
|
||||
{
|
||||
AssertIsSubsequence("axc", "ahbgdc", false);
|
||||
}
|
||||
|
||||
// 边界测试:s 为空 → 总是 true
|
||||
TEST_F(IsSubsequenceTest, EmptyS)
|
||||
{
|
||||
AssertIsSubsequence("", "anystring", true);
|
||||
}
|
||||
|
||||
// 边界测试:t 为空 → 只有 s 也为空才为 true
|
||||
TEST_F(IsSubsequenceTest, EmptyT)
|
||||
{
|
||||
AssertIsSubsequence("a", "", false);
|
||||
AssertIsSubsequence("", "", true);
|
||||
}
|
||||
|
||||
// s 比 t 长 → false
|
||||
TEST_F(IsSubsequenceTest, SLongerThanT)
|
||||
{
|
||||
AssertIsSubsequence("abcdefg", "abc", false);
|
||||
}
|
||||
|
||||
// s 与 t 完全相同 → true
|
||||
TEST_F(IsSubsequenceTest, SameString)
|
||||
{
|
||||
AssertIsSubsequence("abcde", "abcde", true);
|
||||
}
|
||||
|
||||
// 非连续但顺序正确 → true
|
||||
TEST_F(IsSubsequenceTest, SparseSubsequence)
|
||||
{
|
||||
AssertIsSubsequence("ace", "abcde", true);
|
||||
}
|
||||
|
||||
// 非连续顺序错误 → false
|
||||
TEST_F(IsSubsequenceTest, WrongOrder)
|
||||
{
|
||||
AssertIsSubsequence("aec", "abcde", false);
|
||||
}
|
||||
39
tests/test_509.cpp
Normal file
39
tests/test_509.cpp
Normal file
@@ -0,0 +1,39 @@
|
||||
// This file is generated by mkfile.py
|
||||
// Date: 2025-12-05
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/509.h>
|
||||
// Tests for fib (LeetCode 509)
|
||||
class FibTest : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
void AssertFib(int n, int expected)
|
||||
{
|
||||
ASSERT_EQ(fib(n), expected);
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(FibTest, Zero)
|
||||
{
|
||||
AssertFib(0, 0);
|
||||
}
|
||||
|
||||
TEST_F(FibTest, One)
|
||||
{
|
||||
AssertFib(1, 1);
|
||||
}
|
||||
|
||||
TEST_F(FibTest, Two)
|
||||
{
|
||||
AssertFib(2, 1);
|
||||
}
|
||||
|
||||
TEST_F(FibTest, Ten)
|
||||
{
|
||||
AssertFib(10, 55);
|
||||
}
|
||||
|
||||
TEST_F(FibTest, Twenty)
|
||||
{
|
||||
AssertFib(20, 6765);
|
||||
}
|
||||
47
tests/test_746.cpp
Normal file
47
tests/test_746.cpp
Normal file
@@ -0,0 +1,47 @@
|
||||
// This file is generated by mkfile.py
|
||||
// Date: 2025-12-05
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/746.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
|
||||
// Tests for minCostClimbingStairs (LeetCode 746)
|
||||
class MinCostClimbingStairsTest : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
void AssertMinCost(const std::vector<int> &input, int expected)
|
||||
{
|
||||
int *cost = new int[input.size()];
|
||||
std::copy(input.begin(), input.end(), cost);
|
||||
|
||||
int result = minCostClimbingStairs(cost, (int)input.size());
|
||||
ASSERT_EQ(result, expected);
|
||||
|
||||
delete[] cost;
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(MinCostClimbingStairsTest, Example1)
|
||||
{
|
||||
// cost = [10,15,20] -> expected 15
|
||||
AssertMinCost({10, 15, 20}, 15);
|
||||
}
|
||||
|
||||
TEST_F(MinCostClimbingStairsTest, Example2)
|
||||
{
|
||||
// cost = [1,100,1,1,1,100,1,1,100,1] -> expected 6
|
||||
AssertMinCost({1, 100, 1, 1, 1, 100, 1, 1, 100, 1}, 6);
|
||||
}
|
||||
|
||||
TEST_F(MinCostClimbingStairsTest, TwoSteps)
|
||||
{
|
||||
// Two steps: choose cheaper one
|
||||
AssertMinCost({5, 3}, 3);
|
||||
}
|
||||
|
||||
TEST_F(MinCostClimbingStairsTest, ZeroCost)
|
||||
{
|
||||
AssertMinCost({0, 0, 0}, 0);
|
||||
}
|
||||
65
tests/test_976.cpp
Normal file
65
tests/test_976.cpp
Normal file
@@ -0,0 +1,65 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <solution/976.h>
|
||||
// 测试类定义
|
||||
class LargestPerimeterTest : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
void AssertLargestPerimeter(std::vector<int> 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);
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user