| @@ -5,3 +5,17 @@ | |||||
| *.testlog | *.testlog | ||||
| *.manifest | *.manifest | ||||
| *.user | *.user | ||||
| *.obj | |||||
| *.tlog | |||||
| *.coverage | |||||
| *.pdb | |||||
| *.log | |||||
| *.exe | |||||
| *.lib | |||||
| *.recipe | |||||
| *.dll | |||||
| *.idb | |||||
| *.pch | |||||
| *.txt | |||||
| *.ilk | |||||
| *.exp | |||||
| @@ -17,7 +17,6 @@ | |||||
| <Configuration>Release</Configuration> | <Configuration>Release</Configuration> | ||||
| <Platform>x64</Platform> | <Platform>x64</Platform> | ||||
| </ProjectConfiguration> | </ProjectConfiguration> | ||||
| </ItemGroup> | </ItemGroup> | ||||
| <PropertyGroup Label="Globals"> | <PropertyGroup Label="Globals"> | ||||
| <VCProjectVersion>16.0</VCProjectVersion> | <VCProjectVersion>16.0</VCProjectVersion> | ||||
| @@ -53,25 +52,23 @@ | |||||
| <WholeProgramOptimization>true</WholeProgramOptimization> | <WholeProgramOptimization>true</WholeProgramOptimization> | ||||
| <CharacterSet>Unicode</CharacterSet> | <CharacterSet>Unicode</CharacterSet> | ||||
| </PropertyGroup> | </PropertyGroup> | ||||
| <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> | <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> | ||||
| <ImportGroup Label="ExtensionSettings"> | <ImportGroup Label="ExtensionSettings"> | ||||
| </ImportGroup> | </ImportGroup> | ||||
| <ImportGroup Label="Shared" > | |||||
| <ImportGroup Label="Shared"> | |||||
| </ImportGroup> | |||||
| <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | |||||
| <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |||||
| </ImportGroup> | |||||
| <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | |||||
| <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |||||
| </ImportGroup> | |||||
| <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> | |||||
| <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |||||
| </ImportGroup> | |||||
| <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> | |||||
| <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |||||
| </ImportGroup> | </ImportGroup> | ||||
| <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | |||||
| <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |||||
| </ImportGroup> | |||||
| <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | |||||
| <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |||||
| </ImportGroup> | |||||
| <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> | |||||
| <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |||||
| </ImportGroup> | |||||
| <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> | |||||
| <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |||||
| </ImportGroup> | |||||
| <PropertyGroup Label="UserMacros" /> | <PropertyGroup Label="UserMacros" /> | ||||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | ||||
| <LinkIncremental>true</LinkIncremental> | <LinkIncremental>true</LinkIncremental> | ||||
| @@ -85,7 +82,6 @@ | |||||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> | ||||
| <LinkIncremental>false</LinkIncremental> | <LinkIncremental>false</LinkIncremental> | ||||
| </PropertyGroup> | </PropertyGroup> | ||||
| <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | ||||
| <ClCompile> | <ClCompile> | ||||
| <WarningLevel>Level3</WarningLevel> | <WarningLevel>Level3</WarningLevel> | ||||
| @@ -142,9 +138,17 @@ | |||||
| <GenerateDebugInformation>true</GenerateDebugInformation> | <GenerateDebugInformation>true</GenerateDebugInformation> | ||||
| </Link> | </Link> | ||||
| </ItemDefinitionGroup> | </ItemDefinitionGroup> | ||||
| <ItemGroup></ItemGroup> | |||||
| <ItemGroup> | |||||
| <ClInclude Include="include\1_ContainsNearbyDuplicate.h" /> | |||||
| </ItemGroup> | |||||
| <ItemGroup> | |||||
| <ClCompile Include="src\1_ContainsNearbyDuplicate.cpp" /> | |||||
| <ClCompile Include="src\main.cpp" /> | |||||
| </ItemGroup> | |||||
| <ItemGroup> | |||||
| <None Include="config\1_ContainsNearbyDuplicate.ini" /> | |||||
| </ItemGroup> | |||||
| <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | ||||
| <ImportGroup Label="ExtensionTargets"> | <ImportGroup Label="ExtensionTargets"> | ||||
| </ImportGroup> | </ImportGroup> | ||||
| </Project> | |||||
| </Project> | |||||
| @@ -14,4 +14,22 @@ | |||||
| <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> | <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> | ||||
| </Filter> | </Filter> | ||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | |||||
| <ClInclude Include="include\1_ContainsNearbyDuplicate.h"> | |||||
| <Filter>头文件</Filter> | |||||
| </ClInclude> | |||||
| </ItemGroup> | |||||
| <ItemGroup> | |||||
| <ClCompile Include="src\1_ContainsNearbyDuplicate.cpp"> | |||||
| <Filter>源文件</Filter> | |||||
| </ClCompile> | |||||
| <ClCompile Include="src\main.cpp"> | |||||
| <Filter>源文件</Filter> | |||||
| </ClCompile> | |||||
| </ItemGroup> | |||||
| <ItemGroup> | |||||
| <None Include="config\1_ContainsNearbyDuplicate.ini"> | |||||
| <Filter>资源文件</Filter> | |||||
| </None> | |||||
| </ItemGroup> | |||||
| </Project> | </Project> | ||||
| @@ -0,0 +1,44 @@ | |||||
| [Test1] | |||||
| array=1,2,3,1 | |||||
| key=3 | |||||
| output=1 | |||||
| [Test2] | |||||
| array=1,0,1,1 | |||||
| key=1 | |||||
| output=1 | |||||
| [Test3] | |||||
| array=1,2,3,1,2,3 | |||||
| key=2 | |||||
| output=0 | |||||
| [Test4] | |||||
| array=1,2,3,1,2,3 | |||||
| key=3 | |||||
| output=1 | |||||
| [Test5] | |||||
| array=1,0,3,4,2,1,0,3,4 | |||||
| key=3 | |||||
| output=0 | |||||
| [Test6] | |||||
| array=8,7,15,1,6,1,9,15 | |||||
| key=1 | |||||
| output=0 | |||||
| [Test7] | |||||
| array=8,7,15,1,6,1,9,15 | |||||
| key=3 | |||||
| output=1 | |||||
| [Test8] | |||||
| array=1,4,3,3,2,2,3 | |||||
| key=1 | |||||
| output=1 | |||||
| [Test9] | |||||
| array=1,8,3,9,1,5,6,9,5,2,7 | |||||
| key=1 | |||||
| output=0 | |||||
| [Test10] | |||||
| array=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 | |||||
| key=20 | |||||
| output=0 | |||||
| [Test11] | |||||
| array=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,1 | |||||
| key=25 | |||||
| output=1 | |||||
| @@ -0,0 +1,11 @@ | |||||
| #pragma once | |||||
| #include <stdio.h> | |||||
| #include <stdlib.h> | |||||
| typedef struct node_t { //定义结构体数组类型 | |||||
| int value; //存放 数组值 | |||||
| int index; //存放 下标 | |||||
| }node; | |||||
| int Comper_1(const void* a, const void* b); | |||||
| int GetAbsolute(int a, int b); | |||||
| bool ContainsNearbyDuplicate(int* nums, int numsSize, int k); | |||||
| @@ -0,0 +1,57 @@ | |||||
| #include "../include/1_ContainsNearbyDuplicate.h" | |||||
| //题目:给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j | |||||
| // 使得 nums [i] = nums [j],并且i 和 j的差的绝对值至多为k。 | |||||
| //思路:1.定义结构体数组,把数组每个元素的值及其对应下标存在结构体数组 | |||||
| // 2.按照数组元素的值,对结构体数组排序 | |||||
| // 3.遍历结构体数组,比较相结构体数组元素及其对应的下标,找到返回true,否则返回false | |||||
| bool ContainsNearbyDuplicate(int* nums, int numsSize, int k) | |||||
| { | |||||
| int i = 0; | |||||
| int j = 0; | |||||
| node* arr = NULL; | |||||
| arr = (node*)malloc(sizeof(node) * numsSize); //为arr指针分配足够空间,用来保存数组 | |||||
| if (NULL == arr){ | |||||
| printf("内存分配失败\n"); | |||||
| } | |||||
| else{ | |||||
| for (i = 0; i < numsSize; i++){ //遍历数组nums,把nums里的值及其对应的下标保存在结构体数组arr中 | |||||
| arr[i].value = nums[i]; | |||||
| arr[i].index = i; | |||||
| } | |||||
| qsort(arr, numsSize, sizeof(node), Comper_1); //调用c库函数qsort,对得到的数组arr进行排序 | |||||
| for (i = 0; i < numsSize; i++){ //对排好序的数组arr遍历,寻找返回true的条件 | |||||
| for (j = i + 1; j < numsSize; j++){ | |||||
| if (arr[i].value == arr[j].value){ //第i个元素和i后面的元素作比较,判断值是否相等 | |||||
| if (GetAbsolute(arr[j].index, arr[i].index) <= k){ //求得下标差的绝对值,和k作比较 | |||||
| return true; | |||||
| } | |||||
| } | |||||
| else { //不符合则跳出循环 | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| free(arr); | |||||
| return false; //循环执完以后,说明没有符合的结果,则返回false; | |||||
| } | |||||
| int Comper_1(const void* a, const void* b) //qsort中的比较函数 | |||||
| { //返回值<0,升序;返回值>0,降序 | |||||
| if (((node*)a)->value < ((node*)b)->value) | |||||
| return -1; | |||||
| else if (((node*)a)->value == ((node*)b)->value) | |||||
| return 0; | |||||
| else | |||||
| return 1; | |||||
| } | |||||
| int GetAbsolute(int a, int b) //两数相减求绝对值 | |||||
| { | |||||
| int t; | |||||
| t = a - b; | |||||
| if (t < 0) | |||||
| t = t - 2 * t; | |||||
| return t; | |||||
| } | |||||
| @@ -0,0 +1,8 @@ | |||||
| #include <stdio.h> | |||||
| int main() { | |||||
| return 0; | |||||
| } | |||||
| @@ -2,4 +2,71 @@ | |||||
| #include "pch.h" | #include "pch.h" | ||||
| // 当使用预编译的头时,需要使用此源文件,编译才能成功。 | |||||
| int CalcCount(int n, char(*str)[10], const char* FileName) | |||||
| { | |||||
| TCHAR chSectionNames[2048] = { 0 };//定义一个数组,保存读取节的名字 | |||||
| char* pSectionName; //保存找到的某个节名字符串的首地址 | |||||
| int i = 0; //i指向数组chSectionNames的某个位置,从0开始,顺序后移 | |||||
| int j = 0; //j用来保存下一个节名字符串的首地址相对于当前i的位置偏移量 | |||||
| int k = 0; //临时变量,用于给str数组赋值 | |||||
| int m = 0; //临时变量,用于给str数组赋值 | |||||
| int count = 0; //统计节的个数 | |||||
| GetPrivateProfileSectionNames(chSectionNames, 2048, FileName);//获取文件中的节名,每个节名以"\0"分割,保存在chSectionNames中 | |||||
| //要加头文件 | |||||
| for (i = 0; i < 2048; i++, j++)//对chSectionName中保存的内容进行拆分 | |||||
| { | |||||
| if (chSectionNames[0] == '\0')//如果第一个字符就是0,则说明ini中一个节也没有, | |||||
| { | |||||
| break; | |||||
| } | |||||
| if (chSectionNames[i] == '\0') | |||||
| { | |||||
| count++; | |||||
| pSectionName = &chSectionNames[i - j]; //找到一个0,则说明从这个字符往前,减掉j个偏移量, | |||||
| //就是一个节名的首地址 | |||||
| j = -1; //找到一个节名后,j的值要还原,以统计下一个节名地址的偏移量 | |||||
| //赋成-1是因为节名字符串的最后一个字符0是终止符,不能作为节名 | |||||
| for (m = 0; m <= strlen(pSectionName); m++)//把找到的节名保存到str中 | |||||
| { | |||||
| str[k][m] = *(pSectionName + m); | |||||
| } | |||||
| k++;//变量自加,用来保存下一个节名 | |||||
| //在获取节名的时候可以获取该节中键的值,前提是我们知道该节中有哪些键。 | |||||
| if (chSectionNames[i + 1] == 0) | |||||
| { | |||||
| break; //当两个相邻的字符都是0时,则所有的节名都已找到,循环终止 | |||||
| } | |||||
| } | |||||
| } | |||||
| return count;//返回节名的个数 | |||||
| } | |||||
| //***************************************************************************************************// | |||||
| //************切割字符串函数,返回值为int数组的首地址,通过传入int指针带回数组元素个数***************// | |||||
| //***************************************************************************************************// | |||||
| int* str_device(CString str, int* value_count) | |||||
| { | |||||
| char* token; //存放被切割后的第一个子串 | |||||
| int* Section_devide = (int*)malloc(sizeof(int) * 200);//存放字符切割完成以后的数组元素值 | |||||
| char Section_value[500] = { 0 };//存放nums转换成string类型的结果 | |||||
| memset(Section_value, 0, sizeof(char) * 500); | |||||
| *value_count = 0; | |||||
| strcpy(Section_value, str);//将CString类型的字符串转换成char类型,方便后面切割字符串 | |||||
| //获得切割到的第一个字符串 | |||||
| token = strtok(Section_value, ","); | |||||
| /* 继续获取其他的子字符串 */ | |||||
| while (token != NULL) { | |||||
| Section_devide[*value_count] = (_ttoi)(token);//把切割得到的子串转为int,存到数组中去。 | |||||
| token = strtok(NULL, ","); | |||||
| (*value_count)++; //记录存了多少个元素 | |||||
| } | |||||
| return Section_devide; //返回数组首地址 | |||||
| } | |||||
| //字符串转bool | |||||
| bool CstrToBool(CString str) | |||||
| { | |||||
| if (str == "1") { | |||||
| return 1; | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| @@ -7,6 +7,19 @@ | |||||
| #ifndef PCH_H | #ifndef PCH_H | ||||
| #define PCH_H | #define PCH_H | ||||
| // 添加要在此处预编译的标头 | |||||
| #include <stdio.h> | |||||
| #include <stdlib.h> | |||||
| #include <string.h> | |||||
| #include<Windows.h> | |||||
| #include <atlstr.h> | |||||
| #include"../code/include/1_ContainsNearbyDuplicate.h" | |||||
| int CalcCount(int n, char(*str)[10], const char* FileName); | |||||
| int* str_device(CString str, int* value_count); | |||||
| bool CstrToBool(CString str); | |||||
| #endif //PCH_H | #endif //PCH_H | ||||
| @@ -2,15 +2,38 @@ | |||||
| #include "CppUnitTest.h" | #include "CppUnitTest.h" | ||||
| using namespace Microsoft::VisualStudio::CppUnitTestFramework; | using namespace Microsoft::VisualStudio::CppUnitTestFramework; | ||||
| namespace test | |||||
| #define FileName_1 "../code/config/1_ContainsNearbyDuplicate.ini" | |||||
| namespace test1 | |||||
| { | |||||
| TEST_CLASS(UnitTest_1) | |||||
| { | |||||
| TEST_METHOD(TestMethode1) | |||||
| { | |||||
| char Section_Name[100][10] = { 0 }; | |||||
| int Section_Count = CalcCount(100, Section_Name, FileName_1); | |||||
| int array_count = 0; | |||||
| int* Section_Value; | |||||
| CString Na, Nb, nExpect; | |||||
| for (int i = 0; i < Section_Count; i++) { | |||||
| GetPrivateProfileString(Section_Name[i], "array", " ", Na.GetBuffer(200), 200, FileName_1); | |||||
| GetPrivateProfileString(Section_Name[i], "key", " ", Nb.GetBuffer(20), 20, FileName_1); | |||||
| GetPrivateProfileString(Section_Name[i], "output", " ", nExpect.GetBuffer(20), 20, FileName_1); | |||||
| Section_Value = str_device(Na, &array_count); | |||||
| bool nReal = ContainsNearbyDuplicate(Section_Value, array_count, _ttoi(Nb)); | |||||
| Assert::AreEqual(nReal, CstrToBool(nExpect)); | |||||
| } | |||||
| } | |||||
| }; | |||||
| } | |||||
| namespace test2 | |||||
| { | { | ||||
| TEST_CLASS(test) | TEST_CLASS(test) | ||||
| { | { | ||||
| public: | public: | ||||
| TEST_METHOD(TestMethod1) | TEST_METHOD(TestMethod1) | ||||
| { | { | ||||
| } | } | ||||
| }; | }; | ||||
| } | } | ||||
| @@ -31,7 +31,7 @@ | |||||
| <ConfigurationType>DynamicLibrary</ConfigurationType> | <ConfigurationType>DynamicLibrary</ConfigurationType> | ||||
| <UseDebugLibraries>true</UseDebugLibraries> | <UseDebugLibraries>true</UseDebugLibraries> | ||||
| <PlatformToolset>v142</PlatformToolset> | <PlatformToolset>v142</PlatformToolset> | ||||
| <CharacterSet>Unicode</CharacterSet> | |||||
| <CharacterSet>MultiByte</CharacterSet> | |||||
| <UseOfMfc>false</UseOfMfc> | <UseOfMfc>false</UseOfMfc> | ||||
| </PropertyGroup> | </PropertyGroup> | ||||
| <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> | ||||
| @@ -93,13 +93,15 @@ | |||||
| <WarningLevel>Level3</WarningLevel> | <WarningLevel>Level3</WarningLevel> | ||||
| <SDLCheck>true</SDLCheck> | <SDLCheck>true</SDLCheck> | ||||
| <AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | <AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||
| <PreprocessorDefinitions>WIN32;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||||
| <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||||
| <UseFullPaths>true</UseFullPaths> | <UseFullPaths>true</UseFullPaths> | ||||
| <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> | <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> | ||||
| </ClCompile> | </ClCompile> | ||||
| <Link> | <Link> | ||||
| <SubSystem>Windows</SubSystem> | <SubSystem>Windows</SubSystem> | ||||
| <AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> | <AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> | ||||
| <GenerateDebugInformation>DebugFull</GenerateDebugInformation> | |||||
| <AdditionalDependencies>../code/Debug/*.obj;%(AdditionalDependencies)</AdditionalDependencies> | |||||
| </Link> | </Link> | ||||
| </ItemDefinitionGroup> | </ItemDefinitionGroup> | ||||
| <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> | <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> | ||||