Compare commits
10 Commits
1e562065e8
...
main
Author | SHA1 | Date | |
---|---|---|---|
8146e2176d | |||
5189c524ef | |||
959f8a6861 | |||
5f8bf18795 | |||
72aa011de9 | |||
c4e23d5be3 | |||
c7453b45e6 | |||
7c86a4a99a | |||
c396a84294 | |||
2d6209a043 |
@@ -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
|
@@ -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"));
|
||||
}
|
||||
}
|
@@ -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"))
|
||||
}
|
@@ -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
|
@@ -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));
|
||||
}
|
||||
}
|
@@ -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.
|
@@ -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
|
@@ -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));
|
||||
|
||||
}
|
||||
}
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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>
|
@@ -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
|
||||
}
|
@@ -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
|
@@ -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>
|
@@ -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);
|
||||
}
|
||||
}
|
@@ -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
|
||||
}
|
@@ -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));
|
||||
}
|
||||
}
|
@@ -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>
|
@@ -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).
|
||||
|
@@ -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))
|
||||
}
|
@@ -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>
|
@@ -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
|
@@ -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));
|
||||
}
|
||||
}
|
@@ -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
|
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
@@ -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>
|
@@ -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
|
@@ -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>
|
@@ -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)));
|
||||
|
||||
}
|
||||
}
|
@@ -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--
|
||||
}
|
||||
}
|
@@ -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
|
@@ -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
|
@@ -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);
|
||||
}
|
||||
}
|
@@ -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>
|
@@ -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)
|
||||
}
|
@@ -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.
|
@@ -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
22
makefile
Normal 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 未安裝成功"
|
85
problems/0165-compare-version-numbers/README.md
Normal file
85
problems/0165-compare-version-numbers/README.md
Normal 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 與缺段情況,適合練習字串雙指標與記憶體優化技巧。
|
144
problems/0165-compare-version-numbers/csharp/Program.cs
Normal file
144
problems/0165-compare-version-numbers/csharp/Program.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
5
legacy/2438 ProductQueries/C#/ProductQueries.csproj → problems/0165-compare-version-numbers/csharp/csharp.csproj
Executable file → Normal file
5
legacy/2438 ProductQueries/C#/ProductQueries.csproj → problems/0165-compare-version-numbers/csharp/csharp.csproj
Executable file → Normal 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>
|
||||
|
56
problems/0165-compare-version-numbers/test/SolutionTests.cs
Normal file
56
problems/0165-compare-version-numbers/test/SolutionTests.cs
Normal 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);
|
||||
}
|
||||
}
|
@@ -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>
|
||||
|
29
problems/0165-compare-version-numbers/test/edge_cases.md
Normal file
29
problems/0165-compare-version-numbers/test/edge_cases.md
Normal 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 的版本字串,在最後一段差異才分勝負
|
@@ -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
|
80
problems/0166-fraction-to-recurring-decimal/README.md
Normal file
80
problems/0166-fraction-to-recurring-decimal/README.md
Normal 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 與取餘)就穩定
|
||||
- 另外注意:符號在輸出開頭先處理,整數和小數部分都用正數運算可避免重複符號
|
||||
- 待優化:可以先行預估非循環長度以減少插入成本,但對此題影響不大
|
||||
|
||||
---
|
||||
**總結**:這題的核心在於以餘數哈希判斷循環節,適合練習小數表示與溢位處理。
|
@@ -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();
|
||||
|
||||
}
|
||||
}
|
5
legacy/2787 numberOfWays/C#/numberOfWays.csproj → problems/0166-fraction-to-recurring-decimal/csharp/csharp.csproj
Executable file → Normal file
5
legacy/2787 numberOfWays/C#/numberOfWays.csproj → problems/0166-fraction-to-recurring-decimal/csharp/csharp.csproj
Executable file → Normal 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>
|
||||
|
3
problems/0166-fraction-to-recurring-decimal/go/go.mod
Normal file
3
problems/0166-fraction-to-recurring-decimal/go/go.mod
Normal file
@@ -0,0 +1,3 @@
|
||||
module leetcode-166
|
||||
|
||||
go 1.18
|
18
problems/0166-fraction-to-recurring-decimal/go/main.go
Normal file
18
problems/0166-fraction-to-recurring-decimal/go/main.go
Normal 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: 可加入簡單測試
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
@@ -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>
|
||||
|
@@ -0,0 +1,20 @@
|
||||
# 邊界情況清單(166 Fraction To Recurring Decimal)
|
||||
|
||||
## 需要測試的邊界
|
||||
- [ ] 空輸入 / 單一元素
|
||||
- [ ] 重複元素 / 全相同
|
||||
- [ ] 極值(最小/最大)
|
||||
- [ ] 含負數 / 0 / 大數
|
||||
- [ ] 大資料量(接近上限)
|
||||
|
||||
## 額外案例
|
||||
### 案例 1
|
||||
- 輸入:
|
||||
- 預期:
|
||||
- 說明:
|
||||
|
||||
### 案例 2
|
||||
- 輸入:
|
||||
- 預期:
|
||||
- 說明:
|
||||
|
@@ -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) }
|
||||
}
|
||||
|
@@ -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
|
@@ -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
|
||||
-
|
||||
|
||||
## 學習筆記
|
||||
- 今天學到:
|
||||
- 卡住與修正:
|
||||
- 待優化:
|
||||
|
||||
---
|
||||
**總結**:這題的核心在於 ______,適合練習 ______。
|
||||
|
@@ -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!");
|
||||
}
|
||||
}
|
||||
|
@@ -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>
|
||||
|
@@ -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: 可加入簡單測試
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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>
|
||||
|
@@ -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) }
|
||||
}
|
||||
|
@@ -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
|
||||
|
||||
## 學習筆記
|
||||
- 今天學到:
|
||||
|
Reference in New Issue
Block a user