课程内容提交

This commit is contained in:
LSGOMYP
2020-07-31 17:39:54 +08:00
parent 08f25ef85d
commit 67216f9224
74 changed files with 8975 additions and 1 deletions

View File

@@ -0,0 +1,283 @@
# Task01<30><31><EFBFBD><EFBFBD><EFBFBD>飨1<E9A3A8>
## 1. <20><><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵļ<EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ء<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧһά<D2BB><CEAC><EFBFBD><EFBFBD>
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>ά<EFBFBD><CEAC><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾȺ<EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD><EFBFBD>ԣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD>±<EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD>ԣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>Ԫ<EFBFBD><EFBFBD>
## 2. <20><><EFBFBD><EFBFBD><EFBFBD>Ĵ洢
**2.1 nά<6E><CEAC><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD>**
<EFBFBD>±<EFBFBD><EFBFBD><EFBFBD>n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊnά<EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>
- `int[] a = new int[10]; //һά<D2BB><CEAC><EFBFBD><EFBFBD>ߣ<EFBFBD>`
- `int[ , ] a = new int[2,3];//<2F><>ά<EFBFBD><CEAC><EFBFBD><EFBFBD> <20><><EFBFBD>棩`
- `int[ , , ] a = new int[2,3,4];//<2F><>ά<EFBFBD><CEAC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E5A3A9><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><E5A3A9>2.ҳ<><D2B3> 3.<2E><> 4.<2E>С<EFBFBD>`
**2.2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B4A2><EFBFBD>ص<EFBFBD>**
- <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>а<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B4A2>
- <20><><EFBFBD><EFBFBD><EFBFBD>Ĵ洢<C4B4><E6B4A2><EFBFBD><EFBFBD><E4B0B4><EFBFBD>У<EFBFBD>C<EFBFBD><43>C++<2B><>C#<23>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD>У<EFBFBD>Forturn<72>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD>С<EFBFBD>
- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׵<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>dz<EFBFBD><C7B3><EFBFBD><EFBFBD><EFBFBD>
**2.3 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ洢**
<u>һά<D2BB><CEAC><EFBFBD><EFBFBD>`a[n]`</u>
<EFBFBD><EFBFBD>Ԫ<EFBFBD>ذ<EFBFBD><EFBFBD>½DZ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD>š<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>`int[] a = new int[5];`
![һά<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>](https://img-blog.csdnimg.cn/20191218195949938.png)
<u><3E><>ά<EFBFBD><CEAC><EFBFBD><EFBFBD>`a[m,n]`</u>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>`int[ , ] a = new int[2,3];`
![<EFBFBD><EFBFBD>ά<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>](https://img-blog.csdnimg.cn/20191218200106993.png)
<u><3E><>ά<EFBFBD><CEAC><EFBFBD><EFBFBD>`a[m,n,l]`</u>
<EFBFBD><EFBFBD>һά<EFBFBD>±<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ά<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һά<EFBFBD><EFBFBD><EFBFBD>±<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>`int[ , , ] a = new int[2,3,4];`
![<EFBFBD><EFBFBD>ά<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ洢](https://img-blog.csdnimg.cn/20191218200209131.png)
## 3. <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>붯̬<EBB6AF><CCAC><EFBFBD><EFBFBD>
**3.1 <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>**
<EFBFBD>ڳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
`int[] a = new int[10];//<2F><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><E9A3A8><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2>ɸı䣩`
**3.2 <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>**
<EFBFBD>ڳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȿɸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
![<EFBFBD><EFBFBD>̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ](https://img-blog.csdnimg.cn/2019121820102094.png)
<EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><EFBFBD><EFBFBD>Ϊ`C#`<EFBFBD><EFBFBD><EFBFBD>
```c
using System;
namespace LinearStruct
{
/// <summary>
/// <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
/// </summary>
/// <typeparam name="T"><3E><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD></typeparam>
public class DArray<T> where T : IComparable<T>
{
private T[] _array;
/// <summary>
/// <20><>ȡ<EFBFBD><C8A1>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
/// </summary>
public int Size { get; private set; }
/// <summary>
/// <20><>ʼ<EFBFBD><CABC>DArray<61><79><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
/// </summary>
/// <param name="size"><3E><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD></param>
public DArray(int size)
{
if (size <= 0)
throw new ArgumentOutOfRangeException();
Size = size;
_array = new T[Size];
}
/// <summary>
/// <20>ı䶯̬<E4B6AF><CCAC><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
/// </summary>
/// <param name="newSize"><3E><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>³<EFBFBD><C2B3><EFBFBD></param>
public void ReSize(int newSize)
{
if (newSize <= 0)
throw new ArgumentOutOfRangeException();
if (Size != newSize)
{
T[] newArray = new T[newSize];
int n = newSize < Size ? newSize : Size;
for (int i = 0; i < n; i++)
{
newArray[i] = _array[i];
}
_array = newArray;
Size = newSize;
}
}
/// <summary>
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
/// </summary>
/// <param name="index">Ҫ<><D2AA><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>õ<EFBFBD>Ԫ<EFBFBD>ش<EFBFBD><D8B4>ʼ<E3BFAA><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns>ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA></returns>
public T this[int index]
{
get
{
if (index < 0 || index > Size - 1)
throw new IndexOutOfRangeException();
return _array[index];
}
set
{
if (index < 0 || index > Size - 1)
throw new IndexOutOfRangeException();
_array[index] = value;
}
}
}
}
```
## 4. <20><>ϰ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD>
**1. <20><><EFBFBD>ö<EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>**
<EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><EFBFBD><EFBFBD>Ϊ`C#`<EFBFBD><EFBFBD><EFBFBD>
```c
using System;
using LinearStruct;
namespace SampleDArray
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("N=");
string s = Console.ReadLine();
int n;
if (int.TryParse(s, out n))
{
DArray<int> arr = new DArray<int>(10);
int j = 0;
for (int i = 2; i <= n; i++)
{
if (i%5 == 0 || i%7 == 0)
{
if (j == arr.Size)
arr.ReSize(arr.Size + 10);
arr[j] = i;
j++;
}
}
for (int i = 0; i < j; i++)
{
Console.Write(arr[i] + " ");
}
}
}
}
}
```
**2. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>**
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ`python`<EFBFBD>
```python
class Solution(object):
"""
<20><><EFBFBD>жԽ<D0B6><D4BD><EFBFBD><EFBFBD>ϵ<EFBFBD>Ԫ<EFBFBD>ض<EFBFBD><D8B6><EFBFBD><EFBFBD><EFBFBD> a_1 = a_2, a_2 = a_3, a_{k-1} = a_ka
<20><><EFBFBD>ڶԽ<DAB6><D4BD><EFBFBD><EFBFBD>ϵ<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰԪ<C7B0>ز<EFBFBD><D8B2>ǵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>Ԫ<EFBFBD>أ<EFBFBD>
<20><>ô<EFBFBD><C3B4>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>һ<EFBFBD><D2BB><EFBFBD>ڵ<EFBFBD>ǰԪ<C7B0>ص<EFBFBD><D8B5><EFBFBD><EFBFBD>Ͻǡ<CFBD>
<20><><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (r, c) <20>ϵ<EFBFBD>Ԫ<EFBFBD>أ<EFBFBD>ֻ<EFBFBD><D6BB>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD> r == 0 OR c == 0 OR matrix[r-1][c-1] == matrix[r][c] <20>Ϳ<EFBFBD><CDBF><EFBFBD><EFBFBD>ˡ<EFBFBD>
"""
def isToeplitzMatrix(self, matrix):
# all()<29><>ʾ<EFBFBD><CABE><EFBFBD>ж<EFBFBD>Ϊtrue<75>ŷ<EFBFBD><C5B7><EFBFBD>true
# python<6F><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1>Ƶ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>˫<EFBFBD><CBAB>forѭ<72><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9B3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return all(r == 0 or c == 0 or matrix[r - 1][c - 1] == val
for r, row in enumerate(matrix)
for c, val in enumerate(row))
if __name__ == '__main__':
matrix = [
[1, 2, 3, 4],
[5, 1, 2, 3],
[9, 5, 1, 2]
]
solution = Solution()
output = solution.isToeplitzMatrix(matrix)
print(output)
```
**3. <20><><EFBFBD><EFBFBD>֮<EFBFBD><D6AE>**
<EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><EFBFBD><EFBFBD>Ϊ`C#`<EFBFBD><EFBFBD><EFBFBD>
```c
public class Solution {
public IList<IList<int>> ThreeSum(int[] nums) {
IList<IList<int>> result = new List<IList<int>>();
if (nums == null || nums.Length < 3)
return result;
nums = nums.OrderBy(a => a).ToArray();
int len = nums.Length;
for (int i = 0; i < len; i++)
{
if (nums[i] > 0) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD>ѭ<EFBFBD><D1AD>
break;
if (i > 0 && nums[i] == nums[i - 1])
continue; // ȥ<><C8A5>
int l = i + 1;
int r = len - 1;
while (l < r)
{
int sum = nums[i] + nums[l] + nums[r];
if (sum == 0)
{
result.Add(new List<int>() {nums[i], nums[l], nums[r]});
while (l < r && nums[l] == nums[l + 1]) l++; // ȥ<><C8A5>
while (l < r && nums[r - 1] == nums[r]) r--; //ȥ<><C8A5>
l++;
r--;
}
else if (sum < 0)
{
l++;
}
else if (sum > 0)
{
r--;
}
}
}
return result;
}
}
```

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,628 @@
# Task03<30><33>ջ<EFBFBD><D5BB><EFBFBD>ݹ飨2<E9A3A8>
ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ѹ<EFBFBD><EFBFBD>е<EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD>е<EFBFBD><EFBFBD>ӵ<EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
![](https://img-blog.csdnimg.cn/20191222213300699.png)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD>Word<EFBFBD><EFBFBD>Excel<EFBFBD><EFBFBD>Photoshop<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<EFBFBD>еij<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><EFBFBD>ջ<EFBFBD>ľ<EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD><EFBFBD><EFBFBD>ܡ<EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ<EFBFBD><EFBFBD>
## 1. ջ<>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
**1.1 ջ<>Ķ<EFBFBD><C4B6><EFBFBD>**
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ˣ<EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>First In Last Out<75><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>
<EFBFBD><EFBFBD>1 <20><><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD>`(a0,a1,...,an)` <20><>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB>ʾ<EFBFBD><CABE>
![˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ](https://img-blog.csdnimg.cn/20191222213645860.png)
![<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ](https://img-blog.csdnimg.cn/20191222213749217.png)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD>ջһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ַ<EFBFBD>ʽ<EFBFBD><EFBFBD>ʲô<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD>
- ˳<><CBB3>ջ<EFBFBD>Ǿ<EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD>Ƕ<EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ԱȽ<D4B1><C8BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>ڿռ<DABF><D5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8>ߡ<EFBFBD><DFA1><EFBFBD>Ϊ˳<CEAA><CBB3>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˽ϴ<CBBD><CFB4>Ŀռ<D5BC>Dz<EFBFBD>û<EFBFBD><C3BB>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD>洢Ԫ<E6B4A2>ء<EFBFBD>
- ˳<><CBB3>ջ<EFBFBD><D5BB>Ȼ<EFBFBD><C8BB><EFBFBD>ô洢ָ<E6B4A2><D6B8><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD><C8BD><EFBFBD>ջ<EFBFBD><D5BB>˵<EFBFBD><CBB5>Ϊ<EFBFBD><CEAA>ʡ<EFBFBD>ڴ<EFBFBD><DAB4>ռ<D5BC><E4A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջȴ<D5BB><C8B4><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <20><><EFBFBD>Ҷ<EFBFBD><D2B6>ڴ洢<DAB4><E6B4A2>δ֪<CEB4><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD><C2A3><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>ʺϣ<CABA><CFA3><EFBFBD>Ϊ<EFBFBD><CEAA>ջͨ<D5BB><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <20><><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE>Ч<EFBFBD>ʸ<EFBFBD><CAB8>ߣ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>Ч<EFBFBD>ʸ<EFBFBD><CAB8>ߡ<EFBFBD><DFA1><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6><EFBFBD>ջ<EFBFBD><D5BB>˵ֻ<CBB5><D6BB><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>ʸ<EFBFBD><CAB8>ߡ<EFBFBD>
**1.2 ջ<>IJ<EFBFBD><C4B2><EFBFBD>**
- <20><>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD>
- <20><>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ء<EFBFBD>
- <20>Ƿ<EFBFBD>Ϊ<EFBFBD>գ<EFBFBD><D5A3>ж<EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ء<EFBFBD>
- <20>õ<EFBFBD>ջ<EFBFBD><EFBFBD><EEA3BA>ȡջ<C8A1><D5BB>ʵ<EFBFBD>ʰ<EFBFBD><CAB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>صĸ<D8B5><C4B8><EFBFBD><EFBFBD><EFBFBD>
- <20><><EFBFBD>ղ<EFBFBD><D5B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD>ջ<EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ء<EFBFBD>
- <20><>ȡջ<C8A1><D5BB>Ԫ<EFBFBD>ء<EFBFBD>
![ջ<EFBFBD>ӿ<EFBFBD>](https://img-blog.csdnimg.cn/20191222214544845.png)
<EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><EFBFBD><EFBFBD>Ϊ`C#`<EFBFBD><EFBFBD><EFBFBD>
```c
using System;
namespace LinearStruct
{
/// <summary>
/// ջ<>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <typeparam name="T">ջ<><D5BB>Ԫ<EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD></typeparam>
public interface IStack<T> where T : IComparable<T>
{
/// <summary>
/// <20><>ȡջ<C8A1><D5BB>ʵ<EFBFBD>ʰ<EFBFBD><CAB0><EFBFBD>Ԫ<EFBFBD>صĸ<D8B5><C4B8><EFBFBD>
/// </summary>
int Length { get; }
/// <summary>
/// <20><>ȡջ<C8A1><D5BB>Ԫ<EFBFBD><D4AA>
/// </summary>
T StackTop { get; }
/// <summary>
/// <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>ջ
/// </summary>
/// <param name="data">Ҫ<><D2AA>ջ<EFBFBD><D5BB>Ԫ<EFBFBD><D4AA></param>
void Push(T data);
/// <summary>
/// <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD>س<EFBFBD>ջ
/// </summary>
void Pop();
/// <summary>
/// <20>ж<EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
/// </summary>
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ط<EFBFBD><D8B7><EFBFBD>false,<2C><><EFBFBD>򷵻<EFBFBD>true.</returns>
bool IsEmpty();
/// <summary>
/// <20><>ջ<EFBFBD><D5BB><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
/// </summary>
void Clear();
}
}
```
## 2. ջ<>Ĵ洢<C4B4><E6B4A2>ʵ<EFBFBD><CAB5>
**2.1 ˳<><CBB3><EFBFBD><EFBFBD><E6B4A2>˳<EFBFBD><CBB3>ջ<EFBFBD><D5BB>**
˳<EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ֵ<EFBFBD>ջ<EFBFBD><EFBFBD>
ʵ<EFBFBD>֣<EFBFBD>
![˳<EFBFBD><EFBFBD>ջ](https://img-blog.csdnimg.cn/20191222214937292.png)
<EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><EFBFBD><EFBFBD>Ϊ`C#`<EFBFBD><EFBFBD><EFBFBD>
```c
using System;
namespace LinearStruct
{
/// <summary>
/// <20><>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>ṹʵ<E1B9B9>ֵ<EFBFBD>ջ
/// </summary>
/// <typeparam name="T">˳<><CBB3>ջ<EFBFBD><D5BB>Ԫ<EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD></typeparam>
public class SeqStack<T> : IStack<T> where T : IComparable<T>
{
private readonly SeqList<T> _lst;
/// <summary>
/// <20><>ʼ<EFBFBD><CABC>SeqStack<63><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
/// </summary>
/// <param name="max">SeqStack<63><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>صĸ<D8B5><C4B8><EFBFBD></param>
public SeqStack(int max)
{
if (max <= 0)
throw new ArgumentOutOfRangeException();
_lst = new SeqList<T>(max);
}
/// <summary>
/// <20><>ȡSeqStack<63><6B>ʵ<EFBFBD>ʰ<EFBFBD><CAB0><EFBFBD>Ԫ<EFBFBD>صĸ<D8B5><C4B8><EFBFBD>
/// </summary>
public int Length
{
get { return _lst.Length; }
}
/// <summary>
/// <20><>ȡSeqStack<63><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>صĸ<D8B5><C4B8><EFBFBD>
/// </summary>
public int MaxSize
{
get { return _lst.MaxSize; }
}
/// <summary>
/// <20><>ȡSeqStack<63>е<EFBFBD>ջ<EFBFBD><D5BB>Ԫ<EFBFBD><D4AA>
/// </summary>
public T StackTop
{
get
{
if (_lst.IsEmpty())
throw new Exception("ջΪ<EFBFBD><EFBFBD>.");
return _lst[0];
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>ջ
/// </summary>
/// <param name="data">Ҫ<><D2AA>ջ<EFBFBD><D5BB>Ԫ<EFBFBD><D4AA></param>
public void Push(T data)
{
if (_lst.Length == _lst.MaxSize)
throw new Exception("ջ<EFBFBD>Ѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.");
_lst.Insert(0, data);
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD>س<EFBFBD>ջ
/// </summary>
public void Pop()
{
if (_lst.IsEmpty())
throw new Exception("ջΪ<EFBFBD><EFBFBD>.");
_lst.Remove(0);
}
/// <summary>
/// <20>ж<EFBFBD>SeqStack<63><6B><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
/// </summary>
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ط<EFBFBD><D8B7><EFBFBD>false,<2C><><EFBFBD>򷵻<EFBFBD>true.</returns>
public bool IsEmpty()
{
return _lst.IsEmpty();
}
/// <summary>
/// <20><>SeqStack<63><6B><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
/// </summary>
public void Clear()
{
_lst.Clear();
}
}
}
```
**2.2 <20><>ʽ<EFBFBD><EFBFBD><E6B4A2><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB>**
<EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ֵ<EFBFBD>ջ<EFBFBD><EFBFBD>
ʵ<EFBFBD>֣<EFBFBD>
![<EFBFBD><EFBFBD>ջ](https://img-blog.csdnimg.cn/20191222215336715.png)
<EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><EFBFBD><EFBFBD>Ϊ`C#`<EFBFBD><EFBFBD><EFBFBD>
```c
using System;
namespace LinearStruct
{
/// <summary>
/// <20><><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD>ṹʵ<E1B9B9>ֵ<EFBFBD>ջ
/// </summary>
/// <typeparam name="T">ջ<><D5BB>Ԫ<EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD></typeparam>
public class LinkStack<T> : IStack<T> where T : IComparable<T>
{
private readonly SLinkList<T> _lst;
/// <summary>
/// <20><>ʼ<EFBFBD><CABC>LinkStack<63><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
/// </summary>
public LinkStack()
{
_lst = new SLinkList<T>();
}
/// <summary>
/// <20><>ȡLinkStack<63><6B>ʵ<EFBFBD>ʰ<EFBFBD><CAB0><EFBFBD>Ԫ<EFBFBD>صĸ<D8B5><C4B8><EFBFBD>
/// </summary>
public int Length
{
get { return _lst.Length; }
}
/// <summary>
/// <20><>ȡLinkStack<63>е<EFBFBD>ջ<EFBFBD><D5BB>Ԫ<EFBFBD><D4AA>
/// </summary>
public T StackTop
{
get
{
if (_lst.Length == 0)
throw new Exception("ջΪ<EFBFBD><EFBFBD>.");
return _lst[0];
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>ջ
/// </summary>
/// <param name="data">Ҫ<><D2AA>ջ<EFBFBD><D5BB>Ԫ<EFBFBD><D4AA></param>
public void Push(T data)
{
_lst.InsertAtFirst(data);
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD>س<EFBFBD>ջ
/// </summary>
public void Pop()
{
if (_lst.Length == 0)
throw new Exception("ջΪ<EFBFBD><EFBFBD>.");
_lst.Remove(0);
}
/// <summary>
/// <20>ж<EFBFBD>LinkStack<63><6B><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
/// </summary>
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ط<EFBFBD><D8B7><EFBFBD>false,<2C><><EFBFBD>򷵻<EFBFBD>true.</returns>
public bool IsEmpty()
{
return _lst.IsEmpty();
}
/// <summary>
/// <20><>LinkStack<63><6B><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
/// </summary>
public void Clear()
{
_lst.Clear();
}
}
}
```
## 3. <20>ݹ<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵݹ麯<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Sample01<EFBFBD><EFBFBD><EFBFBD><EFBFBD>n<EFBFBD>Ľ׳<EFBFBD>
`n! = 1 x 2 x 3 x ... x n`
ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><EFBFBD><EFBFBD>Ϊ`Python`<EFBFBD><EFBFBD><EFBFBD>
```python
n = 5
for k in range(1, 5):
n = n * k
print(n) # 120
```
<EFBFBD>ݹ飺
<EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><EFBFBD><EFBFBD>Ϊ`Python`<EFBFBD><EFBFBD><EFBFBD>
```python
def factorial(n):
if n == 1:
return 1
return n * fact(n - 1)
print(factorial(5)) # 120
```
Samp02<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
`f(n)=f(n-1)+f(n-2), f(0)=0 f(1)=1`
ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><EFBFBD><EFBFBD>Ϊ`Python`<EFBFBD><EFBFBD><EFBFBD>
```python
i = 0
j = 1
lst = list([i, j])
for k in range(2, 11):
k = i + j
lst.append(k)
i = j
j = k
print(lst)
# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
```
<EFBFBD>ݹ飺
<EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><EFBFBD><EFBFBD>Ϊ`Python`<EFBFBD><EFBFBD><EFBFBD>
```python
def recur_fibo(n):
if n <= 1:
return n
return recur_fibo(n - 1) + recur_fibo(n - 2)
lst = list()
for k in range(11):
lst.append(recur_fibo(k))
print(lst)
# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
```
ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD>õݹ<EFBFBD><EFBFBD>IJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PythonĬ<EFBFBD>ϵݹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ 100
```python
import sys
sys.setrecursionlimit(1000)
```
Sample03<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʯ<EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><EFBFBD>մ<EFBFBD>С˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 64 Ƭ<>ƽ<EFBFBD>Բ<EFBFBD>̡<EFBFBD><CCA1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD>Բ<EFBFBD>̴<EFBFBD><CCB4><EFBFBD><EFBFBD>ʼ<E6BFAA><CABC><EFBFBD><EFBFBD>С˳<D0A1><CBB3><EFBFBD><EFBFBD><EFBFBD>°ڷ<C2B0><DAB7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϡ<EFBFBD><CFA1><EFBFBD><EFBFBD>ҹ涨<D2B9><E6B6A8><EFBFBD><EFBFBD>СԲ<D0A1><D4B2><EFBFBD>ϲ<EFBFBD><CFB2>ܷŴ<DCB7>Բ<EFBFBD>̣<EFBFBD><CCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE>һ<EFBFBD><D2BB>ֻ<EFBFBD><D6BB><EFBFBD>ƶ<EFBFBD>һ<EFBFBD><D2BB>Բ<EFBFBD>̡<EFBFBD>
![](https://img-blog.csdnimg.cn/20181218104026718.png)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ˼<EFBFBD><EFBFBD>ÿһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD>ƿ<EFBFBD><EFBFBD>ܻ<EFBFBD><EFBFBD>dz<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><EFBFBD>Խ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򻯡<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> a <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE>ɹ<EFBFBD><C9B9>ؽ<EFBFBD> a <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 63<36><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD> b <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ֻҪ<D6BB>ٽ<EFBFBD><D9BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> a <20><><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD> c <20><><EFBFBD><EFBFBD><EFBFBD>ɡ<EFBFBD>
![](https://img-blog.csdnimg.cn/20181218104208856.png)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> a <20><><EFBFBD>Ƶ<EFBFBD> c <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>b <20><><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> 63 <20><><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD>a <20><>Ϊ<EFBFBD>ա<EFBFBD><D5A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>ͱ<EFBFBD><CDB1><EFBFBD><EFBFBD>˽<EFBFBD><CBBD><EFBFBD> 63 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> b <20><><EFBFBD>Ƶ<EFBFBD> c <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫһ<C8AB><D2BB><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD> a <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA> b <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 64 <20><>Ϊ<EFBFBD><CEAA> 63<36><33><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF>Բ<EFBFBD><D4B2><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD><C8BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 62 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> b <20><><EFBFBD>Ƶ<EFBFBD> a <20><><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD> c <20><><EFBFBD><EFBFBD>
<EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> b <20><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><E5A3AC> a <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 62 <20><>Բ<EFBFBD><D4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 61 <20><>Բ<EFBFBD><D4B2><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD> b <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Բ<EFBFBD><D4B2><EFBFBD>Ƶ<EFBFBD> c <20><><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD>ζ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> a <20><> b <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>壬Ȼ<E5A3AC><C8BB><EFBFBD>Ƚ<EFBFBD><C8BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><D4B2>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3>ٽ<EFBFBD><D9BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>Բ<EFBFBD><D4B2><EFBFBD>Ƶ<EFBFBD> c <20><><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8>˹<EFBFBD><CBB9>̡<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>Բ<EFBFBD>̵Ĺ<EFBFBD><EFBFBD>̾<EFBFBD><EFBFBD>ǵݹ飬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> n <20><>Բ<EFBFBD>̵<EFBFBD><CCB5>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><E2A3AC>Ҫ<EFBFBD>Ƚ<EFBFBD><C8BD><EFBFBD><EFBFBD><EFBFBD>n-1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><EFBFBD>Ա<EFBFBD>дһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>move(n, a, b, c)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⣺move(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>, <20>յ<EFBFBD>)<29><>
<u>1. a <20><>ֻ<EFBFBD><D6BB>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӱᵽ c<><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></u>:
```python
if n == 1:
print(a, '-->', c)
```
<u>2. a <20>ϲ<EFBFBD>ֹ<EFBFBD><D6B9>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD></u>:
<EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD> n-1 <20><><EFBFBD><EFBFBD><EFBFBD>Ӱᵽ b <20><><EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><E5A1A3>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ǣ<EFBFBD>a --> b<><62>
```python
move(n - 1, a, c, b)
```
<EFBFBD>ٰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӱᵽ c <20><><EFBFBD>ӣ<EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD>a-->c<><63>
```python
move(1, a, b, c)
```
<EFBFBD><EFBFBD><EFBFBD>󣬰<EFBFBD>ʣ<EFBFBD><EFBFBD> b <20><><EFBFBD><EFBFBD> n-1 <20><><EFBFBD><EFBFBD><EFBFBD>Ӱᵽ c <20>ϣ<EFBFBD><CFA3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˻<EFBFBD><CBBB>
```python
move(n - 1, b, a, c)
```
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Python ʵ<>ֺ<EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
```python
i = 0
def move(n, a, b, c):
global i
if (n == 1):
i += 1
print('<EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD> {0} <20><> {1} --> {2}'.format(i, a, c))
return
move(n - 1, a, c, b)
move(1, a, b, c)
move(n - 1, b, a, c)
move(3, "a", "b", "c")
# <20>ƶ<EFBFBD><C6B6><EFBFBD> 1 <20><> a --> c
# <20>ƶ<EFBFBD><C6B6><EFBFBD> 2 <20><> a --> b
# <20>ƶ<EFBFBD><C6B6><EFBFBD> 3 <20><> c --> b
# <20>ƶ<EFBFBD><C6B6><EFBFBD> 4 <20><> a --> c
# <20>ƶ<EFBFBD><C6B6><EFBFBD> 5 <20><> b --> a
# <20>ƶ<EFBFBD><C6B6><EFBFBD> 6 <20><> b --> c
# <20>ƶ<EFBFBD><C6B6><EFBFBD> 7 <20><> a --> c
```
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> C# ʵ<>ֺ<EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
```c
class Program
{
private static int i = 0;
static void Move(int n, string a, string b, string c)
{
if (n == 1)
{
Console.WriteLine("<EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD> {0} <20><> {1}-->{2}", ++i, a, c);
return;
}
Move(n - 1, a, c, b);
Move(1, a, b, c);
Move(n - 1, b, a, c);
}
static void Main(string[] args)
{
Move(3, "a", "b", "c");
}
}
// <20>ƶ<EFBFBD><C6B6><EFBFBD> 1 <20><> a --> c
// <20>ƶ<EFBFBD><C6B6><EFBFBD> 2 <20><> a --> b
// <20>ƶ<EFBFBD><C6B6><EFBFBD> 3 <20><> c --> b
// <20>ƶ<EFBFBD><C6B6><EFBFBD> 4 <20><> a --> c
// <20>ƶ<EFBFBD><C6B6><EFBFBD> 5 <20><> b --> a
// <20>ƶ<EFBFBD><C6B6><EFBFBD> 6 <20><> b --> c
// <20>ƶ<EFBFBD><C6B6><EFBFBD> 7 <20><> a --> c
```
## 4. <20><>ϰ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵij<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>`C#`<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
```c
using System;
using LinearStruct;
namespace TrainArrange
{
class Program
{
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="p"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="k"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>ɹ<EFBFBD></returns>
static bool RailRoad(int[] p, int k)
{
LinkStack<int>[] h = new LinkStack<int>[k];
for (int i = 0; i < h.Length; i++)
h[i] = new LinkStack<int>();
int nowOut = 1; //<2F><>һ<EFBFBD><D2BB>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD>
int minH = int.MaxValue; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
int minS = -1; //minH<6E>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < p.Length; i++)
{
if (p[i] == nowOut)
{
Console.WriteLine("<EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>᣺{0}<7D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECB5BD><EFBFBD>", p[i]);
nowOut++;
//<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while (minH == nowOut)
{
Output(ref minH, ref minS, h); //<2F><><EFBFBD><EFBFBD>
nowOut++;
}
}
else
{
//<2F><>p[i]<5D><><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (Input(p[i], ref minH, ref minS, h) == false)
{
return false;
}
}
}
return true;
}
/// <summary>
/// <20>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="minH"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>ij<EFBFBD><C4B3><EFBFBD></param>
/// <param name="minS">minH<6E>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="h"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD></param>
static void Output(ref int minH, ref int minS, LinkStack<int>[] h)
{
h[minS].Pop(); //<2F>Ӷ<EFBFBD>ջminS<6E><53>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>ij<EFBFBD><C4B3><EFBFBD>minH
Console.WriteLine("<EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>᣺{0}<7D>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD>{1}<7D><><EFBFBD><EFBFBD><EFBFBD>", minH, minS);
//ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>minH<6E><48>minS
minH = int.MaxValue;
minS = -1;
for (int i = 0; i < h.Length; i++)
{
if (h[i].IsEmpty() == false && h[i].StackTop < minH)
{
minH = h[i].StackTop;
minS = i;
}
}
}
/// <summary>
/// <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EBB3B5>C
/// </summary>
/// <param name="c"><3E><><EFBFBD><EFBFBD><EBB3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="minH">ջ<><D5BB><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD>Сֵ</param>
/// <param name="minS">ջ<><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Сֵ<D0A1><D6B5><EFBFBD>ڶ<EFBFBD>ջ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD></param>
/// <param name="h"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD></param>
/// <returns><3E><><EFBFBD><EFBFBD>û<EFBFBD>п<EFBFBD><D0BF>õĻ<C3B5><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򷵻<EFBFBD>false<73><65><EFBFBD><EFBFBD><EFBFBD>򷵻<EFBFBD>true<75><65></returns>
static bool Input(int c, ref int minH, ref int minS, LinkStack<int>[] h)
{
int bestTrack = -1; //Ŀǰ<C4BF><C7B0><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD>
int bestTop = int.MaxValue; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < h.Length; i++)
{
if (h[i].IsEmpty() == false)
{
int x = h[i].StackTop;
if (c < x && x < bestTop)
{
bestTop = x;
bestTrack = i;
}
}
else
{
if (bestTrack == -1)
{
bestTrack = i;
break;
}
}
}
if (bestTrack == -1)
return false;
h[bestTrack].Push(c);
Console.WriteLine("<EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>᣺{0}<7D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECB5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{1}<7D><>", c, bestTrack);
if (c < minH)
{
minH = c;
minS = bestTrack;
}
return true;
}
static void Main(string[] args)
{
int[] p = new int[] {3, 6, 9, 2, 4, 7, 1, 8, 5};
int k = 1;
bool result = RailRoad(p, k);
do
{
if (result == false)
{
Console.WriteLine("<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD>:");
k = k + Convert.ToInt32(Console.ReadLine());
result = RailRoad(p, k);
}
} while (result == false);
}
}
}
```

View File

@@ -0,0 +1,572 @@
# Task04<30><34><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>2<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD>ȥʳ<EFBFBD>ô򷹵ȶ<EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>Ŷӣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˻<EFBFBD><EFBFBD>򷹵<EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŷӵ<EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD>˭<EFBFBD><EFBFBD><EFBFBD>ŶӾ<EFBFBD>Ϊ˭<EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
![](https://img-blog.csdnimg.cn/20191223190948974.png)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD>Щ<EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD><EFBFBD>еľ<EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>á<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ȷŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>Ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>ȷŵ<EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD> Ȼ<><C8BB><EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD>ܡ<EFBFBD><DCA1><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ<DDBD><E1B9B9>
## 1. <20><><EFBFBD>еĶ<D0B5><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
**1.1 <20><><EFBFBD>еĶ<D0B5><C4B6><EFBFBD>**
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ˣ<EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ˣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ף<EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD><EFBFBD>ȳ<EFBFBD><EFBFBD><EFBFBD>First In First Out<75><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>
<EFBFBD><EFBFBD>1 <20><><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD>`a0,a1,...,an`<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>
![˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>](https://img-blog.csdnimg.cn/20191223191501199.png)
![<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>](https://img-blog.csdnimg.cn/20191223191548730.png)
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ַ<EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ַ<EFBFBD>ʽ<EFBFBD>ĶԱ<EFBFBD><EFBFBD>Ѿ<EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD>ݹ鲿<EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˽<EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><EFBFBD><EFBFBD>׸<EFBFBD><EFBFBD><EFBFBD>ˡ<EFBFBD>
**1.2 <20><><EFBFBD>еIJ<D0B5><C4B2><EFBFBD>**
- <20><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ز<EFBFBD><D8B2><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><CEB2>
- <20><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD>׵<EFBFBD><D7B5><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ء<EFBFBD>
- <20>Ƿ<EFBFBD>Ϊ<EFBFBD>գ<EFBFBD><D5A3>ж϶<D0B6><CFB6><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ء<EFBFBD>
- <20>õ<EFBFBD><C3B5>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ʵ<EFBFBD>ʰ<EFBFBD><CAB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>صĸ<D8B5><C4B8><EFBFBD><EFBFBD><EFBFBD>
- <20><><EFBFBD>ղ<EFBFBD><D5B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ء<EFBFBD>
- <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ԫ<EFBFBD>ء<EFBFBD>
![<EFBFBD><EFBFBD><EFBFBD>нӿ<EFBFBD>](https://img-blog.csdnimg.cn/20191223191753857.png)
```c
using System;
namespace LinearStruct
{
/// <summary>
/// <20><><EFBFBD>еij<D0B5><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <typeparam name="T"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD></typeparam>
public interface IQueue<T> where T : IComparable<T>
{
/// <summary>
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ʰ<EFBFBD><CAB0><EFBFBD>Ԫ<EFBFBD>صĸ<D8B5><C4B8><EFBFBD>
/// </summary>
int Length { get; }
/// <summary>
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
/// </summary>
T QueueFront { get; }
/// <summary>
/// <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="data">Ҫ<><D2AA><EFBFBD>ӵ<EFBFBD>Ԫ<EFBFBD><D4AA></param>
void EnQueue(T data);
/// <summary>
/// <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD>س<EFBFBD><D8B3><EFBFBD>
/// </summary>
void DeQueue();
/// <summary>
/// <20>ж϶<D0B6><CFB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
/// </summary>
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ط<EFBFBD><D8B7><EFBFBD>false,<2C><><EFBFBD>򷵻<EFBFBD>true.</returns>
bool IsEmpty();
/// <summary>
/// <20>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
/// </summary>
void Clear();
}
}
```
## 2. <20><><EFBFBD>еĴ洢<C4B4><E6B4A2>ʵ<EFBFBD><CAB5>
**2.1 ˳<><CBB3><EFBFBD>**
<u>˳<><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD></u>
˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD>Sequence Queue<75><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>ʵ<EFBFBD>ֵĶ<D6B5><C4B6>С<EFBFBD>
ʵ<EFBFBD>֣<EFBFBD>
![˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>](https://img-blog.csdnimg.cn/20191223192315765.png)
```c
using System;
namespace LinearStruct
{
/// <summary>
/// <20><>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>ṹʵ<E1B9B9>ֵĶ<D6B5><C4B6><EFBFBD>--˳<><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <typeparam name="T">˳<><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD></typeparam>
public class SeqQueue<T> : IQueue<T> where T : IComparable<T>
{
private readonly SeqList<T> _lst;
/// <summary>
/// <20><>ʼ<EFBFBD><CABC>SeqQueue<75><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
/// </summary>
/// <param name="max">SeqQueue<75><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>صĸ<D8B5><C4B8><EFBFBD></param>
public SeqQueue(int max)
{
if (max <= 0)
throw new ArgumentOutOfRangeException();
_lst = new SeqList<T>(max);
}
/// <summary>
/// <20><>ȡSeqQueue<75><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>صĸ<D8B5><C4B8><EFBFBD>
/// </summary>
public int MaxSize
{
get { return _lst.MaxSize; }
}
/// <summary>
/// <20><>ȡSeqQueue<75><65>ʵ<EFBFBD>ʰ<EFBFBD><CAB0><EFBFBD>Ԫ<EFBFBD>صĸ<D8B5><C4B8><EFBFBD>
/// </summary>
public int Length
{
get { return _lst.Length; }
}
/// <summary>
/// <20><>ȡSeqQueue<75>еĶ<D0B5><C4B6><EFBFBD>Ԫ<EFBFBD><D4AA>
/// </summary>
public T QueueFront
{
get
{
if (_lst.IsEmpty())
throw new Exception("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>,<2C><><EFBFBD>ܵõ<DCB5><C3B5><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>.");
return _lst[0];
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="data">Ҫ<><D2AA><EFBFBD>ӵ<EFBFBD>Ԫ<EFBFBD><D4AA></param>
public void EnQueue(T data)
{
if (_lst.Length == _lst.MaxSize)
throw new Exception("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.");
_lst.Insert(_lst.Length, data);
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD>س<EFBFBD><D8B3><EFBFBD>
/// </summary>
public void DeQueue()
{
if (_lst.IsEmpty())
throw new Exception("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>,<2C><><EFBFBD>ܳ<EFBFBD><DCB3><EFBFBD>.");
_lst.Remove(0);
}
/// <summary>
/// <20>ж϶<D0B6><CFB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
/// </summary>
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ط<EFBFBD><D8B7><EFBFBD>false,<2C><><EFBFBD>򷵻<EFBFBD>true.</returns>
public bool IsEmpty()
{
return _lst.IsEmpty();
}
/// <summary>
/// <20>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
/// </summary>
public void Clear()
{
_lst.Clear();
}
}
}
```
<u>ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></u>
ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>Circular Sequence Queue<75><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD>ķ<EFBFBD>ʽʵ<CABD>ֵĶ<D6B5><C4B6>С<EFBFBD>
![ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ](https://img-blog.csdnimg.cn/20191223192517344.png)
ʵ<EFBFBD>֣<EFBFBD>
![ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>](https://img-blog.csdnimg.cn/20191223192722855.png)
```c
using System;
namespace LinearStruct
{
/// <summary>
/// <20><>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>ṹʵ<E1B9B9>ֵĶ<D6B5><C4B6><EFBFBD>--ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <typeparam name="T">ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD></typeparam>
public class CSeqQueue<T> : IQueue<T> where T : IComparable<T>
{
private int _pFront;
private int _pRear;
private readonly T[] _dataset;
/// <summary>
/// <20><>ȡCSeqQueue<75><65>ʵ<EFBFBD>ʰ<EFBFBD><CAB0><EFBFBD>Ԫ<EFBFBD>صĸ<D8B5><C4B8><EFBFBD>
/// </summary>
public int Length { get; private set; }
/// <summary>
/// <20><>ȡCSeqQueue<75><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>صĸ<D8B5><C4B8><EFBFBD>
/// </summary>
public int MaxSize { get; }
/// <summary>
/// <20><>ȡCSeqQueue<75>еĶ<D0B5><C4B6><EFBFBD>Ԫ<EFBFBD><D4AA>
/// </summary>
public T QueueFront
{
get
{
if (Length == 0)
throw new Exception("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ղ<EFBFBD><EFBFBD>ܵõ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD>.");
return _dataset[_pFront];
}
}
/// <summary>
/// <20><>ʼ<EFBFBD><CABC>CSeqQueue<75><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
/// </summary>
/// <param name="max">CSeqQueue<75><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>صĸ<D8B5><C4B8><EFBFBD></param>
public CSeqQueue(int max)
{
if (max <= 0)
throw new ArgumentOutOfRangeException();
MaxSize = max;
Length = 0;
_dataset = new T[MaxSize];
_pFront = 0;
_pRear = 0;
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="data">Ҫ<><D2AA><EFBFBD>ӵ<EFBFBD>Ԫ<EFBFBD><D4AA></param>
public void EnQueue(T data)
{
if (Length == MaxSize)
throw new Exception("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.");
_dataset[_pRear] = data;
_pRear = (_pRear + 1)%MaxSize;
Length++;
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD>س<EFBFBD><D8B3><EFBFBD>
/// </summary>
public void DeQueue()
{
if (Length == 0)
throw new Exception("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>,<2C><><EFBFBD>ܳ<EFBFBD><DCB3><EFBFBD>.");
_pFront = (_pFront + 1)%MaxSize;
Length--;
}
/// <summary>
/// <20>ж϶<D0B6><CFB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
/// </summary>
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ط<EFBFBD><D8B7><EFBFBD>false,<2C><><EFBFBD>򷵻<EFBFBD>true.</returns>
public bool IsEmpty()
{
return Length == 0;
}
/// <summary>
/// <20>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
/// </summary>
public void Clear()
{
_pFront = 0;
_pRear = 0;
Length = 0;
}
}
}
```
**2.2 <20><>ʽ<EFBFBD><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD>**
<EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ֵĶ<EFBFBD><EFBFBD>С<EFBFBD>
ʵ<EFBFBD>֣<EFBFBD>
![<EFBFBD><EFBFBD><EFBFBD><EFBFBD>](https://img-blog.csdnimg.cn/20191223192940470.png)
```c
using System;
namespace LinearStruct
{
/// <summary>
/// <20><><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD>ṹʵ<E1B9B9>ֵĶ<D6B5><C4B6><EFBFBD>
/// </summary>
/// <typeparam name="T"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD></typeparam>
public class LinkQueue<T> : IQueue<T> where T : IComparable<T>
{
private readonly SLinkList<T> _lst;
/// <summary>
/// <20><>ȡLinkQueue<75><65>ʵ<EFBFBD>ʰ<EFBFBD><CAB0><EFBFBD>Ԫ<EFBFBD>صĸ<D8B5><C4B8><EFBFBD>
/// </summary>
public int Length
{
get { return _lst.Length; }
}
/// <summary>
/// <20><>ȡLinkQueue<75>еĶ<D0B5><C4B6><EFBFBD>Ԫ<EFBFBD><D4AA>
/// </summary>
public T QueueFront
{
get
{
if (_lst.IsEmpty())
throw new Exception("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>.");
return _lst[0];
}
}
/// <summary>
/// <20><>ʼ<EFBFBD><CABC>LinkQueue<75><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
/// </summary>
public LinkQueue()
{
_lst = new SLinkList<T>();
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="data">Ҫ<><D2AA><EFBFBD>ӵ<EFBFBD>Ԫ<EFBFBD><D4AA></param>
public void EnQueue(T data)
{
_lst.InsertAtRear(data);
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD>س<EFBFBD><D8B3><EFBFBD>
/// </summary>
public void DeQueue()
{
if (_lst.IsEmpty())
throw new Exception("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>,<2C><><EFBFBD>ܳ<EFBFBD><DCB3><EFBFBD>.");
_lst.Remove(0);
}
/// <summary>
/// <20>ж϶<D0B6><CFB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
/// </summary>
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ط<EFBFBD><D8B7><EFBFBD>false,<2C><><EFBFBD>򷵻<EFBFBD>true.</returns>
public bool IsEmpty()
{
return _lst.IsEmpty();
}
/// <summary>
/// <20>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
/// </summary>
public void Clear()
{
_lst.Clear();
}
}
}
```
## 3. <20><>ϰ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD>
**1. ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>**
<EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><EFBFBD><EFBFBD>Ϊ`C#`<EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD>еĽӿ<EFBFBD>
```c
using LinearStruct;
namespace BankQueue
{
public interface IBankQueue : IQueue<int>
{
/// <summary>
/// <20><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></returns>
int GetCallnumber();
int MaxSize { get; }
}
}
```
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD>
```c
using LinearStruct;
namespace BankQueue
{
public class LinkBankQueue : LinkQueue<int>, IBankQueue
{
public int Callnumber { get; private set; }
public int MaxSize { get; }
public int GetCallnumber()
{
if (IsEmpty() && Callnumber == 0)
{
Callnumber = 1;
}
else
{
Callnumber++;
}
return Callnumber;
}
public LinkBankQueue()
{
MaxSize = default(int);
Callnumber = 0;
}
}
}
```
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD>
```c
using LinearStruct;
namespace BankQueue
{
public class CSeqBankQueue : CSeqQueue<int>, IBankQueue
{
public int Callnumber { get; private set; }
public CSeqBankQueue(int size) : base(size)
{
Callnumber = 0;
}
public int GetCallnumber()
{
if (IsEmpty() && Callnumber == 0)
{
Callnumber = 1;
}
else
{
Callnumber++;
}
return Callnumber;
}
}
}
```
<EFBFBD><EFBFBD><EFBFBD>񴰿<EFBFBD>
```c
using System;
using System.Threading;
namespace BankQueue
{
public class ServiceWindow
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public IBankQueue BankQ { get; set; }
//<2F>̷߳<DFB3><CCB7><EFBFBD>
public void Service()
{
while (true)
{
lock (BankQ)
{
Thread.Sleep(2000);
if (!BankQ.IsEmpty())
{
Console.WriteLine();
Console.WriteLine("<EFBFBD><EFBFBD>{0}<7D>ŵ<EFBFBD>{1}<7D>Ŵ<EFBFBD><C5B4><EFBFBD>!", BankQ.QueueFront, Thread.CurrentThread.Name);
BankQ.DeQueue();
}
}
}
}
}
}
```
<EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD>
```c
using System;
using System.Threading;
namespace BankQueue
{
class BankQueueApp
{
public static void Main(string[] args)
{
try
{
IBankQueue bankQueue = null;
Console.WriteLine("<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>1.˳<><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
string seleflag = Console.ReadLine();
switch (seleflag)
{
case "1":
Console.Write("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>п<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
int count = Convert.ToInt32(Console.ReadLine());
bankQueue = new CSeqBankQueue(count);
break;
case "2":
bankQueue = new LinkBankQueue();
break;
}
int windowcount = 3;
ServiceWindow[] serviceWindows = new ServiceWindow[windowcount];
Thread[] serviceThread = new Thread[windowcount];
for (int i = 0; i < windowcount; i++)
{
serviceWindows[i] = new ServiceWindow();
serviceWindows[i].BankQ = bankQueue;
serviceThread[i] = new Thread(serviceWindows[i].Service);
serviceThread[i].Name = (i + 1).ToString();
serviceThread[i].Start();
}
while (true)
{
Console.Write("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>");
Console.ReadLine();
if (bankQueue != null && (bankQueue.Length < bankQueue.MaxSize || seleflag == "2"))
{
int callnumber = bankQueue.GetCallnumber();
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD>{0}<7D><><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>{1}λ<><CEBB><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>",
callnumber, bankQueue.Length);
bankQueue.EnQueue(callnumber);
}
else
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>æ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ժ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
Console.WriteLine();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
```

View File

@@ -0,0 +1,553 @@
# Task05<30><35><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>ǹ<EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>е<EFBFBD>Ӱ<EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һЩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>خд<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ʫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ңɽ<EFBFBD><EFBFBD>ˮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֪<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѳɺ<EFBFBD><EFBFBD><EFBFBD>ʫ<EFBFBD><EFBFBD>;·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>Ѷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļس١<EFBFBD><EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD>ҹ<EFBFBD><EFBFBD><EFBFBD>ȼţ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źͶ<EFBFBD><EFBFBD>ӵ<EFBFBD>ʫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޶<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD>֣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>лؼң<EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŷ<EFBFBD><EFBFBD>أ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><EFBFBD>ܲ<EFBFBD><EFBFBD>˸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʫ<EFBFBD><EFBFBD>Ȼ<EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򣬼<EFBFBD><EFBFBD>ȳ<EFBFBD>ҹ<EFBFBD>صƹ¡<EFBFBD><EFBFBD>ٻؼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѷ<EFBFBD><EFBFBD><EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·;<EFBFBD><EFBFBD>ʫ<EFBFBD>Ϻͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>±ʣ<EFBFBD><EFBFBD>Ʊ<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>¿պ<EFBFBD><EFBFBD><EFBFBD>֪<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˮ<EFBFBD><EFBFBD>ɽң<EFBFBD><EFBFBD><EFBFBD>ۿݡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><EFBFBD>ɷ<EFBFBD><EFBFBD><EFBFBD>˼<EFBFBD><EFBFBD>Ϲ<EFBFBD><EFBFBD><EFBFBD>þã<EFBFBD>·;ңԶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>Ų<EFBFBD>֪<EFBFBD><EFBFBD>дʲô<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԺȾ<EFBFBD>Ҳûʲô<EFBFBD><EFBFBD><EFBFBD>¡<EFBFBD>ֻ<EFBFBD>ܺͶ<EFBFBD><EFBFBD><EFBFBD>ҹҹ<EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD>һյ<EFBFBD>µ<EFBFBD><EFBFBD>£<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϲ<EFBFBD><EFBFBD>Ĺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ֿ<EFBFBD><EFBFBD>Ե<EFBFBD><EFBFBD><EFBFBD><EFBFBD>򷴸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><EFBFBD><EFBFBD>ʫ<EFBFBD><EFBFBD>ղ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>׾<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɷ<EFBFBD>˼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˼<EFBFBD><EFBFBD><EFBFBD>ɷ<EFBFBD><EFBFBD>Ĺ<EFBFBD>ʫ<EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><EFBFBD>Ǹо<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD>
<EFBFBD><EFBFBD>Ӣ<EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵط<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD> lover Ҳ<>и<EFBFBD> over<65><72><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> friend Ҳ<>и<EFBFBD> end<6E><64><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> believe Ҳ<>и<EFBFBD> lie<69><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD><D6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>ȴ<EFBFBD><C8B4>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD><EFBFBD><EFBFBD><E2BCB8><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳû<D2B2><C3BB><EFBFBD><EFBFBD><EBB5BD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD>Ҫ<EFBFBD><EFBFBD≯̸<EFBFBD><EFBFBD>Щ<EFBFBD><EFBFBD><EFBFBD>ʻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
## 1. <20><><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
**1.1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><D8B6><EFBFBD>**
- <20><><EFBFBD><EFBFBD>string<6E><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ɵ<EFBFBD><C9B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ`S=<3D><>a0a1...an<61><6E>`<EFBFBD><EFBFBD>
- <20><><EFBFBD>а<EFBFBD><D0B0><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ij<EFBFBD><C4B3>ȡ<EFBFBD>
- <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>Ϊ<EFBFBD>մ<EFBFBD><D5B4><EFBFBD>null string<6E><67><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD>˫<EFBFBD><CBAB><EFBFBD>š<EFBFBD><C5A1><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>C#<23><>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD>`string.Empty`<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һЩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>
- <20>հ״<D5B0><D7B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ո<EFBFBD><D5B8><EFBFBD><EFBFBD>ɵĴ<C9B5><C4B4><EFBFBD>
- <20>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ɵ<EFBFBD><C9B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD>Ϊ<EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>İ<EFBFBD><C4B0><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4>Ĵ<EFBFBD><C4B4><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>֡<EFBFBD>
- <20>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>λ<EFBFBD>ã<EFBFBD><C3A3>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>һ<EFBFBD>γ<EFBFBD><CEB3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>š<EFBFBD>
```
<EFBFBD><EFBFBD><EFBFBD>
A=<3D><>this is a string<6E><67>;
B=<3D><>is<69><73>;
B<EFBFBD><EFBFBD>A<EFBFBD>е<EFBFBD>λ<EFBFBD><EFBFBD>Ϊ2<EFBFBD><EFBFBD>
```
- <20><><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҷ<EFBFBD>Ӧλ<D3A6>ַ<EFBFBD><D6B7><EFBFBD>ͬ<EFBFBD><CDAC>
**1.2 <20><><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>**
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><EFBFBD><EFBFBD>֮ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD><EFBFBD>е<EFBFBD>Ԫ<EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD>кܴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>صIJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>Ԫ<EFBFBD>أ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>Ԫ<EFBFBD>أ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǹ<EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD>λ<EFBFBD>ã<EFBFBD><EFBFBD>õ<EFBFBD>ָ<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><EFBFBD>Ȳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>
- <20><>1<EFBFBD><31><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
- <20><>2<EFBFBD><32><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
- <20><>3<EFBFBD><33><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>λ<EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD>Ӵ<EFBFBD>
- <20><>4<EFBFBD><34><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>λ<EFBFBD><CEBB><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><C8B5>Ӵ<EFBFBD>
- <20><>5<EFBFBD><35><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>λ<EFBFBD><CEBB>ȡ<EFBFBD>Ӵ<EFBFBD>
- <20><>6<EFBFBD><36><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>
- <20><>7<EFBFBD><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <20><>8<EFBFBD><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>C#<23>У<EFBFBD><D0A3>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`ToLower`תСд<EFBFBD><EFBFBD>`ToUpper`ת<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>`IndexOf`<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD>λ<EFBFBD>á<EFBFBD>`LastIndexOf`<EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD>λ<EFBFBD>á<EFBFBD>`Trim`ȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߿ո<EFBFBD><EFBFBD>ȱȽϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Щ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
![<EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>](https://img-blog.csdnimg.cn/20191223194206307.png)
## 2. <20><><EFBFBD>Ĵ洢<C4B4><E6B4A2>ʵ<EFBFBD><CAB5>
<EFBFBD><EFBFBD><EFBFBD>Ĵ洢<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD>
- ˳<><CBB3><EFBFBD><EFBFBD><E6B4A2>char<61><72><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><E9A1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>ʹ<EFBFBD><CDB4><EFBFBD>һ<EFBFBD><D2BB>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󴮳<EFBFBD><F3B4AEB3>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBB4AE><EFBFBD>ȵĽ<C8B5><C4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>`<60><>\0<><30>`<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>ս
- <20><>ʽ<EFBFBD><EFBFBD><E6B4A2>`SlinkList<char>` <20><><EFBFBD>˷Ѵ<D1B4>ռ
![˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ](https://img-blog.csdnimg.cn/20191223194433900.png)
```c
using System;
namespace LinearStruct
{
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ʵ<EFBFBD><CAB5>--˳<><CBB3><EFBFBD><EFBFBD>
/// </summary>
public class SeqString : IString
{
/// <summary>
///
/// </summary>
protected readonly char[] CStr; //<2F>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>'\0'<27><><EFBFBD><EFBFBD>
/// <summary>
/// <20><>ʼ<EFBFBD><CABC>SeqString<6E><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
/// </summary>
public SeqString()
{
CStr = new char[] {'\0'};
}
/// <summary>
/// <20><>ʼ<EFBFBD><CABC>SeqString<6E><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
/// </summary>
/// <param name="s"><3E><>ʼ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD></param>
public SeqString(string s)
{
if (s == null)
throw new ArgumentNullException();
int length = s.Length;
CStr = new char[length + 1];
for (int i = 0; i < length; i++)
CStr[i] = s[i];
CStr[length] = '\0';
}
/// <summary>
/// <20><>ʼ<EFBFBD><CABC>SeqString<6E><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>ʹ<EFBFBD><CAB9>)
/// </summary>
/// <param name="length"><3E><><EFBFBD>ij<EFBFBD><C4B3><EFBFBD></param>
protected SeqString(int length)
{
if (length < 0)
throw new ArgumentOutOfRangeException();
CStr = new char[length + 1];
CStr[length] = '\0';
}
/// <summary>
/// <20>Ҷ<EFBFBD><D2B6><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>е<EFBFBD><D0B5>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD> Unicode <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դﵽָ<EFB5BD><D6B8><EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD><DCB3>ȡ<EFBFBD>
/// </summary>
/// <param name="totalWidth"><3E><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>е<EFBFBD><D0B5>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<D4AD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD></param>
/// <param name="paddingChar">Unicode <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD></param>
/// <returns>
/// <20><>Ч<EFBFBD>ڴ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD> IString<6E><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҷ<EFBFBD><D2B6><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ôﵽ totalWidth <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF> paddingChar <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// <20><><EFBFBD><EFBFBD>totalWidth С<>ڴ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>ij<EFBFBD><C4B3>ȣ<EFBFBD><C8A3><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD> IString<6E><67>
/// </returns>
/// <remarks>
/// <20>쳣:
/// System.ArgumentOutOfRangeException:totalWidth С<><D0A1><EFBFBD>
/// </remarks>
public IString PadLeft(int totalWidth, char paddingChar)
{
if (totalWidth < 0)
throw new ArgumentOutOfRangeException();
if (Length >= totalWidth)
return Clone();
SeqString result = new SeqString(totalWidth);
int left = totalWidth - Length;
for (int i = 0; i < left; i++)
result.CStr[i] = paddingChar;
for (int i = 0; i < Length; i++)
result.CStr[i + left] = CStr[i];
return result;
}
/// <summary>
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
/// </summary>
public int Length
{
get
{
int i = 0;
while (CStr[i] != '\0')
i++;
return i;
}
}
/// <summary>
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
/// </summary>
/// <param name="index">Ҫ<><D2AA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʼ<E3BFAA><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns>ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD></returns>
public char this[int index]
{
get
{
if (index < 0 || index > Length - 1)
throw new IndexOutOfRangeException();
return CStr[index];
}
set
{
if (index < 0 || index > Length - 1)
throw new IndexOutOfRangeException();
CStr[index] = value;
}
}
/// <summary>
/// <20><>ָ<EFBFBD><D6B8>λ<EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD>Ӵ<EFBFBD>
/// </summary>
/// <param name="startIndex"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB></param>
/// <param name="s"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD></param>
/// <returns><3E><><EFBFBD><EFBFBD><EBB4AE><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>´<EFBFBD></returns>
public IString Insert(int startIndex, IString s)
{
if (s == null)
throw new ArgumentNullException();
if (startIndex < 0 || startIndex > Length)
throw new ArgumentOutOfRangeException();
SeqString str = new SeqString(s.Length + Length);
for (int i = 0; i < startIndex; i++)
str.CStr[i] = CStr[i]; //ע<><D7A2>str[i]ֱ<><D6B1>ʹ<EFBFBD><CAB9><EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0, len = s.Length; i < len; i++)
str.CStr[i + startIndex] = s[i];
for (int i = startIndex; i < Length; i++)
str.CStr[i + s.Length] = CStr[i];
return str;
}
/// <summary>
/// <20><>ָ<EFBFBD><D6B8>λ<EFBFBD><CEBB><EFBFBD>Ƴ<EFBFBD><C6B3>Ӵ<EFBFBD>
/// </summary>
/// <param name="startIndex"><3E>Ƴ<EFBFBD><C6B3><EFBFBD>λ<EFBFBD><CEBB></param>
/// <param name="count"><3E>Ƴ<EFBFBD><C6B3>ij<EFBFBD><C4B3><EFBFBD></param>
/// <returns><3E>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>´<EFBFBD></returns>
public IString Remove(int startIndex, int count)
{
if (startIndex < 0 || startIndex > Length - 1)
throw new ArgumentOutOfRangeException();
if (count < 0)
throw new ArgumentOutOfRangeException();
int left = Length - startIndex; //<2F><><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
count = (left < count) ? left : count; //ʵ<><CAB5><EFBFBD>Ƴ<EFBFBD><C6B3>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
SeqString str = new SeqString(Length - count);
for (int i = 0; i < startIndex; i++)
str.CStr[i] = CStr[i];
for (int i = startIndex + count; i < Length; i++)
str.CStr[i - count] = CStr[i];
return str;
}
/// <summary>
/// <20><>ָ<EFBFBD><D6B8>λ<EFBFBD><CEBB>ȡ<EFBFBD>Ӵ<EFBFBD>
/// </summary>
/// <param name="startIndex">ȡ<>Ӵ<EFBFBD><D3B4><EFBFBD>λ<EFBFBD><CEBB></param>
/// <param name="count"><3E>Ӵ<EFBFBD><D3B4>ij<EFBFBD><C4B3><EFBFBD></param>
/// <returns>ȡ<>õ<EFBFBD><C3B5>Ӵ<EFBFBD></returns>
public IString SubString(int startIndex, int count)
{
if (startIndex < 0 || startIndex > Length - 1)
throw new ArgumentOutOfRangeException();
if (count < 0)
throw new ArgumentOutOfRangeException();
int left = Length - startIndex; //ȡ<>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD>󳤶<EFBFBD>
count = (left < count) ? left : count; //<2F>Ӵ<EFBFBD>ʵ<EFBFBD>ʳ<EFBFBD><CAB3><EFBFBD>
SeqString str = new SeqString(count);
for (int i = 0; i < count; i++)
str.CStr[i] = CStr[i + startIndex];
return str;
}
/// <summary>
/// <20><>ǰ<EFBFBD><C7B0><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>
/// </summary>
/// <returns><3E><>ǰ<EFBFBD><C7B0><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD></returns>
public IString Clone()
{
SeqString str = new SeqString(Length);
for (int i = 0; i < Length; i++)
str.CStr[i] = CStr[i];
return str;
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="s"><3E><>β<EFBFBD><CEB2>Ҫ<EFBFBD><D2AA><EFBFBD>ӵĴ<D3B5></param>
/// <returns><3E><><EFBFBD>Ӻ<EFBFBD><D3BA>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>´<EFBFBD></returns>
public IString Concat(IString s)
{
if (s == null)
throw new ArgumentNullException();
return Insert(Length, s);
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5>
/// </summary>
/// <param name="s">Ҫƥ<D2AA><C6A5><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD></param>
/// <returns><3E>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>λ<EFBFBD><CEBB>,<2C><><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD>-1.</returns>
public int FindParam(IString s)
{
if (s == null || s.Length == 0)
throw new Exception("ƥ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>Ϊnull<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.");
for (int i = 0; i <= Length - s.Length; i++)
{
if (CStr[i] == s[0])
{
int j;
for (j = 1; j < s.Length; j++)
{
if (CStr[j + i] != s[j])
break;
}
if (j == s.Length)
return i;
}
}
return -1;
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="s1"><3E><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD></param>
/// <param name="s2"><3E>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns><3E><><EFBFBD>Ӻ<EFBFBD><D3BA>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>´<EFBFBD></returns>
public static SeqString operator +(SeqString s1, SeqString s2)
{
if (s1 == null || s2 == null)
throw new ArgumentNullException();
return s1.Concat(s2) as SeqString;
}
/// <summary>
/// SeqString<6E><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
/// </summary>
/// <returns>SeqString<6E><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD></returns>
public override string ToString()
{
string str = string.Empty;
for (int i = 0; i < Length; i++)
str += CStr[i];
return str;
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5>
/// </summary>
/// <param name="value">Ҫƥ<D2AA><C6A5><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD></param>
/// <returns><3E>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>λ<EFBFBD><CEBB>,<2C><><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD>-1.</returns>
public int IndexOf(IString value)
{
if (value == null || value.Length == 0)
throw new Exception("ƥ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>Ϊnull<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.");
return IndexOf(value, 0);
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5>
/// </summary>
/// <param name="value">Ҫƥ<D2AA><C6A5><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD></param>
/// <param name="startIndex">ƥ<><C6A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼλ<CABC><CEBB></param>
/// <returns><3E>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>λ<EFBFBD><CEBB>,<2C><><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD>-1.</returns>
public int IndexOf(IString value, int startIndex)
{
if (value == null || value.Length == 0)
throw new Exception("ƥ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>Ϊnull<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.");
if (startIndex < 0 || startIndex > value.Length - 1)
throw new ArgumentOutOfRangeException();
for (int i = startIndex; i <= Length - value.Length; i++)
{
if (CStr[i] == value[0])
{
int j;
for (j = 1; j < value.Length; j++)
{
if (CStr[j + i] != value[j])
break;
}
if (j == value.Length)
return i;
}
}
return -1;
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>е<EFBFBD>ָ<EFBFBD><D6B8> IString <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD><EFBFBD>滻Ϊ<E6BBBB><CEAA><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD> IString<6E><67>
/// </summary>
/// <param name="oldValue">Ҫ<><EFBFBD><E6BBBB> IString<6E><67></param>
/// <param name="newValue">Ҫ<>滻 oldValue <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IString<6E><67></param>
/// <returns><3E><>Ч<EFBFBD>ڴ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> oldValue <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD>滻Ϊ newValue <20><> IString<6E><67></returns>
/// <remarks>
/// <20>쳣:
/// System.ArgumentException:oldValue <20>ǿ<EFBFBD><C7BF>ַ<EFBFBD><D6B7><EFBFBD> ("")<29><>
/// </remarks>
public IString Replace(IString oldValue, IString newValue)
{
if (Length == 0)
throw new ArgumentException("oldValue<EFBFBD>ǿ<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
string str = string.Empty;
int i = 0;
while (i < Length)
{
if (CStr[i] == oldValue[0])
{
int j;
for (j = 1; j < oldValue.Length; j++)
{
if (CStr[i + j] != oldValue[j])
{
break;
}
}
if (j == oldValue.Length)
{
str += newValue;
i += oldValue.Length;
continue;
}
}
str += CStr[i];
i++;
}
return new SeqString(str);
}
/// <summary>
/// <20>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>հ<EFBFBD><D5B0>ַ<EFBFBD><D6B7><EFBFBD>β<EFBFBD><CEB2><EFBFBD>հ<EFBFBD><D5B0>ַ<EFBFBD><D6B7><EFBFBD>
/// </summary>
/// <returns><3E>ӵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD>ʼ<EFBFBD><CABC>ĩβ<C4A9>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD>пհ<D0BF><D5B0>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD></returns>
public IString Trim()
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>հ<EFBFBD><D5B0>ַ<EFBFBD><D6B7><EFBFBD>β<EFBFBD><CEB2><EFBFBD>հ<EFBFBD><D5B0>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>.
int left;
int right;
for (left = 0; left < CStr.Length - 1; left++)
{
if (CStr[left] != ' ')
break;
}
if (left == CStr.Length - 1)
return new SeqString();
for (right = CStr.Length - 2; right >= 0; right--)
{
if (CStr[right] != ' ')
break;
}
return SubString(left, right - left + 1);
}
}
}
```
## 3. <20><>ϰ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD>
**1. <20><>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>**
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ`python`<EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
```
class Solution:
"""
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>õ<EFBFBD>˼·<CBBC>ǣ<EFBFBD><C7A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ʲô<CAB2>ǻ<EFBFBD><C7BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>
<20><>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD> abcabcbb<62><62><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>ڣ<EFBFBD>Ϊ abc <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĿҪ<C4BF><D2AA><EFBFBD><EFBFBD>
<20><><EFBFBD>ٽ<EFBFBD><D9BD><EFBFBD> a<><61><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD> abca<63><61><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD><D4A3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>
<20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD>
<20><><EFBFBD><EFBFBD>ֻҪ<D6BB>Ѷ<EFBFBD><D1B6>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ߵ<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĿҪ<C4BF><D2AA><EFBFBD><EFBFBD>
һֱά<D6B1><CEAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6>У<EFBFBD><D0A3>ҳ<EFBFBD><D2B3><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
"""
def lengthOfLongestSubstring(self, s: str) -> int:
if not s:
return 0
left = 0 # <20><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
lookup = set() # <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ʼΪ<CABC>գ<EFBFBD><D5A3><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>Ҷ<EFBFBD>Ϊ<EFBFBD><CEAA>
n = len(s) # <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ܳ<EFBFBD><DCB3><EFBFBD>
max_len = 0 # <20><><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>Ӵ<EFBFBD><D3B4>ij<EFBFBD><C4B3><EFBFBD>
cur_len = 0 # <20><>ǰ<EFBFBD><C7B0><EFBFBD>ڵij<DAB5><C4B3><EFBFBD>
for i in range(n): # <20><><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2>ƶ<EFBFBD>
cur_len += 1 # <20>ƶ<EFBFBD>һ<EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3>ȼ<EFBFBD>һ
# <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>ʼ
while s[i] in lookup: # s[i]<5D><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ڵ<EFBFBD>ֵ
# <20><><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>ֵ<EFBFBD><D6B5><EFBFBD>򽫴<EFBFBD><F2BDABB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ұ<EFBFBD><D2B1>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǹö<C7B8><C3B6><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ɵļ<C9B5><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
lookup.remove(s[left]) # <20>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
left += 1 # <20><><EFBFBD><EFBFBD><EFBFBD>±<EFBFBD><C2B1><EFBFBD>һ
cur_len -= 1 # <20><><EFBFBD>ڳ<EFBFBD><DAB3>ȼ<EFBFBD>һ
# <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
if cur_len > max_len: # <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ڳ<EFBFBD><DAB3>ȴ<EFBFBD><C8B4>ڼ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>󴰿ڳ<F3B4B0BF><DAB3>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD><C2B8><EFBFBD><EFBFBD>󴰿ڳ<F3B4B0BF><DAB3><EFBFBD>
max_len = cur_len
lookup.add(s[i]) # <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD>󣬼<EFBFBD><F3A3ACBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2>ƶ<EFBFBD><C6B6>ĸ<EFBFBD><C4B8>²<EFBFBD><C2B2><EFBFBD>
return max_len
if __name__ == '__main__':
solution = Solution()
max_length = solution.lengthOfLongestSubstring("abcddsd")
print(max_length)
```
**2. <20><>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>**
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ`python`<EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
```python
class Solution:
def findSubstring(self, s, words):
from collections import Counter
if not s or not words:
return []
one_word = len(words[0])
all_len = len(words) * one_word # words<64><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ɵ<EFBFBD><C9B5>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
n = len(s)
words = Counter(words)
res = []
for i in range(0, n - all_len + 1): # <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD><E0B4B0><EFBFBD>и<EFBFBD><D0B8><EFBFBD><EFBFBD><EFBFBD>
tmp = s[i:i + all_len] # <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD> i+all_len<65><6E><EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD><EFBFBD>Ҳ<EFBFBD>
# <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
c_tmp = []
for j in range(0, all_len, one_word):
c_tmp.append(tmp[j:j + one_word])
if Counter(c_tmp) == words:
# <20>ж<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>±<EFBFBD>
res.append(i)
return res
if __name__ == '__main__':
solution = Solution()
s = "barfoothefoobarman"
words = ["foo", "bar"]
out = solution.findSubstring(s, words)
print(out)
```
**3. <20><EFBFBD>Ӵ<EFBFBD><D3B4>õ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>**
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ`python`<EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
```python
class Solution(object):
def balancedString(self, s):
"""
python<6F>
:type s: str
:rtype: int
"""
cnt = collections.Counter(s)
res = n = len(s)
i, avg = 0, n//4
for j, c in enumerate(s):
cnt[c] -= 1
while i < n and all(avg >= cnt[x] for x in 'QWER'):
res = min(res, j - i + 1)
cnt[s[i]] += 1
i += 1
return res
```

View File

@@ -0,0 +1,150 @@
## 题目
> - 题号2
> - 难度:中等
> - https://leetcode-cn.com/problems/add-two-numbers/
给出两个 <b>非空</b> 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 <b>逆序</b> 的方式存储的,并且它们的每个节点只能存储 <b>一位</b> 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
<b>示例 1</b>
```c
(2 -> 4 -> 3) + (5 -> 6 -> 4)
7 -> 0 -> 8
342 + 465 = 807
```
<b>示例 2</b>
```c
(3 -> 7) + (9 -> 2)
2 -> 0 -> 1
73 + 29 = 102
```
---
## 实现
**思路**:模仿我们小学时代学的加法运算。个位相加超过十进一,十位相加有进位则加上进位,依次类推。
<b>C# 实现</b>
- 状态:通过
- 执行用时: 144 ms, 在所有 C# 提交中击败了 97.98% 的用户
- 内存消耗: 26.7 MB, 在所有 C# 提交中击败了 5.07% 的用户
```c
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution
{
public ListNode AddTwoNumbers(ListNode l1, ListNode l2)
{
ListNode result = new ListNode(-1);
ListNode l3 = result;
int flag = 0;
while (l1 != null && l2 != null)
{
int a = l1.val;
int b = l2.val;
int c = a + b + flag;
l3.next = new ListNode(c%10);
flag = c >= 10 ? 1 : 0;
l1 = l1.next;
l2 = l2.next;
l3 = l3.next;
}
while (l1 != null)
{
int a = l1.val + flag;
l3.next = new ListNode(a%10);
flag = a >= 10 ? 1 : 0;
l1 = l1.next;
l3 = l3.next;
}
while (l2 != null)
{
int b = l2.val + flag;
l3.next = new ListNode(b%10);
flag = b >= 10 ? 1 : 0;
l2 = l2.next;
l3 = l3.next;
}
if (flag == 1)
{
l3.next = new ListNode(flag);
}
return result.next;
}
}
```
<b>Python 实现</b>
- 执行结果:通过
- 执行用时 :108 ms, 在所有 Python 提交中击败了 16.54% 的用户
- 内存消耗 :13.6 MB, 在所有 Python 提交中击败了 8.73 %的用户
```python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
result = ListNode(-1)
l3 = result
flag = 0
while l1 is not None and l2 is not None:
a = l1.val
b = l2.val
c = a + b + flag
l3.next = ListNode(c % 10)
flag = 1 if c >= 10 else 0
l1 = l1.next
l2 = l2.next
l3 = l3.next
while l1 is not None:
a = l1.val + flag
l3.next = ListNode(a % 10)
flag = 1 if a >= 10 else 0
l1 = l1.next
l3 = l3.next
while l2 is not None:
b = l2.val + flag
l3.next = ListNode(b % 10)
flag = 1 if b >= 10 else 0
l2 = l2.next
l3 = l3.next
if flag == 1:
l3.next = ListNode(flag)
return result.next
```

View File

@@ -0,0 +1,145 @@
## 题目
> - 题号4
> - 难度:困难
> - https://leetcode-cn.com/problems/median-of-two-sorted-arrays/
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
<b>示例 1</b>:
```c
nums1 = [1, 3]
nums2 = [2]
2.0
```
<b>示例 2</b>:
```c
nums1 = [1, 2]
nums2 = [3, 4]
(2 + 3)/2 = 2.5
```
---
## 实现
<b>第一种:利用二分策略</b>
中位数:用来将一个集合划分为两个长度相等的子集,其中一个子集中的元素总是大于另一个子集中的元素。
由于题目要求时间复杂度为 O(log(m + n)),所以不能从两个有序数组的首尾挨个遍历来找到中位数(复杂度 O(m + n));而是要通过二分策略,通过每次比较,能够直接按比例的刷掉一组数字,最后找到中位数(复杂度 O(log(m + n)))。
```c
nums1: [a1,a2,a3,...am]
nums2: [b1,b2,b3,...bn]
[nums1[:i],nums2[:j] | nums1[i:], nums2[j:]]
nums1 i
nums2 j = (m+n+1)/2 - i
```
只要保证左右两边 <b>个数</b> 相同,中位数就在 `|` 这个边界旁边产生,从而可以利用二分法找到合适的 i。
- 状态:通过
- 2085 / 2085 个通过测试用例
- 执行用时: 160 ms, 在所有 C# 提交中击败了 99.18% 的用户
- 内存消耗: 26.8 MB, 在所有 C# 提交中击败了 5.05% 的用户
```c
public class Solution {
public double FindMedianSortedArrays(int[] nums1, int[] nums2) {
int m = nums1.Length;
int n = nums2.Length;
if (m > n)
return FindMedianSortedArrays(nums2, nums1);
int k = (m + n + 1)/2;
int left = 0;
int right = m;
while (left < right)
{
int i = (left + right)/2;
int j = k - i;
if (nums1[i] < nums2[j - 1])
left = i + 1;
else
right = i;
}
int m1 = left;
int m2 = k - left;
int c1 = Math.Max(m1 == 0 ? int.MinValue : nums1[m1 - 1],
m2 == 0 ? int.MinValue : nums2[m2 - 1]);
if ((m + n)%2 == 1)
return c1;
int c2 = Math.Min(m1 == m ? int.MaxValue : nums1[m1],
m2 == n ? int.MaxValue : nums2[m2]);
return (c1 + c2)*0.5;
}
}
```
<b>第二种:通过合并为一个有序数组的方式</b>
思路:首先把两个有序数组合并为一个有序数组,然后根据数组长度来确定中位数,如果数组长度为偶数,那么返回两个中位数的平均值,如果数组长度为奇数,那么返回中位数。
<b>python 实现</b>
- 执行结果:通过
- 执行用时 :128 ms, 在所有 Python3 提交中击败了34.35%的用户
- 内存消耗 :12.8 MB, 在所有 Python3 提交中击败了99.43%的用户
```python
class Solution:
def findMedianSortedArrays(self, nums1, nums2):
m = len(nums1)
n = len(nums2)
nums1.extend(nums2)# 合并
nums1.sort()# 排序
if (m + n) & 1:# 如果是奇数 返回中位数
return nums1[(m + n - 1) >> 1]
else:# 返回两个中位数的平均值
return (nums1[(m + n - 1) >> 1] + nums1[(m + n) >> 1]) / 2
```
<b>C# 实现</b>
- 状态:通过
- 2085 / 2085 个通过测试用例
- 执行用时: 188 ms, 在所有 C# 提交中击败了 72.14% 的用户
- 内存消耗: 26.9 MB, 在所有 C# 提交中击败了 5.05% 的用户
```c
public class Solution {
public double FindMedianSortedArrays(int[] nums1, int[] nums2) {
int len1 = nums1.Length;
int len2 = nums2.Length;
int len = len1 + len2;
int[] nums = new int[len];
Array.Copy(nums1, nums, len1);
Array.Copy(nums2, 0, nums, len1, len2);
Array.Sort(nums);
if (len%2 == 0)
{
return (nums[len/2] + nums[len/2 - 1])*0.5;
}
return nums[len/2];
}
}
```

View File

@@ -0,0 +1,186 @@
## 题目
> - 题号5
> - 难度:中等
> - https://leetcode-cn.com/problems/longest-palindromic-substring/
给定一个字符串 s找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
<b>示例 1</b>
```c
: "babad"
: "bab"
: "aba"
```
<b>示例 2</b>
```c
: "cbbd"
: "bb"
```
<b>示例 3</b>
```c
: "a"
: "a"
```
---
## 实现
回文是一个正读和反读都相同的字符串例如“aba”是回文而“abc”不是。
<b>第一种:暴力法,列举所有的子串,判断该子串是否为回文</b>。
- 执行结果:超出时间限制
```c
public class Solution
{
public string LongestPalindrome(string s)
{
if (string.IsNullOrEmpty(s))
return string.Empty;
if (s.Length == 1)
return s;
int start = 0;
int end = 0;
int len = int.MinValue;
for (int i = 0; i < s.Length; i++)
{
for (int j = i + 1; j < s.Length; j++)
{
string str = s.Substring(i, j - i + 1);
if (isPalindrome(str) && str.Length > len)
{
len = str.Length;
start = i;
end = j;
}
}
}
return s.Substring(start, end - start + 1);
}
public bool isPalindrome(string s)
{
for (int i = 0, len = s.Length / 2; i < len; i++)
{
if (s[i] != s[s.Length - 1 - i])
return false;
}
return true;
}
}
```
<b>第二种:动态规划</b>
动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
与分治法不同的是,<u>适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)</u>。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够<u>保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间</u>。
我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。
具体的动态规划算法多种多样,但它们具有相同的<u>填表格式</u>。
使用记号 `s[l, r]` 表示原始字符串的一个子串,`l``r` 分别是区间的左右边界的索引值,使用左闭、右闭区间表示左右边界可以取到。
`dp[l, r]` 表示子串 `s[l, r]`(包括区间左右端点)是否构成回文串,是一个二维布尔型数组。
- 当子串只包含 1 个字符,它一定是回文子串;
- 当子串包含 2 个以上字符的时候:`s[l, r]` 是一个回文串,那么这个回文串两边各往里面收缩一个字符(如果可以的话)的子串 `s[l + 1, r - 1]` 也一定是回文串。
故,当 `s[l] == s[r]` 成立的时候,`dp[l, r]`的值由 `dp[l + 1, r - l]` 决定,这里还需要再多考虑一点点:“原字符串去掉左右边界”的子串的边界情况。
- 当原字符串的元素个数为 3 的时候,如果左右边界相等,那么去掉它们以后,只剩下 1 个字符,它一定是回文串,故原字符串也一定是回文串;
- 当原字符串的元素个数为 2 的时候,如果左右边界相等,那么去掉它们以后,只剩下 0 个字符,显然原字符串也一定是回文串。
综上,如果一个字符串的左右边界相等,判断为回文只需以下二者之一成立即可:
- 去掉左右边界以后的字符串不构成区间,即`s[l + 1, r - 1]`包含元素少于2个`r - l <= 2`
- 去掉左右边界以后的字符串是回文串,即`dp[l + 1, r - 1] == true`
![](https://img-blog.csdnimg.cn/20200317155934443.png)
**C# 实现**
- 状态:通过
- 103 / 103 个通过测试用例
- 执行用时: 232 ms, 在所有 C# 提交中击败了 46.79% 的用户
- 内存消耗: 40.9 MB, 在所有 C# 提交中击败了 5.43% 的用户
```c
public class Solution {
public string LongestPalindrome(string s)
{
if (string.IsNullOrEmpty(s))
return string.Empty;
int len = s.Length;
if (len == 1)
return s;
int longestPalindromelen = 1;
string longestPalindromeStr = s.Substring(0, 1);
bool[,] dp = new bool[len, len];
for (int r = 1; r < len; r++)
{
for (int l = 0; l < r; l++)
{
if (s[r] == s[l] && (r - l <= 2 || dp[l + 1, r - 1] == true))
{
dp[l, r] = true;
if (longestPalindromelen < r - l + 1)
{
longestPalindromelen = r - l + 1;
longestPalindromeStr = s.Substring(l, r - l + 1);
}
}
}
}
return longestPalindromeStr;
}
}
```
**Python 实现**
- 执行结果:通过
- 执行用时3392 ms, 在所有 Python3 提交中击败了 43.87% 的用户
- 内存消耗21.2 MB, 在所有 Python3 提交中击败了 18.81% 的用户
```python
class Solution:
def longestPalindrome(self, s: str) -> str:
count = len(s)
if count == 0 or count == 1:
return s
longestPalindromelen = 1
longestPalindromeStr = s[0:1]
dp = [[False] * count for i in range(count)]
for r in range(1, count):
for l in range(0, r):
if s[r] == s[l] and (r - l <= 2 or dp[l + 1][r - 1] == True):
dp[l][r] = True
if longestPalindromelen < r - l + 1:
longestPalindromelen = r - l + 1
longestPalindromeStr = s[l:l + longestPalindromelen]
return longestPalindromeStr
```
---
**参考文献**
- https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zhong-xin-kuo-san-dong-tai-gui-hua-by-liweiwei1419/

View File

@@ -0,0 +1,91 @@
## 题目
> - 题号7
> - 难度:简单
> - https://leetcode-cn.com/problems/reverse-integer/
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
<b>示例 1</b>:
```c
: 123
: 321
```
<b>示例 2</b>:
```c
: -123
: -321
```
<b>示例 3</b>:
```c
: 120
: 21
```
<b>示例 4</b>:
```c
: 1534236469
: 0
```
<b>示例 5</b>:
```c
: -2147483648
: 0
```
<b>注意</b>:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为`[2^31, 2^31 1]`。请根据这个假设,如果反转后整数溢出那么就返回 0。
---
## 实现
<b>第一种:通过队列的方式</b>。
把负数转换为正数,通过“队列”统一处理。
- 状态:通过
- 1032 / 1032 个通过测试用例
- 执行用时: 56 ms, 在所有 C# 提交中击败了 93.28% 的用户
- 内存消耗: 13.9 MB, 在所有 C# 提交中击败了 13.98% 的用户
```c
public class Solution {
public int Reverse(int x) {
if (x == int.MinValue)
return 0;
long result = 0;
int negative = x < 0 ? -1 : 1;
x = negative * x;
Queue<int> q = new Queue<int>();
while (x != 0)
{
q.Enqueue(x % 10);
x = x/10;
}
while (q.Count != 0)
{
result += q.Dequeue()*(long) Math.Pow(10, q.Count);
if (negative == 1 && result > int.MaxValue)
{
result = 0;
break;
}
if (negative == -1 && result*-1 < int.MinValue)
{
result = 0;
break;
}
}
return (int)result*negative;
}
}
```

View File

@@ -0,0 +1,148 @@
## 题目
> - 题号8
> - 难度:中等
> - https://leetcode-cn.com/problems/string-to-integer-atoi/
请你来实现一个 `atoi` 函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0。
<b>说明</b>
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 `[2^31, 2^31 1]`。如果数值超过这个范围,请返回 `INT_MAX (2^31 1)``INT_MIN (2^31)`
<b>示例 1</b>:
```c
: "42"
: 42
```
<b>示例 2</b>:
```c
: " -42"
: -42
: '-',
-42
```
<b>示例 3</b>:
```c
: "4193 with words"
: 4193
: '3'
```
<b>示例 4</b>:
```c
: "words and 987"
: 0
: 'w',
```
<b>示例 5</b>:
```c
: "-91283472332"
: -2147483648
: "-91283472332" 32
INT_MIN (231)
```
<b>示例 6</b>:
```c
: " 0000000000012345678"
: 12345678
```
<b>示例 7</b>:
```c
: "20000000000000000000"
: 2147483647
```
---
## 实现
**第一种:通过队列的方式**
- 状态:通过
- 1079 / 1079 个通过测试用例
- 执行用时: 104 ms, 在所有 C# 提交中击败了 98.32% 的用户
- 内存消耗: 24.3 MB, 在所有 C# 提交中击败了 24.45% 的用户
```c
public class Solution {
public int MyAtoi(string str) {
str = str.Trim();
if (string.IsNullOrEmpty(str))
return 0;
if (str[0] != '-' && str[0] != '+')
{
if (str[0] < '0' || str[0] > '9')
return 0;
}
int negative = 1;
long result = 0;
Queue<int> q = new Queue<int>();
for (int i = 0; i < str.Length; i++)
{
if (str[i] == '-' && i == 0)
{
negative = -1;
continue;
}
if (str[i] == '+' && i == 0)
{
continue;
}
if (str[i] < '0' || str[i] > '9')
{
break;
}
q.Enqueue(str[i] - '0');
}
while (q.Count != 0)
{
int i = q.Dequeue();
//去掉队列前端的零
if (i == 0 && result == 0)
continue;
// 返回超过位数的数字
if (negative == 1 && q.Count > 10)
{
return int.MaxValue;
}
if (negative == -1 && q.Count > 10)
{
return int.MinValue;
}
result += i * (long)Math.Pow(10, q.Count);
if (negative == 1 && result > int.MaxValue)
{
return int.MaxValue;
}
if (negative == -1 && result * -1 < int.MinValue)
{
return int.MinValue;
}
}
return (int)result * negative;
}
}
```

View File

@@ -0,0 +1,70 @@
## 题目
> - 题号9
> - 难度:简单
> - https://leetcode-cn.com/problems/palindrome-number/
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
<b>示例 1</b>:
```c
: 121
: true
```
<b>示例 2</b>:
```c
: -121
: false
: , -121 , 121-
```
<b>示例 3</b>:
```c
: 10
: false
: , 01
```
<b>进阶</b>:
你能不将整数转为字符串来解决这个问题吗?
---
## 实现
- 状态:通过
- 11509 / 11509 个通过测试用例
- 执行用时: 76 ms, 在所有 C# 提交中击败了 98.90% 的用户
- 内存消耗: 14.9 MB, 在所有 C# 提交中击败了 85.12% 的用户
```c
public class Solution {
public bool IsPalindrome(int x) {
if (x < 0)
return false;
int bit = 1;
while (x / bit >= 10)
{
bit = bit * 10;
}
while (x > 0)
{
int left = x % 10;
int right = x / bit;
if (left != right)
{
return false;
}
x = (x % bit) / 10;
bit = bit / 100;
}
return true;
}
```

View File

@@ -0,0 +1,106 @@
## 题目
> - 题号11
> - 难度:中等
> - https://leetcode-cn.com/problems/container-with-most-water/
给定 n 个非负整数 a1a2...an每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
<b>说明</b>:你不能倾斜容器,且 n 的值至少为 2。
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hbGl5dW4tbGMtdXBsb2FkLm9zcy1jbi1oYW5nemhvdS5hbGl5dW5jcy5jb20vYWxpeXVuLWxjLXVwbG9hZC91cGxvYWRzLzIwMTgvMDcvMjUvcXVlc3Rpb25fMTEuanBn?x-oss-process=image/format,png)
图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
<b>示例</b>:
```c
: [1,8,6,2,5,4,8,3,7]
: 49
```
---
## 实现
<b>第一种:利用暴力算法</b>
- 状态:超出时间限制
- 49 / 50 个通过测试用例
```c
public class Solution {
public int MaxArea(int[] height) {
int max = int.MinValue;
for (int i = 0; i < height.Length - 1; i++)
{
for (int j = 1; j < height.Length; j++)
{
int temp = (j - i)*Math.Min(height[i], height[j]);
if (temp > max)
{
max = temp;
}
}
}
return max;
}
}
```
<b>第二种:利用双索引的方法</b>
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9waWMubGVldGNvZGUtY24uY29tLzg4NGQ1YmNlOTU1ZThiYzA1MGY2NTUxNTQwNGEwNDI2NGYyYzFmZjgyNzYyMWFiZDcyYjgxNzA5ZmUzNzMyM2YtJUU5JTgxJThEJUU1JThFJTg2JUU3JTlBJTg0JUU2JTgzJTg1JUU1JTg2JUI1LmpwZw?x-oss-process=image/format,png)
以0-7走到1-7这一步为例解释为什么放弃0-6这一分支
```c
h(i)i条线段的高度S(ij)i条线段和第j条线段圈起来的面积
h(0) < h(7)S(07) = h(0) * 7
S(06) = min(h(0), h(6)) * 6
h(0) <= h(6)S(06) = h(0) * 6
h(0) > h(6)S(06) = h(6) * 6S(06) < h(0) * 6
S(06)S(07)
```
把每一棵子树按照同样的方法分析,很容易可以知道,双索引法走的路径包含了最大面积。
- 状态:通过
- 50 / 50 个通过测试用例
- 执行用时: 144 ms, 在所有 C# 提交中击败了 99.64% 的用户
- 内存消耗: 26.6 MB, 在所有 C# 提交中击败了 5.45% 的用户
```c
public class Solution
{
public int MaxArea(int[] height)
{
int i = 0, j = height.Length - 1;
int max = int.MinValue;
while (i < j)
{
int temp = (j - i) * Math.Min(height[i], height[j]);
if (temp > max)
{
max = temp;
}
if (height[i] < height[j])
{
i++;
}
else
{
j--;
}
}
return max;
}
}
```
参考图文:
https://leetcode-cn.com/problems/container-with-most-water/solution/zhi-guan-de-shuang-zhi-zhen-fa-jie-shi-by-na-kong/

View File

@@ -0,0 +1,101 @@
## 题目
> - 题号14
> - 难度:简单
> - https://leetcode-cn.com/problems/longest-common-prefix/
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
<b>示例 1</b>:
```c
: ["flower","flow","flight"]
: "fl"
```
<b>示例 2</b>:
```c
: ["dog","racecar","car"]
: ""
:
```
<b>说明</b>:
所有输入只包含小写字母 a-z。
---
## 实现
**C# 实现**
- 状态:通过
- 118 / 118 个通过测试用例
- 执行用时: 144 ms, 在所有 C# 提交中击败了 94.92% 的用户
- 内存消耗: 23.4 MB, 在所有 C# 提交中击败了 11.69% 的用户
```c
public class Solution {
public string LongestCommonPrefix(string[] strs)
{
if (strs.Length == 0)
return string.Empty;
string result = strs[0];
for (int i = 1; i < strs.Length; i++)
{
result = Prefix(result, strs[i]);
if (string.IsNullOrEmpty(result))
break;
}
return result;
}
public string Prefix(string str1, string str2)
{
int len1 = str1.Length;
int len2 = str2.Length;
int len = Math.Min(len1, len2);
int i = 0;
for (; i < len; i++)
{
if (str1[i] != str2[i])
break;
}
return i == 0 ? string.Empty : str1.Substring(0, i);
}
}
```
**Python 实现**
- 执行结果:通过
- 执行用时44 ms, 在所有 Python3 提交中击败了 35.93% 的用户
- 内存消耗13.6 MB, 在所有 Python3 提交中击败了 5.14% 的用户
```python
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if len(strs) == 0:
return ""
result = strs[0]
for i in range(len(strs)):
result = self.Prefix(result, strs[i])
if result == "":
break
return result
def Prefix(self, str1: str, str2: str) -> str:
len1, len2 = len(str1), len(str2)
i = 0
while i < min(len1, len2):
if str1[i] != str2[i]:
break
i += 1
return "" if i == 0 else str1[0:i]
```

View File

@@ -0,0 +1,140 @@
## 题目
> - 题号15
> - 难度:中等
> - https://leetcode-cn.com/problems/3sum/
给定一个包含`n`个整数的数组`nums`,判断`nums`中是否存在三个元素`abc`,使得`a + b + c = 0`?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
```c
nums = [-1, 0, 1, 2, -1, -4]
[
[-1, 0, 1],
[-1, -1, 2]
]
```
---
## 实现
**第一种:利用 排序 + 三索引 的方法**
为了避免三次循环,提升执行效率。首先,对`nums`进行排序。然后固定3个索引`i,l(left),r(right)``i`进行最外层循环,`l`指向`nums[i]`之后数组的最小值,`r`指向`nums[i]`之后数组的最大值。模仿快速排序的思路,如果`nums[i] > 0`就不需要继续计算了,否则计算`nums[i] + nums[l] + nums[r]`是否等于零并进行相应的处理。如果大于零,向`l`方向移动`r`指针,如果小于零,向`r`方向移动`l`索引如果等于零则加入到存储最后结果的result链表中。当然题目中要求这个三元组不可重复所以在进行的过程中加入去重就好。
**C# 实现**
- 执行结果:通过
- 执行用时348 ms, 在所有 C# 提交中击败了 99.54% 的用户
- 内存消耗35.8 MB, 在所有 C# 提交中击败了 6.63% 的用户
```c
public class Solution
{
public IList<IList<int>> ThreeSum(int[] nums)
{
IList<IList<int>> result = new List<IList<int>>();
nums = nums.OrderBy(a => a).ToArray();
int len = nums.Length;
for (int i = 0; i < len - 2; i++)
{
if (nums[i] > 0)
break; // 如果最小的数字大于0, 后面的操作已经没有意义
if (i > 0 && nums[i - 1] == nums[i])
continue; // 跳过三元组中第一个元素的重复数据
int l = i + 1;
int r = len - 1;
while (l < r)
{
int sum = nums[i] + nums[l] + nums[r];
if (sum < 0)
{
l++;
}
else if (sum > 0)
{
r--;
}
else
{
result.Add(new List<int>() {nums[i], nums[l], nums[r]});
// 跳过三元组中第二个元素的重复数据
while (l < r && nums[l] == nums[l + 1])
{
l++;
}
// 跳过三元组中第三个元素的重复数据
while (l < r && nums[r - 1] == nums[r])
{
r--;
}
l++;
r--;
}
}
}
return result;
}
}
```
**Python 实现**
- 执行结果:通过
- 执行用时660 ms, 在所有 Python3 提交中击败了 95.64% 的用户
- 内存消耗16.1 MB, 在所有 Python3 提交中击败了 75.29% 的用户
```python
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums = sorted(nums)
result = []
for i in range(0, len(nums) - 2):
# 如果最小的数字大于0, 后面的操作已经没有意义
if nums[i] > 0:
break
# 跳过三元组中第一个元素的重复数据
if i > 0 and nums[i-1] == nums[i]:
continue
# 限制nums[i]是三元组中最小的元素
l = i + 1
r = len(nums) - 1
while l < r:
sum = nums[i] + nums[l] + nums[r]
if sum < 0:
l += 1
elif sum > 0:
r -= 1
else:
result.append([nums[i], nums[l], nums[r]])
# 跳过三元组中第二个元素的重复数据
while l < r and nums[l] == nums[l+1]:
l += 1
# 跳过三元组中第三个元素的重复数据
while l < r and nums[r] == nums[r-1]:
r -= 1
l += 1
r -= 1
return result
```

View File

@@ -0,0 +1,114 @@
## 题目
> - 题号16
> - 难度:中等
> - https://leetcode-cn.com/problems/3sum-closest/
给定一个包括`n`个整数的数组`nums`和一个目标值`target`。找出`nums`中的三个整数,使得它们的和与`target`最接近。返回这三个数的和。假定每组输入只存在唯一答案。
<b>示例</b> :
```c
nums = [-121-4], target = 1.
target 2. (-1 + 2 + 1 = 2).
```
---
## 实现
<b>第一种:利用暴力算法</b>
- 状态:通过
- 125 / 125 个通过测试用例
- 执行用时: 680 ms, 在所有 C# 提交中击败了 12.07% 的用户
- 内存消耗: 23.7 MB, 在所有 C# 提交中击败了 7.41% 的用户
```c
public class Solution
{
public int ThreeSumClosest(int[] nums, int target)
{
double error = int.MaxValue;
int sum = 0;
for (int i = 0; i < nums.Length - 2; i++)
for (int j = i + 1; j < nums.Length - 1; j++)
for (int k = j + 1; k < nums.Length; k++)
{
if (Math.Abs(nums[i] + nums[j] + nums[k] - target) < error)
{
sum = nums[i] + nums[j] + nums[k];
error = Math.Abs(sum - target);
}
}
return sum;
}
}
```
<b>第二种:利用 排序 + 三索引 的方法</b>
<b>C# 实现</b>
- 状态:通过
- 125 / 125 个通过测试用例
- 执行用时: 132 ms, 在所有 C# 提交中击败了 100.00% 的用户
- 内存消耗: 24 MB, 在所有 C# 提交中击败了 5.55% 的用户
```c
public class Solution
{
public int ThreeSumClosest(int[] nums, int target)
{
nums = nums.OrderBy(a => a).ToArray();
int result = nums[0] + nums[1] + nums[2];
for (int i = 0; i < nums.Length - 2; i++)
{
int start = i + 1, end = nums.Length - 1;
while (start < end)
{
int sum = nums[start] + nums[end] + nums[i];
if (Math.Abs(target - sum) < Math.Abs(target - result))
result = sum;
if (sum > target)
end--;
else if (sum < target)
start++;
else
return result;
}
}
return result;
}
}
```
<b>Pyhton 实现</b>
- 执行结果:通过
- 执行用时124 ms, 在所有 Python3 提交中击败了 72.19% 的用户
- 内存消耗13.2 MB, 在所有 Python3 提交中击败了 22.06% 的用户
```python
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums = sorted(nums)
result = nums[0] + nums[1] + nums[2]
for i in range(0, len(nums) - 2):
start = i + 1
end = len(nums) - 1
while start < end:
sum = nums[start] + nums[end] + nums[i]
if abs(target - sum) < abs(target - result):
result = sum
if sum > target:
end -= 1
elif sum < target:
start += 1
else:
return result
return result
```

View File

@@ -0,0 +1,154 @@
## 题目
> - 题号20
> - 难度:简单
> - https://leetcode-cn.com/problems/valid-parentheses/
给定一个只包括 '('')''{''}''['']' 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
<b>示例 1</b>:
```c
: "()"
: true
```
<b>示例 2</b>:
```c
: "()[]{}"
: true
```
<b>示例 3</b>:
```c
: "(]"
: false
```
<b>示例 4</b>:
```c
: "([)]"
: false
```
<b>示例 5</b>:
```c
: "{[]}"
: true
```
<b>示例 6</b>:
```c
: ""
: true
```
<b>示例 7</b>:
```c
: "(("
: false
```
---
## 实现
**第一种:利用栈**
**思路**首先判断该字符串长度的奇偶性如果是奇数则返回false。否则利用栈先进后出的特点遇到“{”,“[”,“(”进行入栈操作,遇到“}”,“]”,“)”就与栈顶元素进行比较如果是对应括号则出栈否则返回false。
**C# 语言**
- 执行结果:通过
- 执行用时88 ms, 在所有 C# 提交中击败了 70.31% 的用户
- 内存消耗22 MB, 在所有 C# 提交中击败了 17.91% 的用户
```c
public class Solution {
public bool IsValid(string s)
{
if (string.IsNullOrEmpty(s))
return true;
int count = s.Length;
if(count%2 == 1)
return false;
Stack<char> stack = new Stack<char>();
for (int i = 0; i < count; i++)
{
char c = s[i];
if (stack.Count == 0)
{
stack.Push(c);
}
else if(c == '[' || c == '{' || c == '(')
{
stack.Push(c);
}
else if (stack.Peek() == GetPair(c))
{
stack.Pop();
}
else
{
return false;
}
}
return stack.Count == 0;
}
public static char GetPair(char c)
{
if (c == ')')
return '(';
if (c == '}')
return '{';
if (c == ']')
return '[';
return '\0';
}
}
```
**Python 语言**
- 执行结果:通过
- 执行用时40 ms, 在所有 Python3 提交中击败了 47.30% 的用户
- 内存消耗13.5 MB, 在所有 Python3 提交中击败了 5.16% 的用户
```python
class Solution:
def isValid(self, s: str) -> bool:
dic = {")": "(", "}": "{", "]": "["}
if s is None:
return True
count = len(s)
if count % 2 == 1:
return False
lst = list()
for i in range(count):
c = s[i]
if len(lst) == 0:
lst.append(c)
elif c == "[" or c == "{" or c == "(":
lst.append(c)
elif lst[-1] == dic[c]:
lst.pop()
else:
return False
return len(lst) == 0
```

View File

@@ -0,0 +1,101 @@
## 题目
> - 题号21
> - 难度:简单
> - https://leetcode-cn.com/problems/merge-two-sorted-lists/
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
**示例:**
```c
1->2->4, 1->3->4
1->1->2->3->4->4
```
---
## 实现
**C# 实现**
- 执行结果:通过
- 执行用时108 ms, 在所有 C# 提交中击败了 83.80% 的用户
- 内存消耗25.9 MB, 在所有 C# 提交中击败了 5.85% 的用户
```c
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution
{
public ListNode MergeTwoLists(ListNode l1, ListNode l2)
{
ListNode pHead = new ListNode(int.MaxValue);
ListNode temp = pHead;
while (l1 != null && l2 != null)
{
if (l1.val < l2.val)
{
temp.next = l1;
l1 = l1.next;
}
else
{
temp.next = l2;
l2 = l2.next;
}
temp = temp.next;
}
if (l1 != null)
temp.next = l1;
if (l2 != null)
temp.next = l2;
return pHead.next;
}
}
```
**Python 实现**
- 执行结果:通过
- 执行用时40 ms, 在所有 Python3 提交中击败了 68.12% 的用户
- 内存消耗13.4 MB, 在所有 Python3 提交中击败了 17.11% 的用户
```python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
pHead = ListNode(None)
temp = pHead
while(l1 and l2):
if (l1.val <= l2.val):
temp.next = l1
l1 = l1.next
else :
temp.next = l2
l2 = l2.next
temp = temp.next
if l1 is not None:
temp.next = l1
else :
temp.next = l2
return pHead.next
```

View File

@@ -0,0 +1,180 @@
## 题目
> - 题号23
> - 难度:困难
> - https://leetcode-cn.com/problems/merge-k-sorted-lists/
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
<b>示例</b>:
```c
:
[
1->4->5,
1->3->4,
2->6
]
: 1->1->2->3->4->4->5->6
```
---
## 实现
<b>第一种:两两合并的方式</b>
构造合并两个有序链表得到一个新的有序链表的方法:`ListNode MergeTwoLists(ListNode l1, ListNode l2)`。可以使用该方法合并前两个有序链表得到一个新的有序链表,之后把这个新链表与第三个有序链表合并,依次类推,最后得到合并`K`个有序列表的新列表。
- 执行结果:通过
- 执行用时256 ms, 在所有 C# 提交中击败了 36.69% 的用户
- 内存消耗29.3 MB, 在所有 C# 提交中击败了 18.37% 的用户
```c
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution
{
public ListNode MergeTwoLists(ListNode l1, ListNode l2)
{
ListNode pHead = new ListNode(int.MaxValue);
ListNode temp = pHead;
while (l1 != null && l2 != null)
{
if (l1.val < l2.val)
{
temp.next = l1;
l1 = l1.next;
}
else
{
temp.next = l2;
l2 = l2.next;
}
temp = temp.next;
}
if (l1 != null)
temp.next = l1;
if (l2 != null)
temp.next = l2;
return pHead.next;
}
public ListNode MergeKLists(ListNode[] lists) {
if (lists.Length == 0)
return null;
ListNode result = lists[0];
for (int i = 1; i < lists.Length; i++)
{
result = MergeTwoLists(result, lists[i]);
}
return result;
}
}
```
<b>第二种:选择值最小结点的方式</b>
<b>C# 语言</b>
- 执行结果:通过
- 执行用时776 ms, 在所有 C# 提交中击败了 7.10% 的用户
- 内存消耗29.2 MB, 在所有 C# 提交中击败了 22.45% 的用户
```c
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution
{
public ListNode MergeKLists(ListNode[] lists)
{
int len = lists.Length;
if (len == 0)
return null;
ListNode pHead = new ListNode(-1);
ListNode temp = pHead;
while (true)
{
int min = int.MaxValue;
int minIndex = -1;
for (int i = 0; i < len; i++)
{
if (lists[i] != null)
{
if (lists[i].val < min)
{
minIndex = i;
min = lists[i].val;
}
}
}
if (minIndex == -1)
{
break;
}
temp.next = lists[minIndex];
temp = temp.next;
lists[minIndex] = lists[minIndex].next;
}
return pHead.next;
}
}
```
<b>Python 语言</b>
- 执行结果:通过
- 执行用时7772 ms, 在所有 Python3 提交中击败了 5.02% 的用户
- 内存消耗16.5 MB, 在所有 Python3 提交中击败了 44.31% 的用户
```python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
import sys
count = len(lists)
if count == 0:
return None
pHead = ListNode(-1)
temp = pHead
while True:
minValue = sys.maxsize
minIndex = -1
for i in range(count):
if lists[i] is not None:
if lists[i].val<minValue :
minIndex = i
minValue = lists[i].val
if minIndex == -1:
break
temp.next = lists[minIndex]
temp = temp.next
lists[minIndex] = lists[minIndex].next
return pHead.next
```

View File

@@ -0,0 +1,101 @@
## 题目
> - 题号26
> - 难度:简单
> - https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/
给定一个 **排序数组**,你需要在 **原地** 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在 **原地修改输入数组** 并在使用 O(1) 额外空间的条件下完成。
<b>示例 1</b>:
```c
nums = [1,1,2],
2, nums 1, 2
```
<b>示例 2</b>:
```c
nums = [0,0,1,1,1,2,2,3,3,4],
5, nums 0, 1, 2, 3, 4
```
<b>说明</b>:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以“**引用**”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
```c
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
```
---
## 实现
**第一种:双索引法**
**思路** 就是一个快索引一个慢索引,`j``i`慢,当`nums[j] == nums[i]`时,`j++`就可以跳过重复项,不相等时,让`i++`并让`nums[i] = nums[j]`,把值复制过来继续执行到末尾即可,时间复杂度为 O(n)。
**C# 实现**
- 执行结果:通过
- 执行用时300 ms, 在所有 C# 提交中击败了 64.43% 的用户
- 内存消耗33.5 MB, 在所有 C# 提交中击败了 5.48% 的用户
```c
public class Solution
{
public int RemoveDuplicates(int[] nums)
{
if (nums.Length < 2)
return nums.Length;
int i = 0;
for (int j = 1; j < nums.Length; j++)
{
if (nums[j] != nums[i])
{
i++;
nums[i] = nums[j];
}
}
return i + 1;
}
}
```
**Python 实现**
- 执行结果:通过
- 执行用时56 ms, 在所有 Python3 提交中击败了 95.28% 的用户
- 内存消耗14.4 MB, 在所有 Python3 提交中击败了 57.13% 的用户
```python
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
if len(nums) < 2:
return 1
i, j = 0, 1
while j < len(nums):
if nums[i] != nums[j]:
i += 1
nums[i] = nums[j]
else:
j += 1
return i + 1
```

View File

@@ -0,0 +1,113 @@
## 题目
> - 题号33
> - 难度:中等
> - https://leetcode-cn.com/problems/search-in-rotated-sorted-array/
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是 O(log n) 级别。
<b>示例 1</b>:
```c
: nums = [4,5,6,7,0,1,2], target = 0
: 4
```
<b>示例 2</b>:
```c
: nums = [4,5,6,7,0,1,2], target = 3
: -1
```
<b>示例 3</b>:
```c
: nums = [5,1,3], target = 5
: 0
```
<b>示例 4</b>:
```c
: nums = [4,5,6,7,8,1,2,3], target = 8
: 0
```
<b>示例 5</b>:
```c
: nums = [3,1], target = 1
: 1
```
---
## 实现
**第一种:利用二分法**
- 状态:通过
- 196 / 196 个通过测试用例
- 执行用时: 128 ms, 在所有 C# 提交中击败了 97.17% 的用户
- 内存消耗: 23.8 MB, 在所有 C# 提交中击败了 12.00% 的用户
```c
public class Solution
{
public int Search(int[] nums, int target)
{
int i = 0, j = nums.Length - 1;
while (i <= j)
{
int mid = (i + j) / 2;
if (nums[mid] == target)
return mid;
if (nums[mid] >= nums[i])
{
//左半部分有序
if (target > nums[mid])
{
i = mid + 1;
}
else
{
if (target == nums[i])
return i;
if (target > nums[i])
j = mid - 1;
else
i = mid + 1;
}
}
else
{
if (target < nums[mid])
{
j = mid - 1;
}
else
{
if (target == nums[j])
return j;
if (target < nums[j])
i = mid + 1;
else
j = mid - 1;
}
}
}
return -1;
}
}
```

View File

@@ -0,0 +1,95 @@
## 题目
> - 题号43
> - 难度:中等
> - https://leetcode-cn.com/problems/multiply-strings/
给定两个以字符串形式表示的非负整数 num1 和 num2返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
<b>示例 1</b>:
```c
: num1 = "2", num2 = "3"
: "6"
```
<b>示例 2</b>:
```c
: num1 = "123", num2 = "456"
: "56088"
```
<b>示例 3</b>:
```c
: num1 = "498828660196", num2 = "840477629533"
: "419254329864656431168468"
```
<b>说明</b>
- num1 和 num2 的长度小于110。
- num1 和 num2 只包含数字 0-9。
- num1 和 num2 均不以零开头,除非是数字 0 本身。
- 不能使用任何标准库的大数类型(比如 BigInteger或直接将输入转换为整数来处理。
---
## 实现
- 状态:通过
- 311 / 311 个通过测试用例
- 执行用时132 ms, 在所有 C# 提交中击败了 94.74% 的用户
- 内存消耗24.1 MB, 在所有 C# 提交中击败了 31.82% 的用户
```c
public class Solution {
public string Multiply(string num1, string num2) {
if (num1 == "0" || num2 == "0")
return "0";
int len1 = num1.Length;
int len2 = num2.Length;
int len = len1 + len2;
int[] temp = new int[len];
for (int i = len2 - 1; i >= 0; i--)
{
int k = len2 - i;
int b = num2[i] - '0';
for (int j = len1 - 1; j >= 0; j--)
{
int a = num1[j] - '0';
int c = a*b;
temp[len - k] += c%10;
if (temp[len - k] >= 10)
{
temp[len - k] = temp[len - k]%10;
temp[len - k - 1]++;
}
temp[len - k - 1] += c/10;
if (temp[len - k - 1] >= 10)
{
temp[len - k - 1] = temp[len - k - 1]%10;
temp[len - k - 2]++;
}
k++;
}
}
StringBuilder sb = new StringBuilder();
int s = temp[0] == 0 ? 1 : 0;
while (s < len)
{
sb.Append(temp[s]);
s++;
}
return sb.ToString();
}
}
```

View File

@@ -0,0 +1,85 @@
## 题目
> - 题号46
> - 难度:中等
> - https://leetcode-cn.com/problems/permutations/
给定一个没有重复数字的序列,返回其所有可能的全排列。
<b>示例</b>:
```c
: [1,2,3]
:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
```
---
## 实现
<b>第一种回溯法back tracking</b> 是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
> 白话:回溯法可以理解为通过选择不同的岔路口寻找目的地,一个岔路口一个岔路口的去尝试找到目的地。如果走错了路,继续返回来找到岔路口的另一条路,直到找到目的地。
本练习的回溯过程如下所示:
![回溯过程](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9waWMubGVldGNvZGUtY24uY29tL2MyYzcyNjY4ZmYwNmNjNTM0M2JjZWY0N2Y1MzQxMTI5ZjUxMTU1ZGQ3ZTMyNGZkMDIwYjMxMmU5YmFhMjkwM2MtbmV3SU1HLmpwZw?x-oss-process=image/format,png)
- 状态:通过
- 25 / 25 个通过测试用例
- 执行用时: 364 ms, 在所有 C# 提交中击败了 80.00% 的用户
- 内存消耗: 30.6 MB, 在所有 C# 提交中击败了 7.14% 的用户
```c
public class Solution
{
private IList<IList<int>> _result;
private bool[] _used;
public IList<IList<int>> Permute(int[] nums)
{
_result = new List<IList<int>>();
if (nums == null || nums.Length == 0)
return _result;
_used = new bool[nums.Length];
FindPath(nums, 0, new List<int>());
return _result;
}
public void FindPath(int[] nums, int count, List<int> path)
{
if (count == nums.Length)
{
//递归终止条件
List<int> item = new List<int>();
item.AddRange(path);
//加入拷贝
_result.Add(item);
return;
}
for (int i = 0; i < nums.Length; i++)
{
if (_used[i] == false)
{
path.Add(nums[i]);
_used[i] = true;
FindPath(nums, count + 1, path);
path.RemoveAt(path.Count - 1);
_used[i] = false;
}
}
}
}
```

View File

@@ -0,0 +1,111 @@
## 题目
> - 题号53
> - 难度:简单
> - https://leetcode-cn.com/problems/maximum-subarray/
给定一个整数数组 nums找到一个具有最大和的连续子数组子数组最少包含一个元素返回其最大和。
<b>示例 1</b>:
```c
: [-2,1,-3,4,-1,2,1,-5,4],
: 6
: [4,-1,2,1] 6
```
<b>示例 2</b>:
```c
: [-2,1],
: 1
```
<b>进阶</b>:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
---
## 实现
<b>第一种:利用暴力算法</b>
- 状态:通过
- 202 / 202 个通过测试用例
- 执行用时: 596 ms, 在所有 C# 提交中击败了 14.18% 的用户
- 内存消耗: 24.5 MB, 在所有 C# 提交中击败了 5.88% 的用户
```c
public class Solution {
public int MaxSubArray(int[] nums) {
int len = nums.Length;
if (len == 0)
return 0;
if (len == 1)
return nums[0];
int max = int.MinValue;
for (int i = 0; i < len; i++)
{
int sum = nums[i];
if (sum > max)
{
max = sum;
}
for (int j = i + 1; j < len; j++)
{
sum += nums[j];
if (sum > max)
{
max = sum;
}
}
}
return max;
}
}
```
<b>第二种:利用动态规划</b>
动态规划的最优子结构如下:
```c
max[i] = Max(max[i-1] + nums[i], nums[i])
```
- 状态:通过
- 202 / 202 个通过测试用例
- 执行用时: 136 ms, 在所有 C# 提交中击败了 91.85% 的用户
- 内存消耗: 24.4 MB, 在所有 C# 提交中击败了 5.88% 的用户
```c
public class Solution {
public int MaxSubArray(int[] nums) {
int len = nums.Length;
if (len == 0)
return 0;
if (len == 1)
return nums[0];
int[] max = new int[len];
max[0] = nums[0];
int result = max[0];
for (int i = 1; i < len; i++)
{
if (max[i - 1] + nums[i] > nums[i])
{
max[i] = max[i - 1] + nums[i];
}
else
{
max[i] = nums[i];
}
if (max[i] > result)
{
result = max[i];
}
}
return result;
}
}
```

View File

@@ -0,0 +1,144 @@
## 题目
> - 题号54
> - 难度:中等
> - https://leetcode-cn.com/problems/spiral-matrix/
给定一个包含 m x n 个元素的矩阵m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
<b>示例 1</b>:
```c
:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
: [1,2,3,6,9,8,7,4,5]
```
<b>示例 2</b>:
```c
:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
: [1,2,3,4,8,12,11,10,9,5,6,7]
```
<b>示例 3</b>:
```c
:
[
[1]
]
: [1]
```
<b>示例 4</b>:
```c
:
[
[2, 3, 4],
[5, 6, 7],
[8, 9, 10],
[11, 12, 13]
]
: [2,3,4,7,10,13,12,11,8,5,6,9]
```
---
## 实现
- 状态:通过
- 22 / 22 个通过测试用例
- 执行用时: 348 ms, 在所有 C# 提交中击败了 85.53% 的用户
- 内存消耗: 28.9 MB, 在所有 C# 提交中击败了 5.26% 的用户
```c
public class Solution
{
public IList<int> SpiralOrder(int[][] matrix)
{
IList<int> result = new List<int>();
if (matrix == null || matrix.Length == 0)
return result;
int start = 0;
int end1 = matrix[start].Length - 1 - start;
int end2 = matrix.Length - 1 - start;
// 只有横着的情况
if (start == end2)
{
LeftToRight(start, end1, start, matrix, result);
return result;
}
//只有竖着的情况
if (start == end1)
{
TopToBottom(start, end2, start, matrix, result);
return result;
}
while (start < end1 && start < end2)
{
LeftToRight(start, end1, start, matrix, result);
TopToBottom(start + 1, end2, end1, matrix, result);
RightToLeft(end1 - 1, start, end2, matrix, result);
BottomToTop(end2 - 1, start + 1, start, matrix, result);
start++;
end1 = matrix[start].Length - 1 - start;
end2 = matrix.Length - 1 - start;
}
// 只剩下横着的情况
if (start == end2)
{
LeftToRight(start, end1, start, matrix, result);
}
else if (start == end1)
{
//只剩下竖着的情况
TopToBottom(start, end2, start, matrix, result);
}
return result;
}
private void LeftToRight(int start, int end, int rowIndex, int[][] matrix, IList<int> lst)
{
for (int i = start; i <= end; i++)
{
lst.Add(matrix[rowIndex][i]);
}
}
private void TopToBottom(int start, int end, int colIndex, int[][] matrix, IList<int> lst)
{
for (int i = start; i <= end; i++)
{
lst.Add(matrix[i][colIndex]);
}
}
private void RightToLeft(int start, int end, int rowIndex, int[][] matrix, IList<int> lst)
{
for (int i = start; i >= end; i--)
{
lst.Add(matrix[rowIndex][i]);
}
}
private void BottomToTop(int start, int end, int colIndex, int[][] matrix, IList<int> lst)
{
for (int i = start; i >= end; i--)
{
lst.Add(matrix[i][colIndex]);
}
}
}
```

View File

@@ -0,0 +1,105 @@
## 题目
> - 题号59
> - 难度:中等
> - https://leetcode-cn.com/problems/spiral-matrix-ii/
给定一个正整数 n生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
<b>示例</b>:
```c
: 3
:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
```
---
## 实现
- 状态:通过
- 20 / 20 个通过测试用例
- 执行用时: 296 ms, 在所有 C# 提交中击败了 97.67% 的用户
- 内存消耗: 25 MB, 在所有 C# 提交中击败了 11.11% 的用户
```c
public class Solution
{
public int[][] GenerateMatrix(int n)
{
int[][] matrix = new int[n][];
for (int i = 0; i < n; i++)
{
matrix[i] = new int[n];
}
int start = 0;//起始位置
int end1 = n - 1;//最左边位置
int end2 = n - 1;//最下边位置
int count = 1;
while (start < end1 && start < end2)
{
LeftToRight(start, end1, start, matrix, ref count);
TopToBottom(start + 1, end2, end1, matrix, ref count);
RightToLeft(end1 - 1, start, end2, matrix, ref count);
BottomToTop(end2 - 1, start + 1, start, matrix, ref count);
start++;
end1 = n - 1 - start;
end2 = n - 1 - start;
}
if (n%2 == 1)
{
matrix[start][start] = count;
}
return matrix;
}
private void LeftToRight(int start, int end, int rowIndex, int[][] matrix, ref int from)
{
for (int i = start; i <= end; i++)
{
matrix[rowIndex][i] = from;
from++;
}
}
private void TopToBottom(int start, int end, int colIndex, int[][] matrix, ref int from)
{
for (int i = start; i <= end; i++)
{
matrix[i][colIndex] = from;
from++;
}
}
private void RightToLeft(int start, int end, int rowIndex, int[][] matrix, ref int from)
{
for (int i = start; i >= end; i--)
{
matrix[rowIndex][i] = from;
from++;
}
}
private void BottomToTop(int start, int end, int colIndex, int[][] matrix, ref int from)
{
for (int i = start; i >= end; i--)
{
matrix[i][colIndex] = from;
from++;
}
}
}
```

View File

@@ -0,0 +1,97 @@
## 题目
> - 题号61
> - 难度:中等
> - https://leetcode-cn.com/problems/rotate-list/
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
**示例 1:**
```c
: 1->2->3->4->5->NULL, k = 2
: 4->5->1->2->3->NULL
:
1 : 5->1->2->3->4->NULL
2 : 4->5->1->2->3->NULL
```
**示例 2:**
```c
: 0->1->2->NULL, k = 4
: 2->0->1->NULL
:
1 : 2->0->1->NULL
2 : 1->2->0->NULL
3 : 0->1->2->NULL
4 : 2->0->1->NULL
```
---
## 实现
- 执行结果:通过
- 执行用时100 ms, 在所有 C# 提交中击败了 98.13% 的用户
- 内存消耗25.1 MB, 在所有 C# 提交中击败了 100.00% 的用户
```c
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution
{
public ListNode RotateRight(ListNode head, int k)
{
if (head == null || k == 0)
return head;
int len = GetLength(head);
int index = len - k%len;
if (index == len)
return head;
ListNode temp1 = head;
ListNode temp2 = head;
for (int i = 0; i < index - 1; i++)
{
temp1 = temp1.next;
}
head = temp1.next;
temp1.next = null;
temp1 = head;
while (temp1.next != null)
{
temp1 = temp1.next;
}
temp1.next = temp2;
return head;
}
public int GetLength(ListNode head)
{
ListNode temp = head;
int i = 0;
while (temp != null)
{
i++;
temp = temp.next;
}
return i;
}
}
```

View File

@@ -0,0 +1,129 @@
## 题目
> - 题号62
> - 难度:中等
> - https://leetcode-cn.com/problems/unique-paths/
一个机器人位于一个 m x n 网格的左上角 起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角在下图中标记为“Finish”
问总共有多少条不同的路径?
![问题](https://img-blog.csdnimg.cn/20190912160514978.png)
例如上图是一个7 x 3 的网格。有多少可能的路径?
<b>说明</b>m 和 n 的值均不超过 100。
<b>示例 1</b>:
```c
: m = 3, n = 2
: 3
:
3
1. -> ->
2. -> ->
3. -> ->
```
<b>示例 2</b>:
```c
: m = 7, n = 3
: 28
```
<b>示例 3</b>:
```c
: m = 23, n = 12
: 193536720
```
---
## 实现
<b>第一种:利用递归</b>
```c
public class Solution
{
private int _m;
private int _n;
public int UniquePaths(int m, int n)
{
_m = m;
_n = n;
int count = 0;
RecordPaths(0, 0, ref count);
return count;
}
private void RecordPaths(int i, int j, ref int count)
{
if (i == _m - 1 && j == _n - 1)
{
count++;
return;
}
if (i < _m)
{
RecordPaths(i + 1, j, ref count);
}
if (j < _n)
{
RecordPaths(i, j + 1, ref count);
}
}
}
```
使用递归的方式,容易理解但会耗费大量的时间,所以在运行 示例3 的时候,超时了。
<b>第二种:利用动态规划</b>
动态规划表格01
![表01](https://img-blog.csdnimg.cn/20190912160347481.png)
动态规划表格02
![表02](https://img-blog.csdnimg.cn/20190912160424714.png)
动态规划的最优子结构为:`d[i,j] = d[i-1,j] + d[i,j-1]`
- 状态:通过
- 62 / 62 个通过测试用例
- 执行用时: 52 ms, 在所有 C# 提交中击败了 93.18% 的用户
- 内存消耗: 13.6 MB, 在所有 C# 提交中击败了 17.65% 的用户
```c
public class Solution
{
public int UniquePaths(int m, int n)
{
int[,] memo = new int[m, n];
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (i == 0)
{
memo[i, j] = 1;
}
else if (j == 0)
{
memo[i, j] = 1;
}
else
{
memo[i, j] = memo[i - 1, j] + memo[i, j - 1];
}
}
}
return memo[m - 1, n - 1];
}
}
```

View File

@@ -0,0 +1,93 @@
## 题目
> - 题号70
> - 难度:简单
> - https://leetcode-cn.com/problems/climbing-stairs/
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
<b>注意</b>:给定 n 是一个正整数。
<b>示例 1</b>
```c
2
2
1. 1 + 1
2. 2
```
<b>示例 2</b>
```c
3
3
1. 1 + 1 + 1
2. 1 + 2
3. 2 + 1
```
<b>示例 3</b>
```c
44
1134903170
```
---
## 实现
分析这个题目:
- 1 阶f(1) = 1 种方案
- 2 阶f(2) = 2 种方案
- 3 阶f(3) = 3 种方案
- 4 阶f(4) = 5 种方案
- ……
- n 阶f(n) = f(n-1) + f(n-2) 种方案
即,该问题可以转换为斐波那契数列问题。
<b>第一种:利用递归</b>
```c
public class Solution {
public int ClimbStairs(int n) {
if (n <= 2)
return n;
return ClimbStairs(n - 1) + ClimbStairs(n - 2);
}
}
```
由于递归的执行速度,远远小于循环,导致“超出时间限制”。
<b>第二种:利用循环</b>
- 状态:通过
- 45 / 45 个通过测试用例
- 执行用时: 52 ms, 在所有 C# 提交中击败了 97.87% 的用户
- 内存消耗: 13.7 MB, 在所有 C# 提交中击败了 5.98% 的用户
```c
public class Solution {
public int ClimbStairs(int n) {
if (n <= 2)
return n;
int first = 1;
int second = 2;
int result = 0;
for (int i = 3; i <= n; i++)
{
result = first + second;
first = second;
second = result;
}
return result;
}
}
```

View File

@@ -0,0 +1,176 @@
## 题目
> - 题号78
> - 难度:中等
> - https://leetcode-cn.com/problems/subsets/
给定一组**不含重复元素**的整数数组 nums返回该数组所有可能的子集幂集
<b>说明</b>:解集不能包含重复的子集。
<b>示例</b>:
```c
: nums = [1,2,3]
:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
```
---
## 实现
**第一种:回溯法**
依次以nums[i]为启始点进行搜索,且后续搜索数值都要大于前一个数值,这样会避免重复搜索。
![回溯过程](https://img-blog.csdnimg.cn/20190913152245222.png)
- 状态:通过
- 10 / 10 个通过测试用例
- 行用时: 356 ms, 在所有 C# 提交中击败了 92.31% 的用户
- 内存消耗: 29.2 MB, 在所有 C# 提交中击败了 6.67% 的用户
```c
public class Solution
{
private IList<IList<int>> _result;
public IList<IList<int>> Subsets(int[] nums)
{
_result = new List<IList<int>>();
int len = nums.Length;
if (len == 0)
{
return _result;
}
IList<int> item = new List<int>();
Find(nums, 0, item);
return _result;
}
private void Find(int[] nums, int begin, IList<int> item)
{
// 注意:这里要 new 一下
_result.Add(new List<int>(item));
if (begin == nums.Length)
return;
for (int i = begin; i < nums.Length; i++)
{
item.Add(nums[i]);
Find(nums, i + 1, item);
// 组合问题,状态在递归完成后要重置
item.RemoveAt(item.Count - 1);
}
}
}
```
**第二种:子集扩展法**
- 状态:通过
- 10 / 10 个通过测试用例
- 执行用时: 352 ms, 在所有 C# 提交中击败了 94.51% 的用户
- 内存消耗: 29.2 MB, 在所有 C# 提交中击败了 6.67% 的用户
```c
public class Solution
{
public IList<IList<int>> Subsets(int[] nums)
{
IList<IList<int>> result = new List<IList<int>>();
IList<int> item = new List<int>();
result.Add(item);
for (int i = 0; i < nums.Length; i++)
{
for (int j = 0, len = result.Count; j < len; j++)
{
item = new List<int>(result[j]);
item.Add(nums[i]);
result.Add(item);
}
}
return result;
}
}
```
**第三种:位运算**
**思路:** 利用整数集合的思路。
`{1,2,3}`为例,三个数,共`2^3`个子集。
```c
000 -> []
100 -> [1]
101 -> [1,3]
110 -> [1,2]
111 -> [1,2,3]
...
```
**C# 语言**
- 状态:通过
- 10 / 10 个通过测试用例
- 执行用时: 348 ms, 在所有 C# 提交中击败了 97.80% 的用户
- 内存消耗: 29.5 MB, 在所有 C# 提交中击败了 6.67% 的用户
```c
public class Solution
{
public IList<IList<int>> Subsets(int[] nums)
{
IList<IList<int>> result = new List<IList<int>>();
int count = nums.Length;
for (int i = 0; i < 1 << count; i++)
{
IList<int> item = new List<int>();
for (int j = 0; j < count; j++)
{
int mask = 1 << j;
if ((mask & i) != 0)
item.Add(nums[j]);
}
result.Add(item);
}
return result;
}
}
```
**Python 语言**
- 执行结果:通过
- 执行用时40 ms, 在所有 Python3 提交中击败了 63.08% 的用户
- 内存消耗13.8 MB, 在所有 Python3 提交中击败了 5.72% 的用户
```python
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
count = len(nums)
result = []
for i in range(1 << count):
item = []
for j in range(count):
mask = 1 << j
if (mask & i) != 0:
item.append(nums[j])
result.append(item)
return result
```

View File

@@ -0,0 +1,59 @@
## 题目
> - 题号88
> - 难度:简单
> - https://leetcode-cn.com/problems/merge-sorted-array/
给定两个有序整数数组 nums1 和 nums2将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
<b>说明</b>:
- 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
- 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n来保存 nums2 中的元素。
<b>示例</b>:
```c
:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
: [1,2,2,3,5,6]
```
---
## 实现
- 状态:通过
- 59 / 59 个通过测试用例
- 执行用时: 348 ms, 在所有 C# 提交中击败了 93.33% 的用户
- 内存消耗: 29.2 MB, 在所有 C# 提交中击败了 6.43% 的用户
```c
public class Solution
{
public void Merge(int[] nums1, int m, int[] nums2, int n)
{
int j = 0;
for (int i = 0; i < n; i++)
{
int num2 = nums2[i];
while (num2 > nums1[j] && j < m)
{
j++;
}
int k = m;
while (k > j)
{
nums1[k] = nums1[k - 1];
k--;
}
m++;
nums1[j] = num2;
}
}
}
```

View File

@@ -0,0 +1,71 @@
## 题目
> - 题号89
> - 难度:中等
> - https://leetcode-cn.com/problems/gray-code/
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。
给定一个代表编码总位数的非负整数 n打印其格雷编码序列。格雷编码序列必须以 0 开头。
<b>示例 1</b>:
```c
: 2
: [0,1,3,2]
:
00 - 0
01 - 1
11 - 3
10 - 2
n
[0,2,3,1]
00 - 0
10 - 2
11 - 3
01 - 1
```
<b>示例 2</b>:
```c
: 0
: [0]
: 0
n 2^n
n = 0 2^0 = 1
n = 0 [0]
```
---
## 实现
![雷格码](https://img-blog.csdnimg.cn/20190915115931873.png)
由 n 位推导 n+1 位结果时n+1 位结果包含 n 位结果,同时包含 n 位结果中在高位再增加一个位 1 所形成的令一半结果,但是这一半结果需要与前一半结果镜像排列。
- 状态:通过
- 12 / 12 个通过测试用例
- 执行用时: 296 ms, 在所有 C# 提交中击败了 95.83% 的用户
- 内存消耗: 24.8 MB, 在所有 C# 提交中击败了 16.67% 的用户
```c
public class Solution
{
public IList<int> GrayCode(int n)
{
IList<int> lst = new List<int>();
lst.Add(0);
for (int i = 1; i <= n; i++)
{
for (int j = lst.Count - 1; j >= 0; j--)
{
int item = lst[j] + (1 << i - 1);
lst.Add(item);
}
}
return lst;
}
}
```

View File

@@ -0,0 +1,147 @@
## 题目
> - 题号104
> - 难度:简单
> - https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
**示例**
给定二叉树 [3,9,20,null,null,15,7]
```c
3
/ \
9 20
/ \
15 7
```
返回它的最大深度 3 。
---
## 实现
**第一种:利用队列实现层次遍历的思路**
- 执行结果:通过
- 执行用时108 ms, 在所有 C# 提交中击败了 88.13% 的用户
- 内存消耗25.5 MB, 在所有 C# 提交中击败了 5.97% 的用户
```c
/**
* Definition for a binary tree node.
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int x) { val = x; }
* }
*/
public class Solution
{
public int MaxDepth(TreeNode root)
{
if (root == null)
return 0;
Queue<TreeNode> q = new Queue<TreeNode>();
int deep = 0;
q.Enqueue(root);
while (q.Count != 0)
{
deep++;
int count = 0;
int size = q.Count;
while (count < size)
{
TreeNode node = q.Dequeue();
count++;
if (node.left != null)
q.Enqueue(node.left);
if (node.right != null)
q.Enqueue(node.right);
}
}
return deep;
}
}
```
**第二种:利用递归**
**思路**:递归分别求左右子树的最大深度,并加到原有层数上,最后返回两者中的最大值。
**C# 实现**
- 执行结果:通过
- 执行用时132 ms, 在所有 C# 提交中击败了 16.62% 的用户
- 内存消耗25.5 MB, 在所有 C# 提交中击败了 6.06% 的用户
```c
/**
* Definition for a binary tree node.
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int x) { val = x; }
* }
*/
public class Solution
{
public int MaxDepth(TreeNode root)
{
if (root == null)
return 0;
int llen = 1;
int rlen = 1;
if (root.left != null)
{
llen += MaxDepth(root.left);
}
if (root.right != null)
{
rlen += MaxDepth(root.right);
}
return llen > rlen ? llen : rlen;
}
}
```
**Python 实现**
- 执行结果:通过
- 执行用时40 ms, 在所有 Python3 提交中击败了 93.87% 的用户
- 内存消耗14.9 MB, 在所有 Python3 提交中击败了 10.18% 的用户
```python
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def maxDepth(self, root: TreeNode) -> int:
if root is None:
return 0
llen, rlen = 1, 1
if root.left is not None:
llen += self.maxDepth(root.left)
if root.right is not None:
rlen += self.maxDepth(root.right)
return max(llen, rlen)
```

View File

@@ -0,0 +1,87 @@
## 题目
> - 题号121
> - 难度:简单
> - https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
注意你不能在买入股票前卖出股票。
<b>示例 1</b>:
```c
: [7,1,5,3,6,4]
: 5
: 2 = 1 5 = 6 = 6-1 = 5
7-1 = 6,
```
<b>示例 2</b>:
```c
: [7,6,4,3,1]
: 0
: , , 0
```
---
## 实现
**C# 实现**
- 状态:通过
- 200 / 200 个通过测试用例
- 执行用时: 132 ms, 在所有 C# 提交中击败了 97.33% 的用户
- 内存消耗: 24 MB, 在所有 C# 提交中击败了 5.62% 的用户
```c
public class Solution
{
public int MaxProfit(int[] prices)
{
if (prices.Length <= 1)
return 0;
int min = prices[0];
int max = 0;
for (int i = 1; i < prices.Length; i++)
{
if (prices[i] < min)
{
min = prices[i];
}
int earn = prices[i] - min;
if (earn > max)
{
max = earn;
}
}
return max;
}
}
```
**Python 实现**
- 执行结果:通过
- 执行用时56 ms, 在所有 Python3 提交中击败了 64.24% 的用户
- 内存消耗14.7 MB, 在所有 Python3 提交中击败了 11.35% 的用户
```python
class Solution:
def maxProfit(self, prices: List[int]) -> int:
if len(prices) <= 1:
return 0
min = prices[0]
max = 0
for i in range(1, len(prices)):
if prices[i] < min:
min = prices[i]
earn = prices[i] - min
if earn > max:
max = earn
return max
```

View File

@@ -0,0 +1,88 @@
## 题目
> - 题号122
> - 难度:简单
> - https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
<b>注意</b>:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
<b>示例 1</b>:
```c
: [7,1,5,3,6,4]
: 7
:
2 = 1 3 = 5, = 5-1 = 4
4 = 3 5 = 6, = 6-3 = 3
```
<b>示例 2</b>:
```c
: [1,2,3,4,5]
: 4
:
1 = 1 5 = 5, = 5-1 = 4
1 2
```
<b>示例 3</b>:
```c
: [7,6,4,3,1]
: 0
: , , 0
```
---
## 实现
**第一种:贪心算法**
贪心策略:只要后一天价格比前一天高,就在前一天买进后一天卖出。
![有升有降的情况](https://img-blog.csdnimg.cn/20190914100650406.png)
![连续上升的情况](https://img-blog.csdnimg.cn/20200325110545912.png)
**C# 实现**
- 状态:通过
- 201 / 201 个通过测试用例
- 执行用时: 140 ms, 在所有 C# 提交中击败了 72.02% 的用户
- 内存消耗: 24.2 MB, 在所有 C# 提交中击败了 5.36% 的用户
```c
public class Solution
{
public int MaxProfit(int[] prices)
{
int earn = 0;
for (int i = 0; i < prices.Length-1; i++)
{
earn += Math.Max(prices[i + 1] - prices[i], 0);
}
return earn;
}
}
```
**Python 实现**
- 执行结果:通过
- 执行用时40 ms, 在所有 Python3 提交中击败了 92.58% 的用户
- 内存消耗14.7 MB, 在所有 Python3 提交中击败了 9.98% 的用户
```python
class Solution:
def maxProfit(self, prices: List[int]) -> int:
earn = 0
for i in range(0, len(prices) - 1):
earn += max(prices[i + 1] - prices[i], 0)
return earn
```

View File

@@ -0,0 +1,97 @@
## 题目
> - 题号124
> - 难度:困难
> - https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径<b>至少包含一个节点</b>,且不一定经过根节点。
<b>示例 1</b>:
```c
: [1,2,3]
1
/ \
2 3
: 6
```
<b>示例 2</b>:
```c
: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
: 42
```
---
## 实现
对于任意一个节点, 如果最大和路径包含该节点, 那么只可能是两种情况:
- 其左右子树中所构成的和路径值较大的那个加上该节点的值后向父节点回溯构成最大路径。
- 左右子树都在最大路径中, 加上该节点的值构成了最终的最大路径。
```c
8
/ \
-3 7
/ \
1 4
```
考虑左子树 -3 的路径的时候,我们有左子树 1 和右子树 4 的选择,但我们不能同时选择。
如果同时选了,路径就是 ... -> 1 -> -3 -> 4 就无法通过根节点 8 了。
所以我们只能去求左子树能返回的最大值,右子树能返回的最大值,选一个较大的。
- 状态:通过
- 93 / 93 个通过测试用例
- 执行用时: 152 ms, 在所有 C# 提交中击败了 86.96% 的用户
- 内存消耗: 29.7 MB, 在所有 C# 提交中击败了 37.50% 的用户
```c
/**
* Definition for a binary tree node.
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int x) { val = x; }
* }
*/
public class Solution
{
private int _max = int.MinValue;
public int MaxPathSum(TreeNode root)
{
MaxPath(root);
return _max;
}
private int MaxPath(TreeNode current)
{
if (current == null)
return 0;
// 如果子树路径和为负则应当置0表示最大路径不包含子树
int left = Math.Max(MaxPath(current.left), 0);
int right = Math.Max(MaxPath(current.right), 0);
// 判断在该节点包含左右子树的路径和是否大于当前最大路径和
_max = Math.Max(_max, current.val + left + right);
return current.val + Math.Max(left, right);
}
}
```

View File

@@ -0,0 +1,129 @@
## 题目
> - 题号136
> - 难度:简单
> - https://leetcode-cn.com/problems/single-number/
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
<b>说明</b>
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
<b>示例 1</b>:
```c
: [2,2,1]
: 1
```
<b>示例 2</b>:
```c
: [4,1,2,1,2]
: 4
```
---
## 实现
**第一种:通过集合的方法**
**C# 语言**
- 状态:通过
- 16 / 16 个通过测试用例
- 执行用时: 136 ms, 在所有 C# 提交中击败了 98.86% 的用户
- 内存消耗: 26.4 MB, 在所有 C# 提交中击败了 5.34% 的用户
```c
public class Solution
{
public int SingleNumber(int[] nums)
{
HashSet<int> h = new HashSet<int>();
for (int i = 0; i < nums.Length; i++)
{
if (h.Contains(nums[i]))
{
h.Remove(nums[i]);
}
else
{
h.Add(nums[i]);
}
}
return h.ElementAt(0);
}
}
```
**Python 语言**
- 执行结果:通过
- 执行用时60 ms, 在所有 Python3 提交中击败了 55.88% 的用户
- 内存消耗15.6 MB, 在所有 Python3 提交中击败了 5.26% 的用户
```python
class Solution:
def singleNumber(self, nums: List[int]) -> int:
h = set()
for num in nums:
if num in h:
h.remove(num)
else:
h.add(num)
return list(h)[0]
```
**第二种:利用位运算的方法。**
```c
A: 00 00 11 00
B: 00 00 01 11
A^B: 00 00 10 11
B^A: 00 00 10 11
A^A: 00 00 00 00
A^0: 00 00 11 00
A^B^A: = A^A^B = B = 00 00 01 11
```
"异或"操作满足交换律和结合律。
**C# 实现**
- 状态:通过
- 16 / 16 个通过测试用例
- 执行用时: 144 ms, 在所有 C# 提交中击败了 91.76% 的用户
- 内存消耗: 25.4 MB, 在所有 C# 提交中击败了 11.39% 的用户
```c
public class Solution
{
public int SingleNumber(int[] nums)
{
int result = 0;
for (int i = 0; i < nums.Length; i++)
{
result ^= nums[i];
}
return result;
}
}
```
**Python 实现**
- 执行结果:通过
- 执行用时44 ms, 在所有 Python3 提交中击败了 84.17% 的用户
- 内存消耗15.3 MB, 在所有 Python3 提交中击败了 5.26% 的用户
```python
class Solution:
def singleNumber(self, nums: List[int]) -> int:
result = 0
for item in nums:
result ^= item
return result
```

View File

@@ -0,0 +1,189 @@
## 题目
> - 题号141
> - 难度:简单
> - https://leetcode-cn.com/problems/linked-list-cycle/
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数`pos` 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果`pos`是 -1则在该链表中没有环。
<b>示例 1</b>
```c
head = [3,2,0,-4], pos = 1
true
```
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hc3NldHMubGVldGNvZGUtY24uY29tL2FsaXl1bi1sYy11cGxvYWQvdXBsb2Fkcy8yMDE4LzEyLzA3L2NpcmN1bGFybGlua2VkbGlzdC5wbmc)
<b>示例 2</b>
```c
head = [1,2], pos = 0
true
```
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hc3NldHMubGVldGNvZGUtY24uY29tL2FsaXl1bi1sYy11cGxvYWQvdXBsb2Fkcy8yMDE4LzEyLzA3L2NpcmN1bGFybGlua2VkbGlzdF90ZXN0Mi5wbmc)
<b>示例 3</b>
```c
head = [1], pos = -1
false
```
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hc3NldHMubGVldGNvZGUtY24uY29tL2FsaXl1bi1sYy11cGxvYWQvdXBsb2Fkcy8yMDE4LzEyLzA3L2NpcmN1bGFybGlua2VkbGlzdF90ZXN0My5wbmc)
<b>进阶</b>
你能用 O(1)(即,常量)内存解决此问题吗?
---
## 实现
**第一种:通过集合的方法**
通过检查一个结点此前是否被访问过来判断链表是否为环形链表。
**C# 语言**
- 状态:通过
- 执行用时112 ms, 在所有 C# 提交中击败了 84.04% 的用户
- 内存消耗26.5 MB, 在所有 C# 提交中击败了 100.00% 的用户
```c
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public bool HasCycle(ListNode head)
{
HashSet<ListNode> h = new HashSet<ListNode>();
ListNode temp = head;
while (temp != null)
{
if (h.Contains(temp))
return true;
h.Add(temp);
temp = temp.next;
}
return false;
}
}
```
**Python 语言**
- 执行结果:通过
- 执行用时60 ms, 在所有 Python3 提交中击败了 64.49% 的用户
- 内存消耗17.3 MB, 在所有 Python3 提交中击败了 9.52% 的用户
```python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def hasCycle(self, head: ListNode) -> bool:
h = set()
temp = head
while temp is not None:
if temp in h:
return True
h.add(temp)
temp = temp.next
return False
```
**第二种:利用双指针的方式**
通常情况下,判断是否包含了重复的元素,我们使用`Hash`的方式来做。对于单链表的这种场景,我们也可以使用双指针的方式。
第一个指针 `p1` 每次移动两个节点,第二个指针 `p2` 每次移动一个节点,如果该链表存在环的话,第一个指针一定会再次碰到第二个指针,反之,则不存在环。
比如:`head = [1,2,3,4,5]`,奇数
```c
p11 3 5 2 4 1
p21 2 3 4 5 1
```
比如:`head = [1,2,3,4]`,偶数
```c
p11 3 1 3 1
p21 2 3 4 1
```
**C# 语言**
- 状态:通过
- 执行用时: 112 ms, 在所有 C# 提交中击败了 98.43% 的用户
- 内存消耗: 24.9 MB, 在所有 C# 提交中击败了 5.13% 的用户
```c
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public bool HasCycle(ListNode head) {
ListNode p1 = head;
ListNode p2 = head;
while (p1 != null && p1.next != null)
{
p1 = p1.next.next;
p2 = p2.next;
if (p1 == p2)
return true;
}
return false;
}
}
```
**Python 语言**
- 执行结果:通过
- 执行用时56 ms, 在所有 Python3 提交中击败了 60.97% 的用户
- 内存消耗16.6 MB, 在所有 Python3 提交中击败了 11.81% 的用户
```python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def hasCycle(self, head: ListNode) -> bool:
p1 = head
p2 = head
while p1 is not None and p1.next is not None:
p1 = p1.next.next
p2 = p2.next
if p1 == p2:
return True
return False
```

View File

@@ -0,0 +1,163 @@
## 题目
> - 题号142
> - 难度:中等
> - https://leetcode-cn.com/problems/linked-list-cycle-ii/
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1则在该链表中没有环。
<b>说明</b>:不允许修改给定的链表。
<b>示例 1</b>
```c
head = [3,2,0,-4], pos = 1
tail connects to node index 1
```
![](https://img-blog.csdnimg.cn/20190917082846690.png)
<b>示例 2</b>
```c
head = [1,2], pos = 0
tail connects to node index 0
```
![](https://img-blog.csdnimg.cn/20190917082911889.png)
<b>示例 3</b>
```c
head = [1], pos = -1
no cycle
```
![](https://img-blog.csdnimg.cn/20190917082930392.png)
<b>进阶:</b>
你是否可以不用额外空间解决此题?
---
## 实现
<b>第一种:利用暴力匹配的方式</b>
- 状态:通过
- 16 / 16 个通过测试用例
- 执行用时: 412 ms, 在所有 C# 提交中击败了 17.07% 的用户
- 内存消耗: 24.8 MB, 在所有 C# 提交中击败了 10.00% 的用户
```c
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode DetectCycle(ListNode head)
{
if (head == null)
return null;
ListNode p1 = head;
int i = 0;
while (p1 != null)
{
p1 = p1.next;
i++;
ListNode p2 = head;
int j = 0;
while (j < i)
{
if (p2 == p1)
{
return p2;
}
p2 = p2.next;
j++;
}
}
return null;
}
}
```
<b>第二种:通过集合的方法</b>
**C# 语言**
- 状态:通过
- 16 / 16 个通过测试用例
- 执行用时: 140 ms, 在所有 C# 提交中击败了 82.93% 的用户
- 内存消耗: 26 MB, 在所有 C# 提交中击败了 5.00% 的用户
```c
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution
{
public ListNode DetectCycle(ListNode head)
{
HashSet<ListNode> h = new HashSet<ListNode>();
ListNode temp = head;
while (temp != null)
{
if (h.Contains(temp))
return temp;
h.Add(temp);
temp = temp.next;
}
return null;
}
}
```
**Python 语言**
- 执行结果:通过
- 执行用时72 ms, 在所有 Python3 提交中击败了 36.52% 的用户
- 内存消耗17.2 MB, 在所有 Python3 提交中击败了 7.69% 的用户
```python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def detectCycle(self, head: ListNode) -> ListNode:
h = set()
temp = head
while temp is not None:
if temp in h:
return temp
h.add(temp)
temp = temp.next
return None
```

View File

@@ -0,0 +1,208 @@
## 题目
> - 题号146
> - 难度:中等
> - https://leetcode-cn.com/problems/lru-cache/
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。
获取数据 `get(key)` - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。
写入数据 `put(key, value)` - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。
<b>进阶</b>:
你是否可以在 O(1) 时间复杂度内完成这两种操作?
<b>示例</b>:
```c
LRUCache cache = new LRUCache( 2 /* 缓存容量 */ );
cache.put(1, 1);
cache.put(2, 2);
cache.get(1); // 返回 1
cache.put(3, 3); // 该操作会使得密钥 2 作废
cache.get(2); // 返回 -1 (未找到)
cache.put(4, 4); // 该操作会使得密钥 1 作废
cache.get(1); // 返回 -1 (未找到)
cache.get(3); // 返回 3
cache.get(4); // 返回 4
```
---
## 实现
> 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置。但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用。那么,什么样的数据,我们判定为「有用的」的数据呢?
>
> LRU 缓存淘汰算法就是一种常用策略。LRU 的全称是 Least Recently Used也就是说我们认为最近使用过的数据应该是是「有用的」很久都没用过的数据应该是无用的内存满了就优先删那些很久没用过的数据。
<b>第一种:利用单链表的方式</b>
- 状态:通过
- 18 / 18 个通过测试用例
- 执行用时: 868 ms, 在所有 C# 提交中击败了 6.25% 的用户
- 内存消耗: 47.8 MB, 在所有 C# 提交中击败了 26.67% 的用户
```c
public class LRUCache
{
private readonly int _length;
private readonly List<KeyValuePair<int, int>> _lst;
public LRUCache(int capacity)
{
_length = capacity;
_lst = new List<KeyValuePair<int, int>>();
}
private int GetIndex(int key)
{
for (int i=0,len=_lst.Count;i<len;i++)
{
if (_lst[i].Key == key)
{
return i;
}
}
return -1;
}
public int Get(int key)
{
int index = GetIndex(key);
if (index!=-1)
{
int val = _lst[index].Value;
_lst.RemoveAt(index);
_lst.Add(new KeyValuePair<int, int>(key, val));
return val;
}
return -1;
}
public void Put(int key, int value)
{
int index = GetIndex(key);
if (index!=-1)
{
_lst.RemoveAt(index);
}
else if (_lst.Count == _length)
{
_lst.RemoveAt(0);
}
_lst.Add(new KeyValuePair<int, int>(key, value));
}
}
/**
* Your LRUCache object will be instantiated and called as such:
* LRUCache obj = new LRUCache(capacity);
* int param_1 = obj.Get(key);
* obj.Put(key,value);
*/
```
<b>第二种:利用 字典 + 列表 的方式</b>
把字典当作一个存储容器,由于字典是无序的,即 `dict` 内部存放的顺序和 `key` 放入的顺序是没有关系的,所以需要一个 `list` 来辅助排序。
**C# 语言**
- 状态:通过
- 18 / 18 个通过测试用例
- 执行用时: 392 ms, 在所有 C# 提交中击败了 76.56% 的用户
- 内存消耗: 47.9 MB, 在所有 C# 提交中击败了 20.00% 的用户
```c
public class LRUCache
{
private readonly List<int> _keys;
private readonly Dictionary<int, int> _dict;
public LRUCache(int capacity)
{
_keys = new List<int>(capacity);
_dict = new Dictionary<int, int>(capacity);
}
public int Get(int key)
{
if (_dict.ContainsKey(key))
{
_keys.Remove(key);
_keys.Add(key);
return _dict[key];
}
return -1;
}
public void Put(int key, int value)
{
if (_dict.ContainsKey(key))
{
_dict.Remove(key);
_keys.Remove(key);
}
else if (_keys.Count == _keys.Capacity)
{
_dict.Remove(_keys[0]);
_keys.RemoveAt(0);
}
_keys.Add(key);
_dict.Add(key, value);
}
}
/**
* Your LRUCache object will be instantiated and called as such:
* LRUCache obj = new LRUCache(capacity);
* int param_1 = obj.Get(key);
* obj.Put(key,value);
*/
```
**Python 语言**
- 执行结果:通过
- 执行用时628 ms, 在所有 Python3 提交中击败了 12.15% 的用户
- 内存消耗22 MB, 在所有 Python3 提交中击败了 65.38% 的用户
```python
class LRUCache:
def __init__(self, capacity: int):
self._capacity = capacity
self._dict = dict()
self._keys = list()
def get(self, key: int) -> int:
if key in self._dict:
self._keys.remove(key)
self._keys.append(key)
return self._dict[key]
return -1
def put(self, key: int, value: int) -> None:
if key in self._dict:
self._dict.pop(key)
self._keys.remove(key)
elif len(self._keys) == self._capacity:
self._dict.pop(self._keys[0])
self._keys.remove(self._keys[0])
self._keys.append(key)
self._dict[key] = value
# Your LRUCache object will be instantiated and called as such:
# obj = LRUCache(capacity)
# param_1 = obj.get(key)
# obj.put(key,value)
```

View File

@@ -0,0 +1,165 @@
## 题目
> - 题号148
> - 难度:中等
> - https://leetcode-cn.com/problems/sort-list/
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
<b>示例 1:</b>
```c
: 4->2->1->3
: 1->2->3->4
```
<b>示例 2:</b>
```c
: -1->5->3->4->0
: -1->0->3->4->5
```
---
## 实现
**思路:模仿并归排序的思路,典型的回溯算法。**
如果待排的元素存储在数组中,我们可以用并归排序。而这些元素存储在链表中,我们无法直接利用并归排序,只能借鉴并归排序的思想对算法进行修改。
并归排序的思想是将待排序列进行分组,直到包含一个元素为止,然后回溯合并两个有序序列,最后得到排序序列。
对于链表我们可以递归地将当前链表分为两段然后merge分两段的方法是使用双指针法`p1`指针每次走两步,`p2`指针每次走一步,直到`p1`走到末尾,这时`p2`所在位置就是中间位置,这样就分成了两段。
**C# 语言**
- 状态:通过
- 16 / 16 个通过测试用例
- 执行用时: 124 ms, 在所有 C# 提交中击败了 100.00% 的用户
- 内存消耗: 29 MB, 在所有 C# 提交中击败了 25.00% 的用户
```c
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution
{
public ListNode SortList(ListNode head)
{
if (head == null)
return null;
return MergeSort(head);
}
private ListNode MergeSort(ListNode node)
{
if (node.next == null)
{
return node;
}
ListNode p1 = node;
ListNode p2 = node;
ListNode cut = null;
while (p1 != null && p1.next != null)
{
cut = p2;
p2 = p2.next;
p1 = p1.next.next;
}
cut.next = null;
ListNode l1 = MergeSort(node);
ListNode l2 = MergeSort(p2);
return MergeTwoLists(l1, l2);
}
private ListNode MergeTwoLists(ListNode l1, ListNode l2)
{
ListNode pHead = new ListNode(-1);
ListNode temp = pHead;
while (l1 != null && l2 != null)
{
if (l1.val < l2.val)
{
temp.next = l1;
l1 = l1.next;
}
else
{
temp.next = l2;
l2 = l2.next;
}
temp = temp.next;
}
if (l1 != null)
temp.next = l1;
if (l2 != null)
temp.next = l2;
return pHead.next;
}
}
```
**Python 语言**
- 执行结果:通过
- 执行用时216 ms, 在所有 Python3 提交中击败了 75.99% 的用户
- 内存消耗20.7 MB, 在所有 Python3 提交中击败了 28.57% 的用户
```python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def sortList(self, head: ListNode) -> ListNode:
if head is None:
return head
return self.mergeSort(head)
def mergeSort(self, node: ListNode) -> ListNode:
if node.next is None:
return node
p1 = node
p2 = node
cute = None
while p1 is not None and p1.next is not None:
cute = p2
p2 = p2.next
p1 = p1.next.next
cute.next = None
l1 = self.mergeSort(node)
l2 = self.mergeSort(p2)
return self.mergeTwoLists(l1, l2)
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
pHead = ListNode(-1)
temp = pHead
while l1 is not None and l2 is not None:
if l1.val < l2.val:
temp.next = l1
l1 = l1.next
else:
temp.next = l2
l2 = l2.next
temp = temp.next
if l1 is not None:
temp.next = l1
if l2 is not None:
temp.next = l2
return pHead.next
```

View File

@@ -0,0 +1,140 @@
## 题目
> - 题号155
> - 难度:简单
> - https://leetcode-cn.com/problems/min-stack/
设计一个支持 pushpoptop 操作,并能在常数时间内检索到最小元素的栈。
- push(x) -- 将元素 x 推入栈中。
- pop() -- 删除栈顶的元素。
- top() -- 获取栈顶元素。
- getMin() -- 检索栈中的最小元素。
<b>示例</b>:
```c
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> -3.
minStack.pop();
minStack.top(); --> 0.
minStack.getMin(); --> -2.
```
---
## 实现
<b>第一种:利用单链表的方式</b>
- 状态:通过
- 18 / 18 个通过测试用例
- 执行用时: 776 ms, 在所有 C# 提交中击败了 22.32% 的用户
- 内存消耗: 33.8 MB, 在所有 C# 提交中击败了10.60% 的用户
```c
public class MinStack
{
/** initialize your data structure here. */
private readonly IList<int> _lst;
public MinStack()
{
_lst = new List<int>();
}
public void Push(int x)
{
_lst.Add(x);
}
public void Pop()
{
_lst.RemoveAt(_lst.Count - 1);
}
public int Top()
{
return _lst[_lst.Count - 1];
}
public int GetMin()
{
return _lst.Min();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.Push(x);
* obj.Pop();
* int param_3 = obj.Top();
* int param_4 = obj.GetMin();
*/
```
<b>第二种:利用辅助栈的方式</b>
- 状态:通过
- 18 / 18 个通过测试用例
- 执行用时: 192 ms, 在所有 C# 提交中击败了 96.43% 的用户
- 内存消耗: 33.5 MB, 在所有 C# 提交中击败了 13.63% 的用户
```c
public class MinStack
{
/** initialize your data structure here. */
private readonly Stack<int> _stack;
private readonly Stack<int> _stackMin;
public MinStack()
{
_stack = new Stack<int>();
_stackMin = new Stack<int>();
}
public void Push(int x)
{
_stack.Push(x);
if (_stackMin.Count == 0 || _stackMin.Peek() >= x)
{
_stackMin.Push(x);
}
}
public void Pop()
{
int x = _stack.Pop();
if (_stackMin.Peek() == x)
{
_stackMin.Pop();
}
}
public int Top()
{
return _stack.Peek();
}
public int GetMin()
{
return _stackMin.Peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.Push(x);
* obj.Pop();
* int param_3 = obj.Top();
* int param_4 = obj.GetMin();
*/
```

View File

@@ -0,0 +1,132 @@
## 题目
> - 题号160
> - 难度:简单
> - https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
编写一个程序,找到两个单链表相交的起始节点。
如下面的两个链表:
![](https://img-blog.csdnimg.cn/20190919184028993.png)
在节点 c1 开始相交。
<b>示例 1</b>
![](https://img-blog.csdnimg.cn/20190919184115602.png)
```c
intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
Reference of the node with value = 8
8 0
A [4,1,8,4,5] B [5,0,1,8,4,5]
A 2 B 3
```
<b>示例 2</b>
![](https://img-blog.csdnimg.cn/20190919184238459.png)
```c
intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
Reference of the node with value = 2
2 0
A [0,9,1,2,4] B [3,2,4]
A 3 B 1
```
<b>示例 3</b>
![](https://img-blog.csdnimg.cn/20190919184347785.png)
```c
intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
null
A [2,6,4] B [1,5]
intersectVal 0 skipA skipB
null
```
<b>注意</b>
- 如果两个链表没有交点,返回 null.
- 在返回结果后,两个链表仍须保持原有的结构。
- 可假定整个链表结构中没有循环。
- 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
---
## 实现
**思路:通过集合的方法**
**C# 语言**
- 状态:通过
- 45 / 45 个通过测试用例
- 执行用时: 172 ms, 在所有 C# 提交中击败了 100.00% 的用户
- 内存消耗: 37.6 MB, 在所有 C# 提交中击败了 5.88% 的用户
```c
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution
{
public ListNode GetIntersectionNode(ListNode headA, ListNode headB)
{
HashSet<ListNode> hash = new HashSet<ListNode>();
ListNode temp = headA;
while (temp != null)
{
hash.Add(temp);
temp = temp.next;
}
temp = headB;
while (temp != null)
{
if (hash.Contains(temp))
return temp;
temp = temp.next;
}
return null;
}
}
```
**Python 语言**
- 执行结果:通过
- 执行用时200 ms, 在所有 Python3 提交中击败了 40.19% 的用户
- 内存消耗29.4 MB, 在所有 Python3 提交中击败了 5.00% 的用户
```python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> None:
h = set()
temp = headA
while temp is not None:
h.add(temp)
temp = temp.next
temp = headB
while temp is not None:
if temp in h:
return temp
temp = temp.next
return None
```

View File

@@ -0,0 +1,87 @@
## 题目
> - 题号169
> - 难度:简单
> - https://leetcode-cn.com/problems/majority-element/
给定一个大小为 `n` 的数组,找到其中的众数。众数是指在数组中出现次数大于` ⌊ n/2 ⌋` 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
<b>示例 1:</b>
```c
: [3,2,3]
: 3
```
<b>示例 2:</b>
```c
: [2,2,1,1,1,2,2]
: 2
```
---
## 实现
**第一种:利用排序的方法**
**C# 语言**
- 状态:通过
- 44 / 44 个通过测试用例
- 执行用时192 ms
```c
public class Solution
{
public int MajorityElement(int[] nums)
{
nums = nums.OrderBy(a => a).ToArray();
return nums[nums.Length / 2];
}
}
```
**Python 语言**
- 执行结果:通过
- 执行用时48 ms, 在所有 Python3 提交中击败了 82.08% 的用户
- 内存消耗15.2 MB, 在所有 Python3 提交中击败了 6.90% 的用户
```python
class Solution:
def majorityElement(self, nums: List[int]) -> int:
nums.sort()
return nums[len(nums) // 2]
```
<b>第二种:利用 Boyer-Moore 投票算法</b>
寻找数组中超过一半的数字,这意味着数组中其他数字出现次数的总和都是比不上这个数字出现的次数。即如果把 该众数记为 +1 ,把其他数记为 1 ,将它们全部加起来,和是大于 0 的。
- 状态:通过
- 44 / 44 个通过测试用例
- 执行用时148 ms
```c
public class Solution
{
public int MajorityElement(int[] nums)
{
int candidate = nums[0];
int count = 1;
for (int i = 1; i < nums.Length; i++)
{
if (count == 0)
candidate = nums[i];
count += (nums[i] == candidate) ? 1 : -1;
}
return candidate;
}
}
```

View File

@@ -0,0 +1,91 @@
## 题目
> - 题号206
> - 难度:简单
> - https://leetcode-cn.com/problems/reverse-linked-list/
反转一个单链表。
<b>示例</b>:
```c
: 1->2->3->4->5->NULL
: 5->4->3->2->1->NULL
```
<b>进阶</b>:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
---
## 实现
**思路:利用双指针的方式**
`p1`作为前面的指针探路,`p2`作为后面的指针跟进,顺着链表跑一圈,搞定问题。
**C# 语言**
- 状态:通过
- 27 / 27 个通过测试用例
- 执行用时: 116 ms, 在所有 C# 提交中击败了 97.50% 的用户
- 内存消耗: 23.3 MB, 在所有 C# 提交中击败了 5.26% 的用户
```c
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution
{
public ListNode ReverseList(ListNode head)
{
if (head == null || head.next == null)
return head;
ListNode p1 = head;
ListNode p2 = null;
while (p1 != null)
{
ListNode temp = p1.next;
p1.next = p2;
p2 = p1;
p1 = temp;
}
return p2;
}
}
```
**Python 语言**
- 执行结果:通过
- 执行用时36 ms, 在所有 Python3 提交中击败了 92.27% 的用户
- 内存消耗14.6 MB, 在所有 Python3 提交中击败了 17.65% 的用户
```python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if head is None or head.next is None:
return head
p1 = head
p2 = None
while p1 is not None:
temp = p1.next
p1.next = p2
p2 = p1
p1 = temp
return p2
```

View File

@@ -0,0 +1,63 @@
## 题目
> - 题号215
> - 难度:中等
> - https://leetcode-cn.com/problems/kth-largest-element-in-an-array/
在未排序的数组中找到第 `k` 个最大的元素。请注意,你需要找的是数组排序后的第 `k` 个最大的元素,而不是第 `k` 个不同的元素。
<b>示例 1</b>:
```c
: [3,2,1,5,6,4] k = 2
: 5
```
<b>示例 2</b>:
```c
: [3,2,3,1,2,4,5,5,6] k = 4
: 4
```
<b>说明</b>:
你可以假设 `k` 总是有效的,且 `1 ≤ k ≤ 数组的长度`
---
## 实现
**思路:利用排序的方法**
**C# 语言**
- 状态:通过
- 32 / 32 个通过测试用例
- 执行用时: 152 ms, 在所有 C# 提交中击败了 76.47% 的用户
- 内存消耗: 24.6 MB, 在所有 C# 提交中击败了 5.55% 的用户
```c
public class Solution
{
public int FindKthLargest(int[] nums, int k)
{
nums = nums.OrderBy(a => a).ToArray();
return nums[nums.Length - k];
}
}
```
**Python 语言**
- 执行结果:通过
- 执行用时40 ms, 在所有 Python3 提交中击败了 92.64% 的用户
- 内存消耗14.4 MB, 在所有 Python3 提交中击败了 15.79% 的用户
```python
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
nums.sort()
return nums[len(nums) - k]
```

View File

@@ -0,0 +1,85 @@
## 题目
> - 题号217
> - 难度:简单
> - https://leetcode-cn.com/problems/contains-duplicate/
给定一个整数数组,判断是否存在重复元素。
如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同则返回 false。
<b>示例 1</b>:
```c
: [1,2,3,1]
: true
```
<b>示例 2</b>:
```c
: [1,2,3,4]
: false
```
<b>示例 3</b>:
```c
: [1,1,1,3,3,4,3,2,4,2]
: true
```
---
## 实现
**思路:通过集合的方法**
**C# 语言**
- 状态:通过
- 18 / 18 个通过测试用例
- 执行用时: 156 ms, 在所有 C# 提交中击败了 93.33% 的用户
- 内存消耗: 30.3 MB, 在所有 C# 提交中击败了 5.31% 的用户
```c
public class Solution
{
public bool ContainsDuplicate(int[] nums)
{
if (nums.Length < 2)
return false;
HashSet<int> h = new HashSet<int>();
foreach (int num in nums)
{
if (h.Contains(num))
return true;
h.Add(num);
}
return false;
}
}
```
**Python 语言**
- 执行结果:通过
- 执行用时48 ms, 在所有 Python3 提交中击败了 78.11% 的用户
- 内存消耗18.9 MB, 在所有 Python3 提交中击败了 24.00% 的用户
```python
class Solution:
def containsDuplicate(self, nums: List[int]) -> bool:
if len(nums) < 2:
return False
h = set()
for num in nums:
if num in h:
return True
h.add(num)
return False
```

View File

@@ -0,0 +1,83 @@
## 题目
> - 题号230
> - 难度:中等
> - https://leetcode-cn.com/problems/kth-smallest-element-in-a-bst/
给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。
<b>说明</b>
你可以假设 k 总是有效的1 ≤ k ≤ 二叉搜索树元素个数。
<b>示例 1</b>:
```c
: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
: 1
```
<b>示例 2</b>:
```c
: root = [5,3,6,2,4,null,null,1], k = 3
5
/ \
3 6
/ \
2 4
/
1
: 3
```
<b>进阶</b>
如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化 kthSmallest 函数?
---
## 实现
**思路:** 对二叉搜索树进行中序遍历,即可得到由小到大的序列。
- 状态:通过
- 91 / 91 个通过测试用例
- 执行用时: 128 ms, 在所有 C# 提交中击败了 100.00% 的用户
- 内存消耗: 27.2 MB, 在所有 C# 提交中击败了 9.09% 的用户
```c
/**
* Definition for a binary tree node.
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int x) { val = x; }
* }
*/
public class Solution
{
List<int> _lst;
public int KthSmallest(TreeNode root, int k)
{
_lst=new List<int>();
MidTraver(root);
return _lst[k-1];
}
private void MidTraver(TreeNode current)
{
if(current==null)
return;
MidTraver(current.left);
_lst.Add(current.val);
MidTraver(current.right);
}
}
```

View File

@@ -0,0 +1,82 @@
## 题目
> - 题号231
> - 难度:简单
> - https://leetcode-cn.com/problems/power-of-two/
给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
<b>示例 1</b>:
```c
: 1
: true
: 2^0 = 1
```
<b>示例 2</b>:
```c
: 16
: true
: 2^4 = 16
```
<b>示例 3</b>:
```c
: 218
: false
```
---
## 实现
**第一种:利用位运算的方法**
**思路:** 利用"异或"操作的性质。
```c
A: 00 00 11 00
A^A: 00 00 00 00
```
**C# 语言**
- 状态:通过
- 1108 / 1108 个通过测试用例
- 执行用时: 36 ms, 在所有 C# 提交中击败了 100.00% 的用户
- 内存消耗: 14.7 MB, 在所有 C# 提交中击败了 100.00% 的用户
```c
public class Solution
{
public bool IsPowerOfTwo(int n)
{
if (n < 0)
return false;
for (int i = 0; i < 32; i++)
{
int mask = 1 << i;
if ((n ^ mask) == 0)
return true;
}
return false;
}
}
```
**Python 语言**
- 执行结果:通过
- 执行用时44 ms, 在所有 Python3 提交中击败了 51.91% 的用户
- 内存消耗13.6 MB, 在所有 Python3 提交中击败了 6.25% 的用户
```python
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
for i in range(32):
mask = 1 << i
if n ^ mask == 0:
return True
return False
```

View File

@@ -0,0 +1,80 @@
## 题目
**第一种:利用递归**
> - 题号235
> - 难度:简单
> - https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q最近公共祖先表示为一个结点 x满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
![](https://img-blog.csdnimg.cn/20190920121541692.png)
<b>示例 1</b>:
```c
: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
: 6
: 2 8 6
```
<b>示例 2</b>:
```c
: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
: 2
: 2 4 2,
```
<b>说明</b>:
- 所有节点的值都是唯一的。
- p、q 为不同节点且均存在于给定的二叉搜索树中。
---
## 实现
- 状态:通过
- 27 / 27 个通过测试用例
- 执行用时: 128 ms, 在所有 C# 提交中击败了 95.71% 的用户
- 内存消耗: 30.8 MB, 在所有 C# 提交中击败了 7.69% 的用户
```c
/**
* Definition for a binary tree node.
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int x) { val = x; }
* }
*/
public class Solution
{
public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q)
{
if (root.val == p.val || root.val == q.val)
return root;
if (root.val > p.val && root.val < q.val)
return root;
if (root.val < p.val && root.val > q.val)
return root;
if (root.val < p.val && root.val < q.val)
{
return LowestCommonAncestor(root.right, p, q);
}
return LowestCommonAncestor(root.left, p, q);
}
}
```

View File

@@ -0,0 +1,77 @@
## 题目
> - 题号236
> - 难度:中等
> - https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q最近公共祖先表示为一个结点 x满足 x 是 p、q 的祖先且 x 的深度尽可能大(<b>一个节点也可以是它自己的祖先</b>)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
![](https://img-blog.csdnimg.cn/20190922095031349.png)
<b>示例 1</b>:
```c
: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
: 3
: 5 1 3
```
<b>示例 2</b>:
```c
: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
: 5
: 5 4 5
```
<b>说明</b>:
- 所有节点的值都是唯一的。
- p、q 为不同节点且均存在于给定的二叉树中。
---
## 实现
**第一种:利用递归**
- 状态:通过
- 31 / 31 个通过测试用例
- 执行用时: 132 ms, 在所有 C# 提交中击败了 96.10% 的用户
- 内存消耗: 27.5 MB, 在所有 C# 提交中击败了 20.00% 的用户
```c
/**
* Definition for a binary tree node.
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int x) { val = x; }
* }
*/
public class Solution
{
public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q)
{
return Find(root, p, q);
}
private TreeNode Find(TreeNode current, TreeNode p, TreeNode q)
{
if (current == null || current == p || current == q)
return current;
TreeNode left = Find(current.left, p, q);
TreeNode right = Find(current.right, p, q);
if (left != null && right != null)
return current;
return left != null ? left : right;
}
}
```

View File

@@ -0,0 +1,79 @@
## 题目
> - 题号237
> - 难度:简单
> - https://leetcode-cn.com/problems/delete-node-in-a-linked-list/
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
现有一个链表 -- head = [4,5,1,9],它可以表示为:
![](https://img-blog.csdnimg.cn/20190920111622847.png)
<b>示例 1</b>:
```c
: head = [4,5,1,9], node = 5
: [4,1,9]
: 5 4 -> 1 -> 9.
```
<b>示例 2</b>:
```c
: head = [4,5,1,9], node = 1
: [4,5,9]
: 1 4 -> 5 -> 9.
```
<b>说明</b>:
- 链表至少包含两个节点。
- 链表中所有节点的值都是唯一的。
- 给定的节点为非末尾节点并且一定是链表中的一个有效节点。
- 不要从你的函数中返回任何结果。
---
## 实现
**思路:** 这道题没有给出链表的头节点,而是直接给出要删除的节点,让我们进行原地删除。我们对于该节点的前一个节点一无所知,所以无法直接执行删除操作。因此,我们将要删除节点的 next 节点的值赋值给要删除的节点,转而去删除 next 节点,从而达成目的。
- 状态:通过
- 41 / 41 个通过测试用例
- 执行用时: 120 ms, 在所有 C# 提交中击败了 99.55% 的用户
- 内存消耗: 24.4 MB, 在所有 C# 提交中击败了 5.88% 的用户
```c
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution
{
public void DeleteNode(ListNode node)
{
ListNode temp = node.next;
while (temp != null)
{
node.val = temp.val;
temp = temp.next;
if (temp != null)
{
node = node.next;
}
}
node.next = null;
}
}
```

View File

@@ -0,0 +1,67 @@
## 题目
> - 题号238
> - 难度:中等
> - https://leetcode-cn.com/problems/product-of-array-except-self/
给定长度为 n 的整数数组 nums其中 n > 1返回输出数组 output其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
<b>示例</b>:
```c
: [1,2,3,4]
: [24,12,8,6]
```
<b>说明</b>: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。
<b>进阶</b>
你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)
---
## 实现
**思路**:乘积 = 当前数左边的乘积 * 当前数右边的乘积
```c
[1, 2, 3, 4]
[1, 1, 2, 6]
[24,12,4, 1]
= * [24,12,8, 6]
```
- 状态:通过
- 17 / 17 个通过测试用例
- 执行用时: 304 ms, 在所有 C# 提交中击败了 100.00% 的用户
- 内存消耗: 34.6 MB, 在所有 C# 提交中击败了 100.00% 的用户
```c
public class Solution
{
public int[] ProductExceptSelf(int[] nums)
{
int len = nums.Length;
int[] output1 = new int[len];//正向乘积
int[] output2 = new int[len];//反向乘积
output1[0] = 1;
output2[len - 1] = 1;
for (int i = 1; i < len; i++)
{
output1[i] = output1[i - 1]*nums[i - 1];
output2[len - i - 1] = output2[len - i]*nums[len - i];
}
for (int i = 0; i < len; i++)
{
output1[i] *= output2[i];
}
return output1;
}
}
```

View File

@@ -0,0 +1,63 @@
## 题目
> - 题号292
> - 难度:简单
> - https://leetcode-cn.com/problems/nim-game/
你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。
你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。
<b>示例</b>:
```c
: 4
: false
: 4
1 2 3
```
---
## 实现
**思路**每一回合都必须拿石子所以当到谁的回合还剩下4个石子那么谁就输了。
- [1,3]先手赢
- [4]后手赢
- [5,7]先手赢因为你可以使到对方回合时是剩下4个石子
- [8]后手赢此时对方可以使在你的回合时剩下4个石子
- 以次类推可以发现当n为4的倍数时先手总会输
**C# 实现**
- 状态:通过
- 60 / 60 个通过测试用例
- 执行用时: 56 ms, 在所有 C# 提交中击败了 82.41% 的用户
- 内存消耗: 13.6 MB, 在所有 C# 提交中击败了 5.17% 的用户
```c
public class Solution
{
public bool CanWinNim(int n)
{
return (n % 4 != 0);
}
}
```
**Python 实现**
- 执行结果:通过
- 执行用时36 ms, 在所有 Python3 提交中击败了 68.15% 的用户
- 内存消耗13.7 MB, 在所有 Python3 提交中击败了 10.00% 的用户
```python
class Solution:
def canWinNim(self, n: int) -> bool:
return n%4 != 0
```

View File

@@ -0,0 +1,54 @@
## 题目
> - 题号344
> - 难度:简单
> - https://leetcode-cn.com/problems/reverse-string/
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地 <b>修改输入数组</b>、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
<b>示例 1</b>
```c
["h","e","l","l","o"]
["o","l","l","e","h"]
```
<b>示例 2</b>
```c
["H","a","n","n","a","h"]
["h","a","n","n","a","H"]
```
---
## 实现
**第一种:利用双索引的方式**
- 状态:通过
- 478 / 478 个通过测试用例
- 执行用时: 572 ms, 在所有 C# 提交中击败了 94.94% 的用户
- 内存消耗: 33.6 MB, 在所有 C# 提交中击败了 5.05% 的用户
```c
public class Solution {
public void ReverseString(char[] s) {
int i = 0;
int j = s.Length-1;
while (i < j)
{
char c = s[i];
s[i] = s[j];
s[j] = c;
i++;
j--;
}
}
}
```

View File

@@ -0,0 +1,64 @@
## 题目
> - 题号557
> - 难度:简单
> - https://leetcode-cn.com/problems/reverse-words-in-a-string-iii/
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
<b>示例 1</b>:
```c
: "Let's take LeetCode contest"
: "s'teL ekat edoCteeL tsetnoc"
```
---
## 实现
**第一种:利用双索引的方式**
- 状态:通过
- 30 / 30 个通过测试用例
- 执行用时: 128 ms, 在所有 C# 提交中击败了 98.82% 的用户
- 内存消耗: 33.9 MB, 在所有 C# 提交中击败了 20.00% 的用户
```c
public class Solution
{
public string ReverseWords(string s)
{
string[] words = s.Split(new char[] {' '});
StringBuilder sb = new StringBuilder();
for (int i = 0; i < words.Length; i++)
{
char[] w = words[i].ToArray();
ReverseString(w);
sb.Append(w);
if (i != words.Length - 1)
{
sb.Append(' ');
}
}
return sb.ToString();
}
public void ReverseString(char[] s)
{
int i = 0;
int j = s.Length - 1;
while (i < j)
{
char c = s[i];
s[i] = s[j];
s[j] = c;
i++;
j--;
}
}
}
```

View File

@@ -5,7 +5,7 @@
主要包括:
- [Python编程语言](https://github.com/datawhalechina/team-learning-program/tree/master/Python-Language)
- [Python编程语言](https://github.com/datawhalechina/team-learning-program/tree/master/PythonLanguage)
- [数据结构与算法]()
- [编程实践Pandas](https://github.com/datawhalechina/joyful-pandas)
- [编程实践LeetCode 分类练习)]()