Compare commits

...

10 Commits

62 changed files with 918 additions and 1130 deletions

View File

@@ -1,24 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.2.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "largestGoodInteger", "largestGoodInteger.csproj", "{DF73131C-3A52-FFDC-7C0C-19190AA3E331}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{DF73131C-3A52-FFDC-7C0C-19190AA3E331}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DF73131C-3A52-FFDC-7C0C-19190AA3E331}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DF73131C-3A52-FFDC-7C0C-19190AA3E331}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DF73131C-3A52-FFDC-7C0C-19190AA3E331}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {E9F3A871-90C4-4B8E-81E2-B0AF873694BF}
EndGlobalSection
EndGlobal

View File

@@ -1,63 +0,0 @@
public class Solution {
public string LargestGoodInteger(string num)
{
// var count = 0;
// char lastNum = 'a';
// var numList = new List<int>();
// for (var i = 0; i < num.Length; i++)
// {
// if (num[i] == lastNum)
// {
// count++;
// if (count == 3)
// {
// numList.Add(int.Parse(num[i].ToString()));
// }
// }
// else
// {
// count = 1;
// }
// lastNum = num[i];
// }
// if (numList.Count == 0)
// {
// return "";
// }
// else
// {
// var a = numList.Max().ToString();
// return $"{a}{a}{a}";
// }
string max = "";
for (int i = 0; i < num.Length - 2; i++)
{
if (num[i] == num[i + 1] && num[i] == num[i + 2])
{
string current = $"{num[i]}{num[i]}{num[i]}";
if (max == "") max = current;
else
{
if (int.Parse(current) > int.Parse(max))
max = current;
}
}
}
return max;
}
}
class program
{
static void Main()
{
var solution = new Solution();
Console.WriteLine(solution.LargestGoodInteger("6777133339"));
}
}

View File

@@ -1,23 +0,0 @@
package main
import "fmt"
func LargestGoodInteger(num string) string {
max := ""
for i := 0; i < len(num)-2; i++ {
if num[i] == num[i+1] && num[i] == num[i+2] {
current := string([]byte{num[i], num[i], num[i]})
if current > max {
max = current
}
}
}
return max
}
func main() {
fmt.Println(LargestGoodInteger("7636669283"))
}

View File

@@ -1,24 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.2.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProductQueries", "C#\ProductQueries.csproj", "{412F89C4-B1BF-D819-298B-9C873A098742}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{412F89C4-B1BF-D819-298B-9C873A098742}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{412F89C4-B1BF-D819-298B-9C873A098742}.Debug|Any CPU.Build.0 = Debug|Any CPU
{412F89C4-B1BF-D819-298B-9C873A098742}.Release|Any CPU.ActiveCfg = Release|Any CPU
{412F89C4-B1BF-D819-298B-9C873A098742}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {BDF3A5A3-29B8-4169-8A46-A13A7DE900D8}
EndGlobalSection
EndGlobal

View File

@@ -1,69 +0,0 @@
using System;
public class Solution
{
public int[] ProductQueries(int n, int[][] queries)
{
// 1. n => calculate in powers of 2
// 2. get number array without 0
var powers = CalPower(n);
return CalQueries(powers, queries);
}
private int[] CalPower(int n)
{
var result = new List<int>();
while (n > 0)
{
var num = n % 2;
result.Add(num);
n /= 2;
}
var newResult = new List<int>();
for (var i = 0; i < result.Count; i++)
{
if (result[i] != 0)
{
var ans = (int)Math.Pow(2, i);
newResult.Add(ans);
}
}
return newResult.ToArray();
}
private int[] CalQueries(int[] powers, int[][] queries)
{
const int MOD = 1000000007;
var result = new List<int>();
foreach (var query in queries)
{
long count = 1;
for (var i = query[0]; i <= query[1]; i++)
{
count = (count * powers[i]) % MOD;
}
result.Add(count);
}
return result.ToArray();
}
}
class Program
{
static void Main()
{
var Solution = new Solution();
var ans = Solution.ProductQueries(15, [[0, 1], [2, 2], [0, 3]]);
Console.WriteLine(string.Join(", ", ans));
ans = Solution.ProductQueries(919, [[5,5],[4,4],[0,1],[1,5],[4,6],[6,6],[5,6],[0,3],[5,5],[5,6],[1,2],[3,5],[3,6],[5,5],[4,4],[1,1],[2,4],[4,5],[4,4],[5,6],[0,4],[3,3],[0,4],[0,5],[4,4],[5,5],[4,6],[4,5],[0,4],[6,6],[6,6],[6,6],[2,2],[0,5],[1,4],[0,3],[2,4],[5,5],[6,6],[2,2],[2,3],[5,5],[0,6],[3,3],[6,6],[4,4],[0,0],[0,2],[6,6],[6,6],[3,6],[0,4],[6,6],[2,2],[4,6]]);
Console.WriteLine(string.Join(", ", ans));
}
}

View File

@@ -1,5 +0,0 @@
Given a positive integer n, there exists a 0-indexed array called powers, composed of the minimum number of powers of 2 that sum to n. The array is sorted in non-decreasing order, and there is only one way to form the array.
You are also given a 0-indexed 2D integer array queries, where queries[i] = [lefti, righti]. Each queries[i] represents a query where you have to find the product of all powers[j] with lefti <= j <= righti.
Return an array answers, equal in length to queries, where answers[i] is the answer to the ith query. Since the answer to the ith query may be too large, each answers[i] should be returned modulo 109 + 7.

View File

@@ -1,24 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.2.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "numberOfWays", "numberOfWays.csproj", "{1E81E272-AF2C-9CB4-F90B-0AAC263D10DC}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{1E81E272-AF2C-9CB4-F90B-0AAC263D10DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1E81E272-AF2C-9CB4-F90B-0AAC263D10DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1E81E272-AF2C-9CB4-F90B-0AAC263D10DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1E81E272-AF2C-9CB4-F90B-0AAC263D10DC}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {AD18FC84-E2FB-4382-96DF-8AE7E50C1401}
EndGlobalSection
EndGlobal

View File

@@ -1,48 +0,0 @@
// knapsack problem
public class Solution
{
public int NumberOfWays(int n, int x)
{
const int MOD = 1_000_000_007;
// list all the powers which smaller than n
var powers = new List<int>();
var num = 1;
while (true)
{
int pow = (int)Math.Pow(num, x);
if (pow > n)
break;
powers.Add(pow);
num++;
}
// dynamic programming
var dp = new int[n + 1];
dp[0] = 1;
foreach (var power in powers)
{
for (var i = n; i >= power; i--)
{
dp[i] = (dp[i] + dp[i - power]) % MOD;
}
}
return dp[n];
}
}
class Program
{
static void Main()
{
var solution = new Solution();
Console.WriteLine(solution.NumberOfWays(4, 1));
Console.WriteLine(solution.NumberOfWays(100, 3));
}
}

View File

@@ -1,38 +0,0 @@
public class Solution
{
public int AreaOfMaxDiagonal(int[][] dimensions)
{
int max = 0;
int maxArea = 0;
foreach (var dimension in dimensions)
{
var dimensionSqrt = dimension[0] * dimension[0] + dimension[1] * dimension[1];
var area = dimension[0] * dimension[1];
if (dimensionSqrt > max)
{
max = dimensionSqrt;
maxArea = area;
}
else if (dimensionSqrt == max)
{
maxArea = Math.Max(maxArea, area);
}
}
return maxArea;
}
}
public class Program
{
public static void Main()
{
var Solution = new Solution();
var dimensions = new int[][] { [6,5],[8,6],[2,10],[8,1],[9,2],[3,5],[3,5]};
var result = Solution.AreaOfMaxDiagonal(dimensions);
Console.WriteLine(result);
}
}

View File

@@ -1,10 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@@ -1,27 +0,0 @@
package main
import (
"fmt"
"math"
)
func areaOfMaxDiagonal(dimensions [][]int) int{
maxDiagonal := 0
maxArea := 0
for _, dimension := range dimensions{
l := dimension[0]
w := dimension[1]
diagonalSquare := l * l + w * w
area := l * w
if diagonalSquare > maxDiagonal{
maxDiagonal = diagonalSquare
maxArea = area
}else if diagonalSquare == maxDiagonal{
maxArea = int(math.Max(float64(maxArea), float64(area)))
}
}
return maxArea
}

View File

@@ -1,24 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.2.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MinimumArea", "MinimumArea.csproj", "{61A8B87F-638B-4246-13C4-CC226CFBBEA5}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{61A8B87F-638B-4246-13C4-CC226CFBBEA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{61A8B87F-638B-4246-13C4-CC226CFBBEA5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{61A8B87F-638B-4246-13C4-CC226CFBBEA5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{61A8B87F-638B-4246-13C4-CC226CFBBEA5}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {C6FDF6F7-60CD-4B35-B619-6F79B7243CA7}
EndGlobalSection
EndGlobal

View File

@@ -1,10 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@@ -1,28 +0,0 @@
public class Solution {
public int MinimumArea(int[][] grid)
{
var x = grid[0].Length;
var y = grid.Length;
int min_x = x;
int max_x = 0;
int min_y = y;
int max_y = 0;
for (var i = 0; i < x; i++)
{
for (var j = 0; j < y; j++)
{
if (grid[j][i])
{
min_x = Math.Min(min_x, i);
max_x = Math.Max(max_x, i);
min_y = Math.Min(min_y, j);
max_y = Math.Max(max_y, j);
}
}
}
return (max_x - min_x + 1) * (max_y - min_y + 1);
}
}

View File

@@ -1,40 +0,0 @@
package main
import "fmt"
func minimumArea(grid [][]int) int {
row := len(grid)
col := len(grid[0])
min_x := col
max_x := 0
min_y := row
max_y := 0
for i:=0; i<row; i++{
for j:=0; j<col; j++{
if grid[i][j] == 1{
min_x = Min(min_x, j)
max_x = Max(max_x, j)
min_y = Min(min_y, i)
max_y = Max(max_y, i)
}
}
}
return (max_x-min_x+1) * (max_y-min_y+1)
}
func Min(a, b int)int{
if a < b {
return a
}
return b
}
func Max(a, b int)int{
if a > b{
return a
}
return b
}

View File

@@ -1,21 +0,0 @@
public class Solution {
public bool IsPowerOfThree(int n) {
if(n <= 0)
return false;
if(n == 1)
return true;
if(n % 3 != 0)
return false;
return IsPowerOfThree(n/3);
}
}
class program{
static void Main(){
var Solution = new Solution();
Console.WriteLine(Solution.IsPowerOfThree(9));
Console.WriteLine(Solution.IsPowerOfThree(0));
Console.WriteLine(Solution.IsPowerOfThree(-1));
}
}

View File

@@ -1,10 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@@ -1,22 +0,0 @@
Given an integer n, return true if it is a power of three. Otherwise, return false.
An integer n is a power of three, if there exists an integer x such that n == 3x.
Example 1:
Input: n = 27
Output: true
Explanation: 27 = 33
Example 2:
Input: n = 0
Output: false
Explanation: There is no x where 3x = 0.
Example 3:
Input: n = -1
Output: false
Explanation: There is no x where 3x = (-1).

View File

@@ -1,26 +0,0 @@
package main
import "fmt"
type Solution struct{}
func (s Solution) IsPowerOfThree(n int) bool{
if n <= 0{
return false
}
if n == 1{
return true
}
if n % 3 != 0{
return false
}
return s.IsPowerOfThree(n/3)
}
func main(){
solution := Solution{}
fmt.Println(solution.IsPowerOfThree(27))
fmt.Println(solution.IsPowerOfThree(0))
fmt.Println(solution.IsPowerOfThree(-1))
}

View File

@@ -1,10 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@@ -1,24 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.2.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MaxCollectedFruits", "MaxCollectedFruits.csproj", "{AA67CF61-67B3-7229-E3F9-D471B0EF4EDE}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{AA67CF61-67B3-7229-E3F9-D471B0EF4EDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AA67CF61-67B3-7229-E3F9-D471B0EF4EDE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AA67CF61-67B3-7229-E3F9-D471B0EF4EDE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AA67CF61-67B3-7229-E3F9-D471B0EF4EDE}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {B9D47F51-61C3-4A24-890A-01C9AC85EC93}
EndGlobalSection
EndGlobal

View File

@@ -1,67 +0,0 @@
public class Solution
{
public int MaxCollectedFruits(int[][] fruits)
{
int n = fruits.Length;
int ans = 0;
for (int i = 0; i < n; ++i) ans += fruits[i][i];
int dp()
{
int[] prev = Enumerable.Repeat(int.MinValue, n).ToArray();
int[] curr = new int[n];
prev[n - 1] = fruits[0][n - 1];
for (int i = 1; i < n - 1; ++i)
{
Array.Fill(curr, int.MinValue);
for (int j = Math.Max(n - 1 - i, i + 1); j < n; ++j)
{
int best = prev[j];
if (j - 1 >= 0)
{
best = Math.Max(best, prev[j - 1]);
}
if (j + 1 < n)
{
best = Math.Max(best, prev[j + 1]);
}
curr[j] = best + fruits[i][j];
}
var temp = prev;
prev = curr;
curr = temp;
}
return prev[n - 1];
}
ans += dp();
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < i; ++j)
{
var temp = fruits[j][i];
fruits[j][i] = fruits[i][j];
fruits[i][j] = temp;
}
}
ans += dp();
return ans;
}
}
class Program
{
static void Main()
{
var Solution = new Solution();
var fruits = new int[][] { [1,2,3,4],[5,6,8,7],[9,10,11,12],[13,14,15,16]};
Console.WriteLine(Solution.MaxCollectedFruits(fruits));
}
}

View File

@@ -1,24 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.2.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SortMatrix", "SortMatrix.csproj", "{60318F94-4F41-A4B8-C189-A8135ECCECCB}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{60318F94-4F41-A4B8-C189-A8135ECCECCB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{60318F94-4F41-A4B8-C189-A8135ECCECCB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{60318F94-4F41-A4B8-C189-A8135ECCECCB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{60318F94-4F41-A4B8-C189-A8135ECCECCB}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {9F59D1F6-D9F3-492C-BC39-A5771AF22B36}
EndGlobalSection
EndGlobal

View File

@@ -1,115 +0,0 @@
public class Solution
{
public int[][] SortMatrix(int[][] grid)
{
// 左下
var leftDiagonals = new Dictionary<int, List<int>>();
for (var i = 0; i < grid.Length; i++)
{
// total -> 2n + 1 way
for (var j = 0; j <= i; j++)
{
int diagonal = i - j;
if (!leftDiagonals.ContainsKey(diagonal))
{
leftDiagonals[diagonal] = new List<int>();
}
leftDiagonals[diagonal].Add(grid[i][j]);
}
}
// 右上
var rightDiagonals = new Dictionary<int, List<int>>();
for (var i = 0; i < grid.Length; i++)
{
for (var j = i; j < grid.Length; j++)
{
int diagonal = j - i;
if (!rightDiagonals.ContainsKey(diagonal))
{
rightDiagonals[diagonal] = new List<int>();
}
rightDiagonals[diagonal].Add(grid[i][j]);
}
}
foreach (var diagonal in leftDiagonals.Values)
{
diagonal.Sort((a, b) => b.CompareTo(a));
}
foreach (var diagonal in rightDiagonals.Values)
{
diagonal.Sort((a, b) => a.CompareTo(b));
}
for (var i = 0; i < grid.Length; i++)
{
for (var j = 0; j <= i; j++)
{
int diagonal = i - j;
grid[i][j] = leftDiagonals[diagonal][0];
leftDiagonals[diagonal].RemoveAt(0);
}
for (var j = i; j < grid.Length; j++)
{
if (i == j) continue;
int diagonal = j - i;
grid[i][j] = rightDiagonals[diagonal][0];
rightDiagonals[diagonal].RemoveAt(0);
}
}
return grid;
}
}
public class Solution2 {
public int[][] SortMatrix(int[][] grid) {
int n = grid.Length;
for (int i = 0; i < n; i++) {
List<int> tmp = new List<int>();
for (int j = 0; i + j < n; j++) {
tmp.Add(grid[i + j][j]);
}
tmp.Sort((a, b) => b.CompareTo(a));
for (int j = 0; i + j < n; j++) {
grid[i + j][j] = tmp[j];
}
}
for (int j = 1; j < n; j++) {
List<int> tmp = new List<int>();
for (int i = 0; j + i < n; i++) {
tmp.Add(grid[i][j + i]);
}
tmp.Sort();
for (int i = 0; j + i < n; i++) {
grid[i][j + i] = tmp[i];
}
}
return grid;
}
}
class Program
{
static void Main()
{
var Solution = new Solution();
var gird = new int[][] { [1, 7, 3], [9, 8, 2], [4, 5, 6] };
var result = Solution.SortMatrix(gird);
for (int i = 0; i < result.Length; i++)
{
for (int j = 0; j < result[i].Length; j++)
{
Console.Write(result[i][j] + " ");
}
Console.WriteLine();
}
}
}

View File

@@ -1,10 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@@ -1,24 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.2.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FindDiagonalOrder", "FindDiagonalOrder.csproj", "{B3151728-C057-4305-DD4C-9A2AFBFC189A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B3151728-C057-4305-DD4C-9A2AFBFC189A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B3151728-C057-4305-DD4C-9A2AFBFC189A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B3151728-C057-4305-DD4C-9A2AFBFC189A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B3151728-C057-4305-DD4C-9A2AFBFC189A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {DB56539A-6F32-4D28-B91F-BB1DCF46F4D0}
EndGlobalSection
EndGlobal

View File

@@ -1,10 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@@ -1,61 +0,0 @@
public class Solution {
public int[] FindDiagonalOrder(int[][] mat)
{
if (mat == null || mat.Length == 0 || mat[0].Length == 0)
{
return new int[0];
}
var m = mat.Length;
var n = mat[0].Length;
var diagonals = new Dictionary<int, List<int>>();
for (var i = 0; i < m; i++)
{
for (var j = 0; j < n; j++)
{
int diagonalIndex = i + j;
if (!diagonals.ContainsKey(diagonalIndex))
{
diagonals[diagonalIndex] = new List<int>();
}
diagonals[diagonalIndex].Add(mat[i][j]);
}
}
var result = new List<int>();
foreach (var key in diagonals.Keys)
{
var diagonal = diagonals[key];
if (key % 2 == 0)
{
result.AddRange(diagonal);
}
else
{
diagonal.Reverse();
result.AddRange(diagonal);
}
}
return result.ToArray();
}
}
class Program
{
static void Main()
{
var Solution = new Solution();
int[][] mat1 = new int[][]{
new int[]{1,2,3},
new int[]{4,5,6},
new int[]{7,8,9}
};
Console.WriteLine(string.Join(", ", Solution.FindDiagonalOrder(mat1)));
}
}

View File

@@ -1,45 +0,0 @@
package main
import "fmt"
func findDiagonalOrder(mat [][]int) []int {
if len(mat) == 0 || len(mat[0]) == 0{
return []int{}
}
m := len(mat)
n := len(mat[0])
// maps
diagonals := make(map[int][]int)
for i:=0; i< m;i++{
for j:=0; j < n; j++{
index := i+j
diagonals[index] = append(diagonals[index], mat[i][j])
}
}
result := []int{}
for i:= 0; i< m+n-1; i++{
if i% 2 == 0{
reverse(diagonals[i])
result = append(result, diagonals[i]...)
}else{
result = append(result, diagonals[i]...)
}
}
return result
}
func reverse(slice []int){
left, right :=0, len(slice)-1
for left < right{
slice[left], slice[right] = slice[right], slice[left]
left++
right--
}
}

View File

@@ -1,7 +0,0 @@
1. 觀察矩陣對角線模式
1. (0,0) -> 1 -> i+j = 0
2. (1, 0), (0, 1) -> 2 -> i+j = 1
3. (2, 0), (1, 1), (0, 2) -> 3 -> i+j = 2
2. how to deal with diagonal sorting?
1. while (i+j) % 2 == 1
2. while (i+j) % 2 == 0 reversed

View File

@@ -1,24 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.2.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "soupServings", "soupServings.csproj", "{6D960F00-6A53-6E19-86A1-4BF3D1CD764F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{6D960F00-6A53-6E19-86A1-4BF3D1CD764F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6D960F00-6A53-6E19-86A1-4BF3D1CD764F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6D960F00-6A53-6E19-86A1-4BF3D1CD764F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6D960F00-6A53-6E19-86A1-4BF3D1CD764F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {11CC27B7-C17E-4820-8A68-ADD32A2B37F8}
EndGlobalSection
EndGlobal

View File

@@ -1,56 +0,0 @@
using System;
public class Solution
{
private Dictionary<(int, int), double> dp = new Dictionary<(int, int), double>();
public double SoupServings(int n)
{
if (n > 5000)
return 1.0;
n = (n + 24) / 25;
// use dynamic programming
return Helper(n, n);
}
private double Helper(int a, int b)
{
if (a <= 0 && b <= 0)
{
return 0.5;
}
if (a <= 0)
{
return 1.0;
}
if (b <= 0)
{
return 0.0;
}
if (dp.ContainsKey((a, b)))
{
return dp[(a, b)];
}
double probability = 0.25 * (
Helper(a - 4, b) +
Helper(a - 3, b - 1) +
Helper(a - 2, b - 2) +
Helper(a - 1, b - 3)
);
dp[(a, b)] = probability;
return probability;
}
}
class Program
{
static void Main()
{
var Solution = new Solution();
var ans = Solution.SoupServings(800);
Console.WriteLine(ans);
}
}

View File

@@ -1,10 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@@ -1,52 +0,0 @@
package main
import ("fmt")
type Solution struct{
dp map[[2]int]float64
}
func NewSolution() *Solution{
return &Solution{dp: make(map[[2]int]float64)}
}
func (s *Solution) SoupServings(n int)float64{
if n > 5000{
return 1.0
}
n = (n+24) /25
return s.helper(n, n)
}
func (s * Solution) helper(a, b int) float64 {
if a <= 0 && b <= 0{
return 0.5
}
if a <= 0{
return 1.0
}
if b <= 0{
return 0
}
if val, exist := s.dp[[2]int{a, b}]; exist{
return val
}
probability := 0.25 * (
s.helper(a-4, b) +
s.helper(a-3, b-1) +
s.helper(a-2, b-2) +
s.helper(a-1, b-3))
s.dp[[2]int {a, b}] = probability
return probability
}
func main(){
Solution := NewSolution()
ans := Solution.SoupServings(100)
fmt.Println(ans)
}

View File

@@ -1,14 +0,0 @@
You have two soups, A and B, each starting with n mL. On every turn, one of the following four serving operations is chosen at random, each with probability 0.25 independent of all previous turns:
pour 100 mL from type A and 0 mL from type B
pour 75 mL from type A and 25 mL from type B
pour 50 mL from type A and 50 mL from type B
pour 25 mL from type A and 75 mL from type B
Note:
There is no operation that pours 0 mL from A and 100 mL from B.
The amounts from A and B are poured simultaneously during the turn.
If an operation asks you to pour more than you have left of a soup, pour all that remains of that soup.
The process stops immediately after any turn in which one of the soups is used up.
Return the probability that A is used up before B, plus half the probability that both soups are used up in the same turn. Answers within 10-5 of the actual answer will be accepted.

View File

@@ -17,6 +17,7 @@
|------|------|------|------|------|------|------|
| 09/08 | Convert Integer To The Sum Of Two No Zero Integers | Easy | C# | 0.2hr | Done | |
| 09/11 | Sort Vowels In A String | Medium | C# | 0.2hr | Done | |
| 09/11 | [3227]Vowels Game In A String | Medium | C#, go | 0.1hr | Done | like easy |
### Week 3
| 日期 | 題目 | 難度 | 語言 | 耗時 | 狀態 | 心得 |
@@ -26,18 +27,19 @@
### Week 4
| 日期 | 題目 | 難度 | 語言 | 耗時 | 狀態 | 心得 |
|------|------|------|------|------|------|------|
| | | | | | | |
| 09/22 | [3005]Count Elements With Maximum Frequency | Easy | C# | 0.3hr | Done | Dictionary Mapping |
| 09/23| [0165]Compare Version Numbers | Medium | C# | 0.4hr | Done | String, Two Pointers |
## 📈 本月統計
### 完成情況
- **總練習天數**: 7
- **完成題數**: 7
- **語言分布**: C# 7(題), Go 2(題)
- **難度分布**: Easy 2(題), Medium 4(題), Hard 1(題)
- **總練習天數**: 9
- **完成題數**: 9
- **語言分布**: C# 9(題), Go 2(題)
- **難度分布**: Easy 3(題), Medium 5(題), Hard 1(題)
### 時間投入
- **總時間**: 3.9小時
- **總時間**: 4.5小時
- **平均每題**: 分鐘
- **每日平均**: 分鐘

22
makefile Normal file
View File

@@ -0,0 +1,22 @@
# Makefile - 安裝環境工具
.PHONY: all update upgrade install setup check
all: setup
update:
sudo apt update
upgrade:
sudo apt upgrade -y
install:
sudo apt install -y dotnet-sdk-8.0 golang-go
setup: update upgrade install check
@echo "✅ 開發環境安裝完成!"
check:
@echo "=== 檢查安裝結果 ==="
@dotnet --version || echo "⚠️ dotnet 未安裝成功"
@go version || echo "⚠️ go 未安裝成功"

View File

@@ -0,0 +1,85 @@
# [165] Compare Version Numbers
## 題目資訊
- **難度**: Medium
- **標籤**: Two Pointer, String
- **題目連結**: https://leetcode.com/problems/compare-version-numbers/
- **練習日期**: 2025-09-23
- **目標複雜度**: 時間 O(n)、空間 O(1)
## 題目描述
Given two **version strings**, `version1` and `version2`, compare them. A version string consists of **revisions** separated by dots `'.'`. The **value of the revision** is its **integer conversion** ignoring leading zeros.
To compare version strings, compare their revision values in **left-to-right order**. If one of the version strings has fewer revisions, treat the missing revision values as `0`.
Return the following:
If `version1 < version2`, return -1.
If `version1 > version2`, return 1.
Otherwise, return 0.
## 先備條件與限制
- 1 <= `version1.length, version2.length` <= 500
- version1 and version2 only contain digits and '.'
- version1 and version2 are valid version numbers.
- All the given revisions in `version1` and `version2` can be stored in a **32-bit integer**
## 解題思路
### 初步分析
- 類型:字串雙指標掃描
- 關鍵觀察:版本號可以逐段比較,缺段視為 0且修訂號只包含數字
- 複雜度目標理由:只需線性掃過兩個字串一次即可完成比較
### 解法比較
1. 解法A基準/暴力):
- 名稱:`MyCompareVersion`
- 思路:以 `Split('.')` 將版本字串拆成陣列,逐段轉成整數後比較;若另一側段數不足以 0 補齊
- 正確性LeetCode 限制每段可裝進 32-bit 整數,直接使用 `int.TryParse` 安全可靠
- 複雜度:時間 O(n),空間 O(k)k 為段數,需配置字串陣列與子字串)
2. 解法B優化
- 名稱:`CompareVersion`
- 思路:雙指標同步掃描兩個版本字串,藉由 `ReadOnlySpan<char>` 抓取下一段,去除前導 0 後用字元比較避免溢位與額外配置
- 正確性:段長先比較、再逐字比較,完全符合題意;缺段會回傳空 span 視為 0
- 複雜度:時間 O(n),空間 O(1)
## 實作細節
### 常見陷阱
- 前導 0需在比較前移除否則 `"01"``"1"` 會被視為不同
- 段數不一致:右側缺少的段要視為 0
- 空字串或末尾點:`""``"1."` 都可能出現,需要妥善處理
- 非數字字元:防守性處理(當前實作視為 0但依題意實際資料不會出現
## 測試案例
### 範例輸入輸出
```
Input: version1 = "1.2", version2 = "1.10"
Output: -1
Explanation:
version1's second revision is "2" and version2's second revision is "10": 2 < 10, so version1 < version2.
```
### 邊界清單
- [x] 空字串 / 僅有 0
- [x] 單一段 / 全相同
- [x] 含 0 / 大數 / 前導 0
- [ ] 去重(與此題無關)
- [x] 大資料壓力(長度 200 的版本字串)
## 複雜度分析
- 最壞:時間 O(n)、空間 O(1)
- 備註:保留的 `MyCompareVersion` 雖然同為 O(n),但空間為 O(k)
## 相關題目 / Follow-up
- 179. Largest Number同樣涉及字串排序與比較
- 415. Add Strings字串逐位操作
## 學習筆記
- 今天學到:兩指標搭配 `ReadOnlySpan<char>` 可以在 C# 中避免額外配置
- 卡住與修正:原本 console app 移除 `Main` 造成 `dotnet test` 無法編譯,後來補回精簡入口
- 待優化:若要支援超長版本段,可考慮使用 `BigInteger` 或自訂比較邏輯(目前已以字元比較處理)
---
**總結**:核心在於逐段處理並正確處理前導 0 與缺段情況,適合練習字串雙指標與記憶體優化技巧。

View File

@@ -0,0 +1,144 @@
// LeetCode 165: Compare Version Numbers
// 難度: Medium
// 日期: 2025-09-23
using System;
public class Solution
{
// Two-pointer parser that compares segments without allocating intermediate arrays.
public int CompareVersion(string version1, string version2)
{
var i = 0;
var j = 0;
while (i < version1.Length || j < version2.Length)
{
var segment1 = NextSegment(version1, ref i);
var segment2 = NextSegment(version2, ref j);
var comparison = CompareSegments(segment1, segment2);
if (comparison != 0)
{
return comparison;
}
}
return 0;
}
// Reads the next numeric segment (between dots) as a span and advances the current index.
private static ReadOnlySpan<char> NextSegment(string version, ref int index)
{
if (index >= version.Length)
{
return ReadOnlySpan<char>.Empty;
}
var start = index;
while (index < version.Length && version[index] != '.')
{
index++;
}
var segment = version.AsSpan(start, index - start);
if (index < version.Length && version[index] == '.')
{
index++;
}
return segment;
}
// Compares two trimmed segments lexicographically to avoid integer overflow.
private static int CompareSegments(ReadOnlySpan<char> left, ReadOnlySpan<char> right)
{
left = TrimLeadingZeros(left);
right = TrimLeadingZeros(right);
if (left.Length > right.Length)
{
return 1;
}
if (left.Length < right.Length)
{
return -1;
}
for (var i = 0; i < left.Length; i++)
{
if (left[i] > right[i])
{
return 1;
}
if (left[i] < right[i])
{
return -1;
}
}
return 0;
}
private static ReadOnlySpan<char> TrimLeadingZeros(ReadOnlySpan<char> segment)
{
var index = 0;
while (index < segment.Length && segment[index] == '0')
{
index++;
}
return index == segment.Length ? ReadOnlySpan<char>.Empty : segment[index..];
}
public int MyCompareVersion(string version1, string version2)
{
var v1 = version1.Split('.');
var v2 = version2.Split('.');
if (v1.Length >= v2.Length)
{
return CompareString(v1, v2);
}
return CompareString(v2, v1) * -1;
}
private static int CompareString(string[] longer, string[] shorter)
{
for (var i = 0; i < longer.Length; i++)
{
_ = int.TryParse(longer[i], out var num1);
var num2 = i < shorter.Length && int.TryParse(shorter[i], out var parsed) ? parsed : 0;
if (num1 > num2)
{
return 1;
}
if (num1 < num2)
{
return -1;
}
}
return 0;
}
}
public class Program
{
public static void Main(string[] args)
{
// optional: keep console app functional for manual verification
if (args.Length == 2)
{
var solution = new Solution();
var result = solution.CompareVersion(args[0], args[1]);
Console.WriteLine(result);
}
}
}

View File

@@ -1,10 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

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 的版本字串,在最後一段差異才分勝負

View File

@@ -0,0 +1,30 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.2.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "csharp", "csharp\csharp.csproj", "{CF022C7B-CAF3-706D-67E1-FB93518229B7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestProject", "test\TestProject.csproj", "{C670389A-9CE7-B456-51E5-A79D56E199CF}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{CF022C7B-CAF3-706D-67E1-FB93518229B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CF022C7B-CAF3-706D-67E1-FB93518229B7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CF022C7B-CAF3-706D-67E1-FB93518229B7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CF022C7B-CAF3-706D-67E1-FB93518229B7}.Release|Any CPU.Build.0 = Release|Any CPU
{C670389A-9CE7-B456-51E5-A79D56E199CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C670389A-9CE7-B456-51E5-A79D56E199CF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C670389A-9CE7-B456-51E5-A79D56E199CF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C670389A-9CE7-B456-51E5-A79D56E199CF}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {C5790EDA-C36F-4FC3-877D-C7E20837E160}
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,80 @@
# [166] Fraction To Recurring Decimal
## 題目資訊
- **難度**: Medium
- **標籤**: Hash Table, Math, Simulation
- **題目連結**: https://leetcode.com/problems/fraction-to-recurring-decimal/
- **練習日期**: 2025-09-24
- **目標複雜度**: 時間 O(L)、空間 O(L)L 為輸出字串長度,最多 10^4
## 題目描述
Given two integers representing the `numerator` and `denominator` of a fraction, return *the fraction* in string format.
If the fractional part is repeating, enclose the repeating part in parentheses.
If multiple answers are possible, return **any of them**.
It is **guaranteed** that the length of the answer string is less than `10^4` for all the given inputs.
## 先備條件與限制
- 輸入限制:`-2^31 <= numerator, denominator <= 2^31 - 1`,且 denominator ≠ 0
- 回傳/輸出格式:回傳十進位字串;有限小數直接輸出,小數有循環時用括號標記循環段
- 其他:允許使用 64-bit 以避免在取絕對值時溢位
## 解題思路
### 初步分析
- 類型:數學 / 模擬 / 哈希
- 關鍵觀察:整數除法僅靠餘數決定下一個小數位;相同餘數必定導致循環,位置可透過哈希表還原
- 複雜度目標理由:每個餘數最多處理一次,因此時間與空間成正比於輸出長度 L
### 解法比較
1. 解法A餘數位置哈希
- 思路:先處理正負號並計算整數部分;對小數部分反覆以 10 乘上餘數取商,並在 map 中紀錄餘數首次出現的索引,一旦重複即可插入括號
- 正確性:每個可能的餘數介於 0 與 |denominator|-1重複時即代表循環節開始未重複則最後餘數為 0有限小數
- 複雜度:時間 O(L) / 空間 O(L)
## 實作細節
- 先處理 `numerator == 0` 直接回傳 "0"
- 判斷結果正負號,使用 `long`/`long long` 取絕對值避免 `INT_MIN` 無法轉正的問題
- `integer_part = abs_num / abs_den` 直接加入結果,小數部分以餘數 `remainder = abs_num % abs_den` 開始
- 使用字典 `remainder -> index` 紀錄餘數在結果字串中的位置;迴圈內:餘數乘 10取下一位商並更新餘數
- 若餘數為 0表示小數結束不需括號若餘數再度出現在對應索引插入 `(`,在結尾加 `)`
## 常見陷阱
- 處理負數:符號只出現一次,判斷後用 64-bit 絕對值繼續運算避免 `--6...` 之類錯誤
- `INT_MIN / -1` 可能溢位:需先轉成 64-bit 再做除法與取餘數
- 餘數 map 要記錄的是「餘數出現時的輸出索引」,找到重複時要在該位置插入 `(`
- 每回合先檢查餘數是否重複再乘 10避免多插一位或落掉循環起點
- `numerator` 為 0 時無小數部分,直接回傳 "0"
## 測試案例
### 範例輸入輸出
```
Input: numerator = 4, denominator = 333
Output: "0.(012)"
```
### 邊界清單
- `numerator = 1, denominator = 2``"0.5"`(有限小數)
- `numerator = 1, denominator = 6``"0.1(6)"`(循環節不從第一位開始)
- `numerator = -50, denominator = 8``"-6.25"`(負數與有限小數)
- `numerator = 0, denominator = 5``"0"`(整數結果)
- `numerator = 1, denominator = 7``"0.(142857)"`(較長的循環節)
## 複雜度分析
- 最壞:時間 O(L)、空間 O(L)
- L 為輸出字串長度,等同於需要處理的餘數數量上限(題目保證 < 10^4
## 相關題目 / Follow-up
- 與任一進位制的循環小數檢測 base conversion類似可類比餘數循環檢測技巧
## 學習筆記
- 今天學到餘數 索引的哈希表能精準標記循環段搭配 `StringBuilder.Insert` 可快速加括號
- 卡住與修正`int.MinValue` 轉正時會拋例外改用 `long` 做完整流程含乘 10 與取餘就穩定
- 另外注意符號在輸出開頭先處理整數和小數部分都用正數運算可避免重複符號
- 待優化可以先行預估非循環長度以減少插入成本但對此題影響不大
---
**總結**這題的核心在於以餘數哈希判斷循環節適合練習小數表示與溢位處理

View File

@@ -0,0 +1,68 @@
// LeetCode 166: Fraction To Recurring Decimal
// 難度: Medium
// 日期: 2025-09-24
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public class Solution
{
public string FractionToDecimal(int numerator, int denominator)
{
if (numerator == 0) return "0";
long num = numerator;
long den = denominator;
StringBuilder result = new StringBuilder();
bool isNegative = (num < 0) ^ (den < 0);
if (isNegative) result.Append('-');
num = Math.Abs(num);
den = Math.Abs(den);
long integerPart = num / den;
result.Append(integerPart);
long remainder = num % den;
if (remainder == 0) return result.ToString();
result.Append('.');
result.Append(CalculateDecimalPart(remainder, den));
return result.ToString();
}
private string CalculateDecimalPart(long remainder, long denominator)
{
StringBuilder decimalBuilder = new StringBuilder();
Dictionary<long, int> remainderMap = new Dictionary<long, int>();
while (remainder != 0)
{
if (remainderMap.TryGetValue(remainder, out int repeatIndex))
{
decimalBuilder.Insert(repeatIndex, '(');
decimalBuilder.Append(')');
break;
}
remainderMap[remainder] = decimalBuilder.Length;
remainder *= 10;
long digit = remainder / denominator;
decimalBuilder.Append(digit);
remainder %= denominator;
}
return decimalBuilder.ToString();
}
}
public class Program {
public static void Main() {
var s = new Solution();
}
}

View File

@@ -1,10 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@@ -0,0 +1,3 @@
module leetcode-166
go 1.18

View File

@@ -0,0 +1,18 @@
// LeetCode 166: Fraction To Recurring Decimal
// 難度: Medium
// 日期: 2025-09-24
package main
import "fmt"
// TODO: 根據題意調整簽名
func solve(nums []int) int {
return 0
}
func main() {
fmt.Printf("Hello LeetCode 166!\n")
// TODO: 可加入簡單測試
}

View File

@@ -0,0 +1,27 @@
// LeetCode 166 單元測試xUnit
using Xunit;
public class SolutionTests {
private readonly Solution _s = new Solution();
[Theory]
[InlineData(4, 333, "0.(012)")]
[InlineData(1, 2, "0.5")]
[InlineData(1, 6, "0.1(6)")]
[InlineData(-50, 8, "-6.25")]
[InlineData(0, 5, "0")]
[InlineData(1, 7, "0.(142857)")]
public void FractionToDecimal_BasicAndRepeatingScenarios(int numerator, int denominator, string expected) {
var actual = _s.FractionToDecimal(numerator, denominator);
Assert.Equal(expected, actual);
}
[Fact]
public void FractionToDecimal_DenominatorOne_ReturnsIntegerString() {
var actual = _s.FractionToDecimal(2, 1);
Assert.Equal("2", actual);
}
}

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,20 @@
# 邊界情況清單166 Fraction To Recurring Decimal
## 需要測試的邊界
- [ ] 空輸入 / 單一元素
- [ ] 重複元素 / 全相同
- [ ] 極值(最小/最大)
- [ ] 含負數 / 0 / 大數
- [ ] 大資料量(接近上限)
## 額外案例
### 案例 1
- 輸入:
- 預期:
- 說明:
### 案例 2
- 輸入:
- 預期:
- 說明:

View File

@@ -0,0 +1,12 @@
// LeetCode 166 單元測試Go testing
package main
import "testing"
func TestExample(t *testing.T) {
// TODO: input := []int{}
// got := solve(input)
// want := 0
// if got != want { t.Fatalf("want %v got %v", want, got) }
}

View File

@@ -0,0 +1,30 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.2.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "csharp", "csharp\csharp.csproj", "{CF022C7B-CAF3-706D-67E1-FB93518229B7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestProject", "test\TestProject.csproj", "{C670389A-9CE7-B456-51E5-A79D56E199CF}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{CF022C7B-CAF3-706D-67E1-FB93518229B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CF022C7B-CAF3-706D-67E1-FB93518229B7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CF022C7B-CAF3-706D-67E1-FB93518229B7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CF022C7B-CAF3-706D-67E1-FB93518229B7}.Release|Any CPU.Build.0 = Release|Any CPU
{C670389A-9CE7-B456-51E5-A79D56E199CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C670389A-9CE7-B456-51E5-A79D56E199CF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C670389A-9CE7-B456-51E5-A79D56E199CF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C670389A-9CE7-B456-51E5-A79D56E199CF}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {50409315-93FE-4BEF-BAEC-4B70A05B634A}
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,91 @@
# [3005] Count_elements_with_maximum_frequency
## 題目資訊
- **難度**: Easy
- **標籤**:
- **題目連結**: https://leetcode.com/problems/count_elements_with_maximum_frequency/
- **練習日期**: 2025-09-22
- **目標複雜度**: 時間 O(?)、空間 O(?)
## 題目描述
> 在這裡貼上題目的完整描述(或重點)
## 先備條件與限制
- 輸入限制n ∈ [?, ?]、值域 ∈ [?, ?]
- 回傳/輸出格式:...
- 其他:是否允許排序/就地修改
## 解題思路
### 初步分析
- 類型:雙指針 / 滑動視窗 / 排序 / DP / 貪心 / 圖論 ...
- 關鍵觀察:
- 複雜度目標理由:
### 解法比較
1. 解法A基準/暴力):
- 思路:
- 正確性:
- 複雜度O(?) / O(?)
2. 解法B優化
- 思路:
- 正確性:
- 複雜度O(?) / O(?)
### 乾跑Dry Run
- 範例:...
## 實作細節與 API 設計
### C# 方法簽名(示意)
```csharp
public class Solution {
// TODO: 根據題意調整簽名
public int Solve(int[] nums) {
return 0;
}
}
```
### Go 方法簽名(示意)
```go
func solve(nums []int) int {
return 0
}
```
### 常見陷阱
- 邊界:空/單一/極值/全相等
- 去重:排序後跳重複、集合
- 溢位:使用 64-bit
## 測試案例
### 範例輸入輸出
```
Input: ...
Output: ...
Explanation: ...
```
### 邊界清單
- [ ] 空陣列/空字串
- [ ] 單一元素 / 全相同
- [ ] 含負數/0/大數
- [ ] 去重
- [ ] 大資料壓力
## 複雜度分析
- 最壞:時間 O(?)、空間 O(?)
## 相關題目 / Follow-up
-
## 學習筆記
- 今天學到:
- 卡住與修正:
- 待優化:
---
**總結**:這題的核心在於 ______,適合練習 ______

View File

@@ -0,0 +1,52 @@
// LeetCode 3005: Count_elements_with_maximum_frequency
// 難度: Easy
// 日期: 2025-09-22
using System;
using System.Collections.Generic;
using System.Linq;
public class Solution {
public int MaxFrequencyElements(int[] nums)
{
Dictionary<int, int> frequencyMap = new Dictionary<int, int>();
// put nums into dictionary map
foreach (var num in nums)
{
if (!frequencyMap.ContainsKey(num))
{
frequencyMap.Add(num, 0);
}
frequencyMap[num]++;
}
// find most frequency nums
int maxFrequency = 0;
if (frequencyMap.Count != 0)
{
maxFrequency = frequencyMap.Values.Max();
}
// count if have same max frequency nus
int count = 0;
foreach (var dic in frequencyMap)
{
if (dic.Value == maxFrequency)
{
count += maxFrequency;
}
}
return count;
}
}
public class Program {
public static void Main() {
var s = new Solution();
// TODO: 可加入簡單輸入/輸出測試
Console.WriteLine("Hello LeetCode 3005!");
}
}

View File

@@ -1,10 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@@ -0,0 +1,18 @@
// LeetCode 3005: Count_elements_with_maximum_frequency
// 難度: Easy
// 日期: 2025-09-22
package main
import "fmt"
// TODO: 根據題意調整簽名
func solve(nums []int) int {
return 0
}
func main() {
fmt.Printf("Hello LeetCode 3005!\n")
// TODO: 可加入簡單測試
}

View File

@@ -0,0 +1,24 @@
// LeetCode 3005 單元測試xUnit
using Xunit;
public class SolutionTests {
private readonly Solution _s = new Solution();
[Fact]
public void Example1() {
// TODO: Arrange
// var input = new int[] { };
// var expected = 0;
// Act
// var got = _s.Solve(input);
// Assert.Equal(expected, got);
Assert.True(true);
}
[Fact]
public void EdgeCases() {
Assert.True(true);
}
}

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,12 @@
// LeetCode 3005 單元測試Go testing
package main
import "testing"
func TestExample(t *testing.T) {
// TODO: input := []int{}
// got := solve(input)
// want := 0
// if got != want { t.Fatalf("want %v got %v", want, got) }
}

View File

@@ -21,56 +21,56 @@ Return `true` if Alice wins the game, and `false` otherwise.
The English vowels are: `a`, `e`, `i`, `o`, and `u`.
## 先備條件與限制
- 輸入限制n ∈ [?, ?]、值域 ∈ [?, ?]
- 回傳/輸出格式:...
- 其他:是否允許排序/就地修改
- 輸入限制n ∈ [1, 10^5]、字符為小寫英文字母
- 回傳/輸出格式:boolean 值true 表示 Alice 獲勝
## 解題思路
### 初步分析
- 類型:雙指針 / 滑動視窗 / 排序 / DP / 貪心 / 圖論 ...
- 類型:博弈論 / 數學 / 腦筋急轉彎
- 關鍵觀察:
- 複雜度目標理由:
- Alice 先手,需移除含奇數個母音的子字串
- Bob 後手,需移除含偶數個母音的子字串
- 複雜度目標理由:只需檢查是否存在母音
### 解法比較
1. 解法A基準/暴力):
- 思路:
發現 Alice 獲勝條件極其簡單
- 正確性:
- 複雜度O(?) / O(?)
2. 解法B優化
- 思路:
- 正確性:
- 複雜度O(?) / O(?)
### 乾跑Dry Run
- 範例:...
只需檢查是否存在母音
- 複雜度O(n) / O(1)
### 常見陷阱
- 邊界:空/單一/極值/全相等
- 去重:排序後跳重複、集合
- 溢位:使用 64-bit
- 邊界:空字串(題目保證 n≥1、全母音、無母音
- 過度複雜化:誤以為需要複雜的博弈分析
- 計數錯誤:誤以為需要精確計算母音數量
- 大小寫:題目保證小寫字母
## 測試案例
### 範例輸入輸出
```
Input: ...
Output: ...
Explanation: ...
Input: s = "leetcode"
Output: true
Explanation: Alice 可以移除 "leetcod"含3個母音剩下 "e"Bob 無法移除含偶數母音的子字串
```
### 邊界清單
- [ ] 空陣列/空字串
- [ ] 單一元素 / 全相同
- [ ] 含負數/0/大數
- [ ] 去重
- [ ] 大資料壓力
- 全母音字串Alice 立即移除整個字串獲勝
- 無母音字串Alice 無法行動敗北
- 單一字符(母音/子音)
- 混合字串(含有母音和子音)
- 長字串壓力測試
## 複雜度分析
- 最壞:時間 O(?)、空間 O(?)
- 最壞:時間 O(n)、空間 O(1)
- 最佳:時間 O(1)(首字符即為母音)、空間 O(1)
## 相關題目 / Follow-up
-
- LeetCode 345: Reverse Vowels of a String
- LeetCode 1456: Maximum Number of Vowels in a Substring of Given Length
- LeetCode 2062: Count Vowel Substrings of a String
## 學習筆記
- 今天學到: