[#0165]feat(leetcode): Init project, add C# solution, unit test and README

This commit is contained in:
2025-09-23 10:59:18 +08:00
parent c4e23d5be3
commit 72aa011de9
6 changed files with 342 additions and 0 deletions

View File

@@ -0,0 +1,56 @@
// LeetCode 165: Compare Version Numbers 單元測試xUnit
using System.Linq;
using Xunit;
public class SolutionTests {
private readonly Solution _s = new Solution();
[Theory]
[InlineData("1.01", "1.001", 0)]
[InlineData("1.0", "1.0.0", 0)]
[InlineData("1.0.0.0", "1", 0)]
[InlineData("0.1", "1.1", -1)]
[InlineData("1.0.1", "1", 1)]
[InlineData("7.5.2.4", "7.5.3", -1)]
public void CompareVersion_ReturnsExpectedResult(string version1, string version2, int expected) {
var actual = _s.CompareVersion(version1, version2);
Assert.Equal(expected, actual);
}
[Theory]
[InlineData("1.0.1", "1")]
[InlineData("3.0.0", "2.9.9.9")]
[InlineData("10.4", "10.3.9")]
public void CompareVersion_IsAntiSymmetric(string left, string right) {
var forward = _s.CompareVersion(left, right);
var backward = _s.CompareVersion(right, left);
Assert.Equal(1, forward);
Assert.Equal(-1, backward);
}
[Theory]
[InlineData("", "", 0)]
[InlineData("", "0", 0)]
[InlineData("0.0.0", "", 0)]
[InlineData("000", "0", 0)]
[InlineData("2147483647", "2147483646", 1)]
[InlineData("2147483646", "2147483647", -1)]
public void CompareVersion_HandlesBoundaryInputs(string version1, string version2, int expected) {
var actual = _s.CompareVersion(version1, version2);
Assert.Equal(expected, actual);
}
[Fact]
public void CompareVersion_LongSequencesDifferAtEnd() {
var left = string.Join('.', Enumerable.Repeat("0", 199).Append("1"));
var right = string.Join('.', Enumerable.Repeat("0", 200));
var result = _s.CompareVersion(left, right);
Assert.Equal(1, result);
}
}

View File

@@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="../csharp/csharp.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,29 @@
# 邊界情況清單165 Compare Version Numbers
## 需要測試的邊界
- [x] 空輸入 / 單一元素:`""``"0"`
- [x] 重複元素 / 全相同:`"1.0.0"` vs `"1"`
- [x] 極值(最小/最大):`"2147483647"` vs `"2147483646"`
- [x] 含負數 / 0 / 大數:題目無負數,已覆蓋多零與大修訂號
- [x] 大資料量接近上限200 段版本字串
## 額外案例
### 案例 1
- 輸入:`version1 = "", version2 = "0"`
- 預期:`0`
- 說明:空字串缺少所有段,視為全 0
### 案例 2
- 輸入:`version1 = "2147483647", version2 = "2147483646"`
- 預期:`1`
- 說明:驗證最大 32-bit 整數段處理
### 案例 3
- 輸入:`version1 = "0.0.0", version2 = "0"`
- 預期:`0`
- 說明:多段全 0 與單段 0 視為相同
### 案例 4
- 輸入:`version1 = string.Join(".", Enumerable.Repeat("0", 199)) + ".1"`, `version2 = string.Join(".", Enumerable.Repeat("0", 200))`
- 預期:`1`
- 說明:長度 200 的版本字串,在最後一段差異才分勝負