C#,实用新型加强版的整数数组

发布时间:2024年01月20日

疫苗要打加强针!数组要用加强版!

三连发

加强版整数数组源代码icon-default.png?t=N7T8https://mp.csdn.net/mp_blog/creation/editor/124151056

加强版实数数组源代码icon-default.png?t=N7T8https://mp.csdn.net/mp_blog/creation/editor/124151110?加强版泛型数组源代码icon-default.png?t=N7T8https://mp.csdn.net/mp_blog/creation/editor/124151190

源代码

1 文本格式

using System;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
?? ?/// <summary>
?? ?/// 加强版(整数)数组
?? ?/// 数组只是数组,
?? ?/// 如果需要Insert,Delete等操作,建议使用List
?? ?/// </summary>
?? ?public class IArray
?? ?{
?? ??? ?/// <summary>
?? ??? ?/// 随机数发生器
?? ??? ?/// </summary>
?? ??? ?private Random rnd { get; set; } = new Random((int)DateTime.Now.Ticks);
?? ??? ?/// <summary>
?? ??? ?/// 保存数组数据
?? ??? ?/// </summary>
?? ??? ?private int[] Value { get; set; } = null;
?? ??? ?/// <summary>
?? ??? ?/// 保存数组的原始数据
?? ??? ?/// </summary>
?? ??? ?private int[] Original { get; set; } = null;
?? ??? ?/// <summary>
?? ??? ?/// 数组的长度
?? ??? ?/// </summary>
?? ??? ?private int Length { get; set; } = Int16.MaxValue;

?? ??? ?/// <summary>
?? ??? ?/// 默认构造函数
?? ??? ?/// </summary>
?? ??? ?public IArray()
?? ??? ?{
?? ??? ??? ?Value = new int[Length];
?? ??? ??? ?Original = new int[Length];
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 指定长度的构造函数
?? ??? ?/// </summary>
?? ??? ?/// <param name="n"></param>
?? ??? ?public IArray(int n)
?? ??? ?{
?? ??? ??? ?Length = n;
?? ??? ??? ?Value = new int[Length];
?? ??? ??? ?Original = new int[Length];
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 以 x 为样板的构造函数(克隆)
?? ??? ?/// </summary>
?? ??? ?/// <param name="x"></param>
?? ??? ?public IArray(IArray x)
?? ??? ?{
?? ??? ??? ?Length = x.Length;
?? ??? ??? ?Value = new int[Length];
?? ??? ??? ?Original = new int[Length];
?? ??? ??? ?for (int i = 0; i < Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?Value[i] = x[i];
?? ??? ??? ??? ?Original[i] = x[i];
?? ??? ??? ?}
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 以数组 v 为数据的构造函数
?? ??? ?/// </summary>
?? ??? ?/// <param name="v"></param>
?? ??? ?public IArray(int[] v)
?? ??? ?{
?? ??? ??? ?Length = v.Length;
?? ??? ??? ?Value = new int[Length];
?? ??? ??? ?Original = new int[Length];
?? ??? ??? ?for (int i = 0; i < Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?Value[i] = v[i];
?? ??? ??? ??? ?Original[i] = v[i];
?? ??? ??? ?}
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 以数组 x 为数据的赋值型构造函数
?? ??? ?/// </summary>
?? ??? ?/// <param name="x"></param>
?? ??? ?public static implicit operator IArray(int[] x)
?? ??? ?{
?? ??? ??? ?return new IArray(x);
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 以字符串为数据的赋值型构造函数
?? ??? ?/// IArray a = "1,2,3,4";
?? ??? ?/// </summary>
?? ??? ?/// <param name="s"></param>
?? ??? ?public static implicit operator IArray(string s)
?? ??? ?{
?? ??? ??? ?string[] sa = s.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
?? ??? ??? ?List<int> list = new List<int>();
?? ??? ??? ?foreach (string sx in sa)
?? ??? ??? ?{
?? ??? ??? ??? ?if (Int32.TryParse(sx.Trim(), out int x))
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?list.Add(x);
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?return new IArray(list.ToArray());
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 第一个数据
?? ??? ?/// </summary>
?? ??? ?public int Left
?? ??? ?{
? ? ? ? ? ? set
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Value[0] = value;
? ? ? ? ? ? }
? ? ? ? ? ? get
? ? ? ? ? ? {
?? ??? ??? ??? ?return Value[0];
?? ??? ??? ?}
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 最后一个数据
?? ??? ?/// </summary>
?? ??? ?public int Right
?? ??? ?{
? ? ? ? ? ? set
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Value[Length - 1] = value;
? ? ? ? ? ? }
? ? ? ? ? ? get
?? ??? ??? ?{
?? ??? ??? ??? ?return Value[Length - 1];
?? ??? ??? ?}
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 最小数据
?? ??? ?/// </summary>
?? ??? ?public int Min
?? ??? ?{
?? ??? ??? ?get
?? ??? ??? ?{
?? ??? ??? ??? ?Array.Sort(Value);
?? ??? ??? ??? ?return Value[0];
?? ??? ??? ?}
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 最大数据
?? ??? ?/// </summary>
?? ??? ?public int Max
?? ??? ?{
?? ??? ??? ?get
?? ??? ??? ?{
?? ??? ??? ??? ?Array.Sort(Value);
?? ??? ??? ??? ?return Value[Length - 1];
?? ??? ??? ?}
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 提取数组数据
?? ??? ?/// </summary>
?? ??? ?public int[] GetValues
?? ??? ?{
?? ??? ??? ?get { return Value; }
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 提取指定下标数据
?? ??? ?/// </summary>
?? ??? ?/// <param name="index"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public int this[int index]
?? ??? ?{
?? ??? ??? ?get { return Value[index]; }
?? ??? ??? ?set { Value[index] = value; }
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 加号重载(两个IArray相加)
?? ??? ?/// </summary>
?? ??? ?/// <param name="a"></param>
?? ??? ?/// <param name="b"></param>
?? ??? ?/// <returns></returns>
?? ??? ?/// <exception cref="Exception"></exception>
?? ??? ?public static IArray operator +(IArray a, IArray b)
?? ??? ?{
?? ??? ??? ?if (a.Length != b.Length)
?? ??? ??? ?{
?? ??? ??? ??? ?throw new Exception("");
?? ??? ??? ?}
?? ??? ??? ?IArray c = new IArray(a);
?? ??? ??? ?for (int i = 0; i < a.Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?c[i] = a[i] + b[i];
?? ??? ??? ?}
?? ??? ??? ?return c;
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 加号重载(a的每个元素加上数值b)
?? ??? ?/// </summary>
?? ??? ?/// <param name="a"></param>
?? ??? ?/// <param name="b"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public static IArray operator +(IArray a, int b)
?? ??? ?{
?? ??? ??? ?IArray c = new IArray(a);
?? ??? ??? ?for (int i = 0; i < a.Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?c[i] = a[i] + b;
?? ??? ??? ?}
?? ??? ??? ?return c;
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 减号重载(两个IArray相减)
?? ??? ?/// </summary>
?? ??? ?/// <param name="a"></param>
?? ??? ?/// <param name="b"></param>
?? ??? ?/// <returns></returns>
?? ??? ?/// <exception cref="Exception"></exception>
?? ??? ?public static IArray operator -(IArray a, IArray b)
?? ??? ?{
?? ??? ??? ?if (a.Length != b.Length)
?? ??? ??? ?{
?? ??? ??? ??? ?throw new Exception("Not same array size!");
?? ??? ??? ?}
?? ??? ??? ?IArray c = new IArray(a);
?? ??? ??? ?for (int i = 0; i < a.Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?c[i] = a[i] - b[i];
?? ??? ??? ?}
?? ??? ??? ?return c;
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 减号重载(a的每个元素减去数值b)
?? ??? ?/// </summary>
?? ??? ?/// <param name="a"></param>
?? ??? ?/// <param name="b"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public static IArray operator -(IArray a, int b)
?? ??? ?{
?? ??? ??? ?IArray c = new IArray(a);
?? ??? ??? ?for (int i = 0; i < a.Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?c[i] = a[i] - b;
?? ??? ??? ?}
?? ??? ??? ?return c;
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 乘号重载(两个IArray的元素一一对应相乘)
?? ??? ?/// </summary>
?? ??? ?/// <param name="a"></param>
?? ??? ?/// <param name="b"></param>
?? ??? ?/// <returns></returns>
?? ??? ?/// <exception cref="Exception"></exception>
?? ??? ?public static IArray operator *(IArray a, IArray b)
?? ??? ?{
?? ??? ??? ?if (a.Length != b.Length)
?? ??? ??? ?{
?? ??? ??? ??? ?throw new Exception("Not same array size!");
?? ??? ??? ?}
?? ??? ??? ?IArray c = new IArray(a);
?? ??? ??? ?for (int i = 0; i < a.Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?c[i] = a[i] * b[i];
?? ??? ??? ?}
?? ??? ??? ?return c;
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 乘号重载(a的每个元素乘以数值b)
?? ??? ?/// </summary>
?? ??? ?/// <param name="a"></param>
?? ??? ?/// <param name="b"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public static IArray operator *(IArray a, int b)
?? ??? ?{
?? ??? ??? ?IArray c = new IArray(a);
?? ??? ??? ?for (int i = 0; i < a.Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?c[i] = a[i] * b;
?? ??? ??? ?}
?? ??? ??? ?return c;
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 除号重载(两个IArray的元素一一对应相除)
?? ??? ?/// </summary>
?? ??? ?/// <param name="a"></param>
?? ??? ?/// <param name="b"></param>
?? ??? ?/// <returns></returns>
?? ??? ?/// <exception cref="Exception"></exception>
?? ??? ?public static IArray operator /(IArray a, IArray b)
?? ??? ?{
?? ??? ??? ?if (a.Length != b.Length)
?? ??? ??? ?{
?? ??? ??? ??? ?throw new Exception("Not same array size!");
?? ??? ??? ?}
?? ??? ??? ?IArray c = new IArray(a);
?? ??? ??? ?for (int i = 0; i < a.Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?if (b[i] == 0)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?throw new Exception("Divided by zero!");
?? ??? ??? ??? ?}
?? ??? ??? ??? ?c[i] = a[i] / b[i];
?? ??? ??? ?}
?? ??? ??? ?return c;
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 除号重载(a的每个元素除以数值b)
?? ??? ?/// </summary>
?? ??? ?/// <param name="a"></param>
?? ??? ?/// <param name="b"></param>
?? ??? ?/// <returns></returns>
?? ??? ?/// <exception cref="Exception"></exception>
?? ??? ?public static IArray operator /(IArray a, int b)
?? ??? ?{
?? ??? ??? ?if (b == 0)
?? ??? ??? ?{
?? ??? ??? ??? ?throw new Exception("divided by zero");
?? ??? ??? ?}
?? ??? ??? ?IArray c = new IArray(a);
?? ??? ??? ?for (int i = 0; i < a.Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?c[i] = a[i] / b;
?? ??? ??? ?}
?? ??? ??? ?return c;
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 排序(正序)
?? ??? ?/// </summary>
?? ??? ?public void Sort()
? ? ? ? {
?? ??? ??? ?Array.Sort(Value);
? ? ? ? }
?? ??? ?/// <summary>
?? ??? ?/// 倒排序
?? ??? ?/// </summary>
?? ??? ?public void Reverse_Sort()
?? ??? ?{
?? ??? ??? ?Array.Sort(Value, (a, b) => b.CompareTo(a));
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 以数组数据为参数的方程式
?? ??? ?/// F(x) = a[0] + a[1] * x + a[2]* x^2 ...
?? ??? ?/// 计算 F(x) 函数值
?? ??? ?/// </summary>
?? ??? ?/// <param name="x"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public double Compute_Equation(double x)
?? ??? ?{
?? ??? ??? ?double v = Value[0];
?? ??? ??? ?for (int i = 1; i < Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?v += Value[i] * Math.Pow(x, i);
?? ??? ??? ?}
?? ??? ??? ?return v;
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 左转(一格)
?? ??? ?/// </summary>
?? ??? ?public void Left_Rotate()
?? ??? ?{
?? ??? ??? ?int v = Left;
?? ??? ??? ?for (int i = 0; i < (Length - 1); i++)
?? ??? ??? ?{
?? ??? ??? ??? ?Value[i] = Value[i + 1];
?? ??? ??? ?}
?? ??? ??? ?Value[Length - 1] = v;
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 右转(一格)
?? ??? ?/// </summary>
?? ??? ?public void Right_Rotate()
?? ??? ?{
?? ??? ??? ?int v = Right;
?? ??? ??? ?for (int i = (Length - 1); i > 0; i--)
?? ??? ??? ?{
?? ??? ??? ??? ?Value[i] = Value[i - 1];
?? ??? ??? ?}
?? ??? ??? ?Value[0] = v;
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 左转(前) num 个数(递归方式)
?? ??? ?/// input: ?1,2,3,4,5,6,7
?? ??? ?/// output: 3,4,5,6,7,1,2
?? ??? ?/// </summary>
?? ??? ?/// <param name="num"></param>
?? ??? ?public void Left_Rotate(int num)
?? ??? ?{
?? ??? ??? ?if (num == 0)
?? ??? ??? ?{
?? ??? ??? ??? ?return;
?? ??? ??? ?}
?? ??? ??? ?num = (num % Length);
?? ??? ??? ?Reverse(0, num - 1);
?? ??? ??? ?Reverse(num, Length - 1);
?? ??? ??? ?Reverse(0, Length - 1);
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 下标 start 到 end 反转
?? ??? ?/// </summary>
?? ??? ?/// <param name="start"></param>
?? ??? ?/// <param name="end"></param>
?? ??? ?public void Reverse(int start, int end)
?? ??? ?{
?? ??? ??? ?while (start < end)
?? ??? ??? ?{
?? ??? ??? ??? ?int temp = Value[start];
?? ??? ??? ??? ?Value[start] = Value[end];
?? ??? ??? ??? ?Value[end] = temp;
?? ??? ??? ??? ?start++;
?? ??? ??? ??? ?end--;
?? ??? ??? ?}
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 左转 num 个数(非递归方式)
?? ??? ?/// input: ?1,2,3,4,5,6,7
?? ??? ?/// output: 3,4,5,6,7,1,2
?? ??? ?/// </summary>
?? ??? ?/// <param name="num"></param>
?? ??? ?public void Left_Rotate_No_Recurse(int num)
?? ??? ?{
?? ??? ??? ?if (num == 0 || num == Length)
?? ??? ??? ?{
?? ??? ??? ??? ?return;
?? ??? ??? ?}
?? ??? ??? ?num = num % Length;
?? ??? ??? ?int i = num;
?? ??? ??? ?int j = Length - num;
?? ??? ??? ?while (i != j)
?? ??? ??? ?{
?? ??? ??? ??? ?if (i < j)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?Swap(num - i, num + j - i, i);
?? ??? ??? ??? ??? ?j -= i;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?else
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?Swap(num - i, num, j);
?? ??? ??? ??? ??? ?i -= j;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?Swap(num - i, num, i);
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 从指定下标开始左转d个数
?? ??? ?/// </summary>
?? ??? ?/// <param name="i">开始下标</param>
?? ??? ?/// <param name="d">左转数</param>
?? ??? ?/// <param name="n"></param>
?? ??? ?public void Left_Rotate_Recurse(int i, int d, int n)
?? ??? ?{
?? ??? ??? ?if (d == 0 || d == n)
?? ??? ??? ?{
?? ??? ??? ??? ?return;
?? ??? ??? ?}
?? ??? ??? ?if ((n - d) == d)
?? ??? ??? ?{
?? ??? ??? ??? ?Swap(i, n - d + i, d);
?? ??? ??? ??? ?return;
?? ??? ??? ?}
?? ??? ??? ?if (d < (n - d))
?? ??? ??? ?{
?? ??? ??? ??? ?Swap(i, n - d + i, d);
?? ??? ??? ??? ?Left_Rotate_Recurse(i, d, n - d);
?? ??? ??? ?}
?? ??? ??? ?else
?? ??? ??? ?{
?? ??? ??? ??? ?Swap(i, d, n - d);
?? ??? ??? ??? ?Left_Rotate_Recurse(n - d + i, 2 * d - n, d);
?? ??? ??? ?}
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 将从下标fi开始的d个元素与从下标si开始的d个元素交换
?? ??? ?/// </summary>
?? ??? ?/// <param name="fi"></param>
?? ??? ?/// <param name="si"></param>
?? ??? ?/// <param name="d"></param>
?? ??? ?public void Swap(int fi, int si, int d)
?? ??? ?{
?? ??? ??? ?for (int i = 0; i < d; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?int temp = Value[fi + i];
?? ??? ??? ??? ?Value[fi + i] = Value[si + i];
?? ??? ??? ??? ?Value[si + i] = temp;
?? ??? ??? ?}
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 应用标准二分法快速查找数值
?? ??? ?/// </summary>
?? ??? ?/// <param name="key"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public int Pivoted_Binary_Search(int key)
?? ??? ?{
?? ??? ??? ?int pivot = Find_Pivot(0, Length - 1);
?? ??? ??? ?if (pivot == -1)
?? ??? ??? ?{
?? ??? ??? ??? ?return Binary_Search(0, Length - 1, key);
?? ??? ??? ?}
?? ??? ??? ?if (Value[pivot] == key)
?? ??? ??? ?{
?? ??? ??? ??? ?return pivot;
?? ??? ??? ?}
?? ??? ??? ?if (Value[0] <= key)
?? ??? ??? ?{
?? ??? ??? ??? ?return Binary_Search(0, pivot - 1, key);
?? ??? ??? ?}
?? ??? ??? ?return Binary_Search(pivot + 1, Length - 1, key);
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 递归当时快速搜索转轴数()
?? ??? ?/// 转轴是第一个后面的数小于自己的数的下标
?? ??? ?/// 比如:数组 3, 4, 5, 6, 1, 2 的转轴下标是 3 (6的下标)
?? ??? ?/// </summary>
?? ??? ?/// <param name="low"></param>
?? ??? ?/// <param name="high"></param>
?? ??? ?/// <returns></returns>
?? ??? ?private int Find_Pivot(int low, int high)
?? ??? ?{
?? ??? ??? ?if (high < low)
?? ??? ??? ?{
?? ??? ??? ??? ?return -1;
?? ??? ??? ?}
?? ??? ??? ?if (high == low)
?? ??? ??? ?{
?? ??? ??? ??? ?return low;
?? ??? ??? ?}

?? ??? ??? ?int mid = (low + high) / 2;
?? ??? ??? ?if (mid < high && Value[mid] > Value[mid + 1])
?? ??? ??? ?{
?? ??? ??? ??? ?return mid;
?? ??? ??? ?}

?? ??? ??? ?if (mid > low && Value[mid] < Value[mid - 1])
?? ??? ??? ?{
?? ??? ??? ??? ?return (mid - 1);
?? ??? ??? ?}

?? ??? ??? ?if (Value[low] >= Value[mid])
?? ??? ??? ?{
?? ??? ??? ??? ?return Find_Pivot(low, mid - 1);
?? ??? ??? ?}

?? ??? ??? ?return Find_Pivot(mid + 1, high);
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 标准二分搜索算法
?? ??? ?/// </summary>
?? ??? ?/// <param name="low"></param>
?? ??? ?/// <param name="high"></param>
?? ??? ?/// <param name="key"></param>
?? ??? ?/// <returns></returns>
?? ??? ?private int Binary_Search(int low, int high, int key)
?? ??? ?{
?? ??? ??? ?if (high < low)
?? ??? ??? ?{
?? ??? ??? ??? ?return -1;
?? ??? ??? ?}

?? ??? ??? ?int mid = (low + high) / 2;
?? ??? ??? ?if (key == Value[mid])
?? ??? ??? ?{
?? ??? ??? ??? ?return mid;
?? ??? ??? ?}
?? ??? ??? ?if (key > Value[mid])
?? ??? ??? ?{
?? ??? ??? ??? ?return Binary_Search((mid + 1), high, key);
?? ??? ??? ?}
?? ??? ??? ?return Binary_Search(low, (mid - 1), key);
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 搜索数组中是否有“对和值(两个数的和)”等于 x
?? ??? ?/// </summary>
?? ??? ?/// <param name="x"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public bool PairSum_Insort(int x)
?? ??? ?{
?? ??? ??? ?int i;
?? ??? ??? ?for (i = 0; i < Length - 1; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?if (Value[i] > Value[i + 1])
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?int l = (i + 1) % Length;
?? ??? ??? ?int r = i;
?? ??? ??? ?while (l != r)
?? ??? ??? ?{
?? ??? ??? ??? ?if (Value[l] + Value[r] == x)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?return true;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?if (Value[l] + Value[r] < x)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?l = (l + 1) % Length;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?else
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?r = (Length + r - 1) % Length;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?return false;
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 返回下标乘积最大数
?? ??? ?/// i*Value[i]
?? ??? ?/// </summary>
?? ??? ?/// <returns></returns>
?? ??? ?public int Maximum_Multipled_Sum()
?? ??? ?{
?? ??? ??? ?int res = int.MinValue;
?? ??? ??? ?for (int i = 0; i < Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?int curr_sum = 0;
?? ??? ??? ??? ?for (int j = 0; j < Length; j++)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?int index = (i + j) % Length;
?? ??? ??? ??? ??? ?curr_sum += j * Value[index];
?? ??? ??? ??? ?}
?? ??? ??? ??? ?res = Math.Max(res, curr_sum);
?? ??? ??? ?}
?? ??? ??? ?return res;
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 二分法搜索 low ... high 之间的最小数
?? ??? ?/// </summary>
?? ??? ?/// <param name="low"></param>
?? ??? ?/// <param name="high"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public int Min_Between(int low, int high)
?? ??? ?{
?? ??? ??? ?if (high < low)
?? ??? ??? ?{
?? ??? ??? ??? ?return Value[0];
?? ??? ??? ?}
?? ??? ??? ?if (high == low)
?? ??? ??? ?{
?? ??? ??? ??? ?return Value[low];
?? ??? ??? ?}
?? ??? ??? ?int mid = low + (high - low) / 2;
?? ??? ??? ?if (mid < high && Value[mid + 1] < Value[mid])
?? ??? ??? ?{
?? ??? ??? ??? ?return Value[mid + 1];
?? ??? ??? ?}
?? ??? ??? ?if (mid > low && Value[mid] < Value[mid - 1])
?? ??? ??? ?{
?? ??? ??? ??? ?return Value[mid];
?? ??? ??? ?}
?? ??? ??? ?if (Value[high] > Value[mid])
?? ??? ??? ?{
?? ??? ??? ??? ?return Min_Between(low, mid - 1);
?? ??? ??? ?}
?? ??? ??? ?return Min_Between(mid + 1, high);
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 计算(回转)数组的最大哈明距离
?? ??? ?/// </summary>
?? ??? ?/// <returns></returns>
?? ??? ?public int Maximum_Hamming_Distance()
?? ??? ?{
?? ??? ??? ?int[] brr = new int[2 * Length + 1];
?? ??? ??? ?for (int i = 0; i < Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?brr[i] = Value[i];
?? ??? ??? ?}
?? ??? ??? ?for (int i = 0; i < Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?brr[Length + i] = Value[i];
?? ??? ??? ?}
?? ??? ??? ?int maxHam = 0;
?? ??? ??? ?for (int i = 1; i < Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?int currHam = 0;
?? ??? ??? ??? ?for (int j = i, k = 0; j < (i + Length); j++, k++)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?if (brr[j] != Value[k])
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?currHam++;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
?? ??? ??? ??? ?if (currHam == Length)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?return Length;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?maxHam = Math.Max(maxHam, currHam);
?? ??? ??? ?}
?? ??? ??? ?return maxHam;
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 移动所有的 0 到数组末尾
?? ??? ?/// </summary>
?? ??? ?public void Push_Zeros_To_End()
?? ??? ?{
?? ??? ??? ?int count = 0;
?? ??? ??? ?for (int i = 0; i < Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?if (Value[i] != 0)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?Value[count++] = Value[i];
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?while (count < Length)
?? ??? ??? ?{
?? ??? ??? ??? ?Value[count++] = 0;
?? ??? ??? ?}
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// Fisher-Yates洗牌算法,听起来很高大上 :P
?? ??? ?/// Fisher–Yates shuffle Algorithm
?? ??? ?/// </summary>
?? ??? ?public void Randomize()
?? ??? ?{
?? ??? ??? ?for (int i = Length - 1; i > 0; i--)
?? ??? ??? ?{
?? ??? ??? ??? ?int j = rnd.Next(0, i + 1);
?? ??? ??? ??? ?int temp = Value[i];
?? ??? ??? ??? ?Value[i] = Value[j];
?? ??? ??? ??? ?Value[j] = temp;
?? ??? ??? ?}
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 计算第 k 个最小数
?? ??? ?/// </summary>
?? ??? ?/// <param name="k"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public int Kth_Smallest(int k)
?? ??? ?{
?? ??? ??? ?Array.Sort(Value);
?? ??? ??? ?return Value[k - 1];
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 下标 low ... high 之间的和值
?? ??? ?/// </summary>
?? ??? ?/// <param name="low"></param>
?? ??? ?/// <param name="high"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public int Sum_Between(int low, int high)
?? ??? ?{
?? ??? ??? ?int sum = 0;
?? ??? ??? ?for (int i = low; i < high; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?sum += Value[i];
?? ??? ??? ?}
?? ??? ??? ?return sum;
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 均值
?? ??? ?/// </summary>
?? ??? ?/// <returns></returns>
?? ??? ?public double Mean()
?? ??? ?{
?? ??? ??? ?double sum = 0.0;
?? ??? ??? ?for (int i = 0; i < Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?sum += Value[i];
?? ??? ??? ?}
?? ??? ??? ?return (double)sum / (double)Length;
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 中值(不是均值哦)
?? ??? ?/// </summary>
?? ??? ?/// <returns></returns>
?? ??? ?public double Median()
?? ??? ?{
?? ??? ??? ?Array.Sort(Value);
?? ??? ??? ?if ((Length % 2) != 0)
?? ??? ??? ?{
?? ??? ??? ??? ?return (double)Value[Length / 2];
?? ??? ??? ?}

?? ??? ??? ?return (double)(Value[(Length - 1) / 2] + Value[Length / 2]) * 0.5;
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 和值查找表
?? ??? ?/// </summary>
?? ??? ?private int[,] lookup { get; set; } = null;

?? ??? ?/// <summary>
?? ??? ?/// 构建和值稀疏表
?? ??? ?/// </summary>
?? ??? ?public void Build_Sparse_Table()
?? ??? ?{
?? ??? ??? ?lookup = new int[Length + 1, Length + 1];
?? ??? ??? ?for (int i = 0; i < Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?lookup[i, 0] = Value[i];
?? ??? ??? ?}

?? ??? ??? ?for (int j = 1; (1 << j) <= Length; j++)
?? ??? ??? ?{
?? ??? ??? ??? ?for (int i = 0; (i + (1 << j) - 1) < Length; i++)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?if (lookup[i, j - 1] < lookup[i + (1 << (j - 1)), j - 1])
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?lookup[i, j] = lookup[i, j - 1];
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?else
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?lookup[i, j] = lookup[i + (1 << (j - 1)), j - 1];
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 稀疏查表法求 low high 之间的最小值
?? ??? ?/// </summary>
?? ??? ?/// <param name="low"></param>
?? ??? ?/// <param name="high"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public int Sparse_Min_Between(int low, int high)
?? ??? ?{
?? ??? ??? ?int j = (int)Math.Log(high - low + 1);
?? ??? ??? ?if (lookup[low, j] <= lookup[high - (1 << j) + 1, j])
?? ??? ??? ?{
?? ??? ??? ??? ?return lookup[low, j];
?? ??? ??? ?}
?? ??? ??? ?else
?? ??? ??? ?{
?? ??? ??? ??? ?return lookup[high - (1 << j) + 1, j];
?? ??? ??? ?}
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 转为 M x N 的矩阵
?? ??? ?/// </summary>
?? ??? ?/// <param name="m"></param>
?? ??? ?/// <param name="n"></param>
?? ??? ?/// <returns></returns>
?? ??? ?/// <exception cref="Exception"></exception>
?? ??? ?public int[,] ToMatrix(int m, int n)
?? ??? ?{
?? ??? ??? ?if (m * n != Length)
?? ??? ??? ?{
?? ??? ??? ??? ?throw new Exception("Error matrix size!");
?? ??? ??? ?}
?? ??? ??? ?int[,] matrix = new int[m, n];
?? ??? ??? ?for (int i = 0; i < m; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?for (int j = 0; j < n; j++)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?matrix[i, j] = this[i * n + j];
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?return matrix;
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// ToString函数的重写
?? ??? ?/// 1 overload 重载
?? ??? ?/// 2 override 重写
?? ??? ?/// 3 new 覆写
?? ??? ?/// </summary>
?? ??? ?/// <returns></returns>
?? ??? ?public override string ToString()
?? ??? ?{
?? ??? ??? ?string r = "";
?? ??? ??? ?foreach (int x in Value)
?? ??? ??? ?{
?? ??? ??? ??? ?r += x + ", ";
?? ??? ??? ?}
?? ??? ??? ?if (r.Length == 0) return "";
?? ??? ??? ?return r.Trim().Substring(0, r.Length - 1);
?? ??? ?}
?? ?}
}
?

2 代码格式

using System;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
?? ?/// <summary>
?? ?/// 加强版(整数)数组
?? ?/// 数组只是数组,
?? ?/// 如果需要Insert,Delete等操作,建议使用List
?? ?/// </summary>
?? ?public class IArray
?? ?{
?? ??? ?/// <summary>
?? ??? ?/// 随机数发生器
?? ??? ?/// </summary>
?? ??? ?private Random rnd { get; set; } = new Random((int)DateTime.Now.Ticks);
?? ??? ?/// <summary>
?? ??? ?/// 保存数组数据
?? ??? ?/// </summary>
?? ??? ?private int[] Value { get; set; } = null;
?? ??? ?/// <summary>
?? ??? ?/// 保存数组的原始数据
?? ??? ?/// </summary>
?? ??? ?private int[] Original { get; set; } = null;
?? ??? ?/// <summary>
?? ??? ?/// 数组的长度
?? ??? ?/// </summary>
?? ??? ?private int Length { get; set; } = Int16.MaxValue;

?? ??? ?/// <summary>
?? ??? ?/// 默认构造函数
?? ??? ?/// </summary>
?? ??? ?public IArray()
?? ??? ?{
?? ??? ??? ?Value = new int[Length];
?? ??? ??? ?Original = new int[Length];
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 指定长度的构造函数
?? ??? ?/// </summary>
?? ??? ?/// <param name="n"></param>
?? ??? ?public IArray(int n)
?? ??? ?{
?? ??? ??? ?Length = n;
?? ??? ??? ?Value = new int[Length];
?? ??? ??? ?Original = new int[Length];
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 以 x 为样板的构造函数(克隆)
?? ??? ?/// </summary>
?? ??? ?/// <param name="x"></param>
?? ??? ?public IArray(IArray x)
?? ??? ?{
?? ??? ??? ?Length = x.Length;
?? ??? ??? ?Value = new int[Length];
?? ??? ??? ?Original = new int[Length];
?? ??? ??? ?for (int i = 0; i < Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?Value[i] = x[i];
?? ??? ??? ??? ?Original[i] = x[i];
?? ??? ??? ?}
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 以数组 v 为数据的构造函数
?? ??? ?/// </summary>
?? ??? ?/// <param name="v"></param>
?? ??? ?public IArray(int[] v)
?? ??? ?{
?? ??? ??? ?Length = v.Length;
?? ??? ??? ?Value = new int[Length];
?? ??? ??? ?Original = new int[Length];
?? ??? ??? ?for (int i = 0; i < Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?Value[i] = v[i];
?? ??? ??? ??? ?Original[i] = v[i];
?? ??? ??? ?}
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 以数组 x 为数据的赋值型构造函数
?? ??? ?/// </summary>
?? ??? ?/// <param name="x"></param>
?? ??? ?public static implicit operator IArray(int[] x)
?? ??? ?{
?? ??? ??? ?return new IArray(x);
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 以字符串为数据的赋值型构造函数
?? ??? ?/// IArray a = "1,2,3,4";
?? ??? ?/// </summary>
?? ??? ?/// <param name="s"></param>
?? ??? ?public static implicit operator IArray(string s)
?? ??? ?{
?? ??? ??? ?string[] sa = s.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
?? ??? ??? ?List<int> list = new List<int>();
?? ??? ??? ?foreach (string sx in sa)
?? ??? ??? ?{
?? ??? ??? ??? ?if (Int32.TryParse(sx.Trim(), out int x))
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?list.Add(x);
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?return new IArray(list.ToArray());
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 第一个数据
?? ??? ?/// </summary>
?? ??? ?public int Left
?? ??? ?{
? ? ? ? ? ? set
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Value[0] = value;
? ? ? ? ? ? }
? ? ? ? ? ? get
? ? ? ? ? ? {
?? ??? ??? ??? ?return Value[0];
?? ??? ??? ?}
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 最后一个数据
?? ??? ?/// </summary>
?? ??? ?public int Right
?? ??? ?{
? ? ? ? ? ? set
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Value[Length - 1] = value;
? ? ? ? ? ? }
? ? ? ? ? ? get
?? ??? ??? ?{
?? ??? ??? ??? ?return Value[Length - 1];
?? ??? ??? ?}
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 最小数据
?? ??? ?/// </summary>
?? ??? ?public int Min
?? ??? ?{
?? ??? ??? ?get
?? ??? ??? ?{
?? ??? ??? ??? ?Array.Sort(Value);
?? ??? ??? ??? ?return Value[0];
?? ??? ??? ?}
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 最大数据
?? ??? ?/// </summary>
?? ??? ?public int Max
?? ??? ?{
?? ??? ??? ?get
?? ??? ??? ?{
?? ??? ??? ??? ?Array.Sort(Value);
?? ??? ??? ??? ?return Value[Length - 1];
?? ??? ??? ?}
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 提取数组数据
?? ??? ?/// </summary>
?? ??? ?public int[] GetValues
?? ??? ?{
?? ??? ??? ?get { return Value; }
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 提取指定下标数据
?? ??? ?/// </summary>
?? ??? ?/// <param name="index"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public int this[int index]
?? ??? ?{
?? ??? ??? ?get { return Value[index]; }
?? ??? ??? ?set { Value[index] = value; }
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 加号重载(两个IArray相加)
?? ??? ?/// </summary>
?? ??? ?/// <param name="a"></param>
?? ??? ?/// <param name="b"></param>
?? ??? ?/// <returns></returns>
?? ??? ?/// <exception cref="Exception"></exception>
?? ??? ?public static IArray operator +(IArray a, IArray b)
?? ??? ?{
?? ??? ??? ?if (a.Length != b.Length)
?? ??? ??? ?{
?? ??? ??? ??? ?throw new Exception("");
?? ??? ??? ?}
?? ??? ??? ?IArray c = new IArray(a);
?? ??? ??? ?for (int i = 0; i < a.Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?c[i] = a[i] + b[i];
?? ??? ??? ?}
?? ??? ??? ?return c;
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 加号重载(a的每个元素加上数值b)
?? ??? ?/// </summary>
?? ??? ?/// <param name="a"></param>
?? ??? ?/// <param name="b"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public static IArray operator +(IArray a, int b)
?? ??? ?{
?? ??? ??? ?IArray c = new IArray(a);
?? ??? ??? ?for (int i = 0; i < a.Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?c[i] = a[i] + b;
?? ??? ??? ?}
?? ??? ??? ?return c;
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 减号重载(两个IArray相减)
?? ??? ?/// </summary>
?? ??? ?/// <param name="a"></param>
?? ??? ?/// <param name="b"></param>
?? ??? ?/// <returns></returns>
?? ??? ?/// <exception cref="Exception"></exception>
?? ??? ?public static IArray operator -(IArray a, IArray b)
?? ??? ?{
?? ??? ??? ?if (a.Length != b.Length)
?? ??? ??? ?{
?? ??? ??? ??? ?throw new Exception("Not same array size!");
?? ??? ??? ?}
?? ??? ??? ?IArray c = new IArray(a);
?? ??? ??? ?for (int i = 0; i < a.Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?c[i] = a[i] - b[i];
?? ??? ??? ?}
?? ??? ??? ?return c;
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 减号重载(a的每个元素减去数值b)
?? ??? ?/// </summary>
?? ??? ?/// <param name="a"></param>
?? ??? ?/// <param name="b"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public static IArray operator -(IArray a, int b)
?? ??? ?{
?? ??? ??? ?IArray c = new IArray(a);
?? ??? ??? ?for (int i = 0; i < a.Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?c[i] = a[i] - b;
?? ??? ??? ?}
?? ??? ??? ?return c;
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 乘号重载(两个IArray的元素一一对应相乘)
?? ??? ?/// </summary>
?? ??? ?/// <param name="a"></param>
?? ??? ?/// <param name="b"></param>
?? ??? ?/// <returns></returns>
?? ??? ?/// <exception cref="Exception"></exception>
?? ??? ?public static IArray operator *(IArray a, IArray b)
?? ??? ?{
?? ??? ??? ?if (a.Length != b.Length)
?? ??? ??? ?{
?? ??? ??? ??? ?throw new Exception("Not same array size!");
?? ??? ??? ?}
?? ??? ??? ?IArray c = new IArray(a);
?? ??? ??? ?for (int i = 0; i < a.Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?c[i] = a[i] * b[i];
?? ??? ??? ?}
?? ??? ??? ?return c;
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 乘号重载(a的每个元素乘以数值b)
?? ??? ?/// </summary>
?? ??? ?/// <param name="a"></param>
?? ??? ?/// <param name="b"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public static IArray operator *(IArray a, int b)
?? ??? ?{
?? ??? ??? ?IArray c = new IArray(a);
?? ??? ??? ?for (int i = 0; i < a.Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?c[i] = a[i] * b;
?? ??? ??? ?}
?? ??? ??? ?return c;
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 除号重载(两个IArray的元素一一对应相除)
?? ??? ?/// </summary>
?? ??? ?/// <param name="a"></param>
?? ??? ?/// <param name="b"></param>
?? ??? ?/// <returns></returns>
?? ??? ?/// <exception cref="Exception"></exception>
?? ??? ?public static IArray operator /(IArray a, IArray b)
?? ??? ?{
?? ??? ??? ?if (a.Length != b.Length)
?? ??? ??? ?{
?? ??? ??? ??? ?throw new Exception("Not same array size!");
?? ??? ??? ?}
?? ??? ??? ?IArray c = new IArray(a);
?? ??? ??? ?for (int i = 0; i < a.Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?if (b[i] == 0)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?throw new Exception("Divided by zero!");
?? ??? ??? ??? ?}
?? ??? ??? ??? ?c[i] = a[i] / b[i];
?? ??? ??? ?}
?? ??? ??? ?return c;
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 除号重载(a的每个元素除以数值b)
?? ??? ?/// </summary>
?? ??? ?/// <param name="a"></param>
?? ??? ?/// <param name="b"></param>
?? ??? ?/// <returns></returns>
?? ??? ?/// <exception cref="Exception"></exception>
?? ??? ?public static IArray operator /(IArray a, int b)
?? ??? ?{
?? ??? ??? ?if (b == 0)
?? ??? ??? ?{
?? ??? ??? ??? ?throw new Exception("divided by zero");
?? ??? ??? ?}
?? ??? ??? ?IArray c = new IArray(a);
?? ??? ??? ?for (int i = 0; i < a.Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?c[i] = a[i] / b;
?? ??? ??? ?}
?? ??? ??? ?return c;
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 排序(正序)
?? ??? ?/// </summary>
?? ??? ?public void Sort()
? ? ? ? {
?? ??? ??? ?Array.Sort(Value);
? ? ? ? }
?? ??? ?/// <summary>
?? ??? ?/// 倒排序
?? ??? ?/// </summary>
?? ??? ?public void Reverse_Sort()
?? ??? ?{
?? ??? ??? ?Array.Sort(Value, (a, b) => b.CompareTo(a));
?? ??? ?}
?? ??? ?/// <summary>
?? ??? ?/// 以数组数据为参数的方程式
?? ??? ?/// F(x) = a[0] + a[1] * x + a[2]* x^2 ...
?? ??? ?/// 计算 F(x) 函数值
?? ??? ?/// </summary>
?? ??? ?/// <param name="x"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public double Compute_Equation(double x)
?? ??? ?{
?? ??? ??? ?double v = Value[0];
?? ??? ??? ?for (int i = 1; i < Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?v += Value[i] * Math.Pow(x, i);
?? ??? ??? ?}
?? ??? ??? ?return v;
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 左转(一格)
?? ??? ?/// </summary>
?? ??? ?public void Left_Rotate()
?? ??? ?{
?? ??? ??? ?int v = Left;
?? ??? ??? ?for (int i = 0; i < (Length - 1); i++)
?? ??? ??? ?{
?? ??? ??? ??? ?Value[i] = Value[i + 1];
?? ??? ??? ?}
?? ??? ??? ?Value[Length - 1] = v;
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 右转(一格)
?? ??? ?/// </summary>
?? ??? ?public void Right_Rotate()
?? ??? ?{
?? ??? ??? ?int v = Right;
?? ??? ??? ?for (int i = (Length - 1); i > 0; i--)
?? ??? ??? ?{
?? ??? ??? ??? ?Value[i] = Value[i - 1];
?? ??? ??? ?}
?? ??? ??? ?Value[0] = v;
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 左转(前) num 个数(递归方式)
?? ??? ?/// input: ?1,2,3,4,5,6,7
?? ??? ?/// output: 3,4,5,6,7,1,2
?? ??? ?/// </summary>
?? ??? ?/// <param name="num"></param>
?? ??? ?public void Left_Rotate(int num)
?? ??? ?{
?? ??? ??? ?if (num == 0)
?? ??? ??? ?{
?? ??? ??? ??? ?return;
?? ??? ??? ?}
?? ??? ??? ?num = (num % Length);
?? ??? ??? ?Reverse(0, num - 1);
?? ??? ??? ?Reverse(num, Length - 1);
?? ??? ??? ?Reverse(0, Length - 1);
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 下标 start 到 end 反转
?? ??? ?/// </summary>
?? ??? ?/// <param name="start"></param>
?? ??? ?/// <param name="end"></param>
?? ??? ?public void Reverse(int start, int end)
?? ??? ?{
?? ??? ??? ?while (start < end)
?? ??? ??? ?{
?? ??? ??? ??? ?int temp = Value[start];
?? ??? ??? ??? ?Value[start] = Value[end];
?? ??? ??? ??? ?Value[end] = temp;
?? ??? ??? ??? ?start++;
?? ??? ??? ??? ?end--;
?? ??? ??? ?}
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 左转 num 个数(非递归方式)
?? ??? ?/// input: ?1,2,3,4,5,6,7
?? ??? ?/// output: 3,4,5,6,7,1,2
?? ??? ?/// </summary>
?? ??? ?/// <param name="num"></param>
?? ??? ?public void Left_Rotate_No_Recurse(int num)
?? ??? ?{
?? ??? ??? ?if (num == 0 || num == Length)
?? ??? ??? ?{
?? ??? ??? ??? ?return;
?? ??? ??? ?}
?? ??? ??? ?num = num % Length;
?? ??? ??? ?int i = num;
?? ??? ??? ?int j = Length - num;
?? ??? ??? ?while (i != j)
?? ??? ??? ?{
?? ??? ??? ??? ?if (i < j)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?Swap(num - i, num + j - i, i);
?? ??? ??? ??? ??? ?j -= i;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?else
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?Swap(num - i, num, j);
?? ??? ??? ??? ??? ?i -= j;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?Swap(num - i, num, i);
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 从指定下标开始左转d个数
?? ??? ?/// </summary>
?? ??? ?/// <param name="i">开始下标</param>
?? ??? ?/// <param name="d">左转数</param>
?? ??? ?/// <param name="n"></param>
?? ??? ?public void Left_Rotate_Recurse(int i, int d, int n)
?? ??? ?{
?? ??? ??? ?if (d == 0 || d == n)
?? ??? ??? ?{
?? ??? ??? ??? ?return;
?? ??? ??? ?}
?? ??? ??? ?if ((n - d) == d)
?? ??? ??? ?{
?? ??? ??? ??? ?Swap(i, n - d + i, d);
?? ??? ??? ??? ?return;
?? ??? ??? ?}
?? ??? ??? ?if (d < (n - d))
?? ??? ??? ?{
?? ??? ??? ??? ?Swap(i, n - d + i, d);
?? ??? ??? ??? ?Left_Rotate_Recurse(i, d, n - d);
?? ??? ??? ?}
?? ??? ??? ?else
?? ??? ??? ?{
?? ??? ??? ??? ?Swap(i, d, n - d);
?? ??? ??? ??? ?Left_Rotate_Recurse(n - d + i, 2 * d - n, d);
?? ??? ??? ?}
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 将从下标fi开始的d个元素与从下标si开始的d个元素交换
?? ??? ?/// </summary>
?? ??? ?/// <param name="fi"></param>
?? ??? ?/// <param name="si"></param>
?? ??? ?/// <param name="d"></param>
?? ??? ?public void Swap(int fi, int si, int d)
?? ??? ?{
?? ??? ??? ?for (int i = 0; i < d; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?int temp = Value[fi + i];
?? ??? ??? ??? ?Value[fi + i] = Value[si + i];
?? ??? ??? ??? ?Value[si + i] = temp;
?? ??? ??? ?}
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 应用标准二分法快速查找数值
?? ??? ?/// </summary>
?? ??? ?/// <param name="key"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public int Pivoted_Binary_Search(int key)
?? ??? ?{
?? ??? ??? ?int pivot = Find_Pivot(0, Length - 1);
?? ??? ??? ?if (pivot == -1)
?? ??? ??? ?{
?? ??? ??? ??? ?return Binary_Search(0, Length - 1, key);
?? ??? ??? ?}
?? ??? ??? ?if (Value[pivot] == key)
?? ??? ??? ?{
?? ??? ??? ??? ?return pivot;
?? ??? ??? ?}
?? ??? ??? ?if (Value[0] <= key)
?? ??? ??? ?{
?? ??? ??? ??? ?return Binary_Search(0, pivot - 1, key);
?? ??? ??? ?}
?? ??? ??? ?return Binary_Search(pivot + 1, Length - 1, key);
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 递归当时快速搜索转轴数()
?? ??? ?/// 转轴是第一个后面的数小于自己的数的下标
?? ??? ?/// 比如:数组 3, 4, 5, 6, 1, 2 的转轴下标是 3 (6的下标)
?? ??? ?/// </summary>
?? ??? ?/// <param name="low"></param>
?? ??? ?/// <param name="high"></param>
?? ??? ?/// <returns></returns>
?? ??? ?private int Find_Pivot(int low, int high)
?? ??? ?{
?? ??? ??? ?if (high < low)
?? ??? ??? ?{
?? ??? ??? ??? ?return -1;
?? ??? ??? ?}
?? ??? ??? ?if (high == low)
?? ??? ??? ?{
?? ??? ??? ??? ?return low;
?? ??? ??? ?}

?? ??? ??? ?int mid = (low + high) / 2;
?? ??? ??? ?if (mid < high && Value[mid] > Value[mid + 1])
?? ??? ??? ?{
?? ??? ??? ??? ?return mid;
?? ??? ??? ?}

?? ??? ??? ?if (mid > low && Value[mid] < Value[mid - 1])
?? ??? ??? ?{
?? ??? ??? ??? ?return (mid - 1);
?? ??? ??? ?}

?? ??? ??? ?if (Value[low] >= Value[mid])
?? ??? ??? ?{
?? ??? ??? ??? ?return Find_Pivot(low, mid - 1);
?? ??? ??? ?}

?? ??? ??? ?return Find_Pivot(mid + 1, high);
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 标准二分搜索算法
?? ??? ?/// </summary>
?? ??? ?/// <param name="low"></param>
?? ??? ?/// <param name="high"></param>
?? ??? ?/// <param name="key"></param>
?? ??? ?/// <returns></returns>
?? ??? ?private int Binary_Search(int low, int high, int key)
?? ??? ?{
?? ??? ??? ?if (high < low)
?? ??? ??? ?{
?? ??? ??? ??? ?return -1;
?? ??? ??? ?}

?? ??? ??? ?int mid = (low + high) / 2;
?? ??? ??? ?if (key == Value[mid])
?? ??? ??? ?{
?? ??? ??? ??? ?return mid;
?? ??? ??? ?}
?? ??? ??? ?if (key > Value[mid])
?? ??? ??? ?{
?? ??? ??? ??? ?return Binary_Search((mid + 1), high, key);
?? ??? ??? ?}
?? ??? ??? ?return Binary_Search(low, (mid - 1), key);
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 搜索数组中是否有“对和值(两个数的和)”等于 x
?? ??? ?/// </summary>
?? ??? ?/// <param name="x"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public bool PairSum_Insort(int x)
?? ??? ?{
?? ??? ??? ?int i;
?? ??? ??? ?for (i = 0; i < Length - 1; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?if (Value[i] > Value[i + 1])
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?int l = (i + 1) % Length;
?? ??? ??? ?int r = i;
?? ??? ??? ?while (l != r)
?? ??? ??? ?{
?? ??? ??? ??? ?if (Value[l] + Value[r] == x)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?return true;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?if (Value[l] + Value[r] < x)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?l = (l + 1) % Length;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?else
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?r = (Length + r - 1) % Length;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?return false;
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 返回下标乘积最大数
?? ??? ?/// i*Value[i]
?? ??? ?/// </summary>
?? ??? ?/// <returns></returns>
?? ??? ?public int Maximum_Multipled_Sum()
?? ??? ?{
?? ??? ??? ?int res = int.MinValue;
?? ??? ??? ?for (int i = 0; i < Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?int curr_sum = 0;
?? ??? ??? ??? ?for (int j = 0; j < Length; j++)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?int index = (i + j) % Length;
?? ??? ??? ??? ??? ?curr_sum += j * Value[index];
?? ??? ??? ??? ?}
?? ??? ??? ??? ?res = Math.Max(res, curr_sum);
?? ??? ??? ?}
?? ??? ??? ?return res;
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 二分法搜索 low ... high 之间的最小数
?? ??? ?/// </summary>
?? ??? ?/// <param name="low"></param>
?? ??? ?/// <param name="high"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public int Min_Between(int low, int high)
?? ??? ?{
?? ??? ??? ?if (high < low)
?? ??? ??? ?{
?? ??? ??? ??? ?return Value[0];
?? ??? ??? ?}
?? ??? ??? ?if (high == low)
?? ??? ??? ?{
?? ??? ??? ??? ?return Value[low];
?? ??? ??? ?}
?? ??? ??? ?int mid = low + (high - low) / 2;
?? ??? ??? ?if (mid < high && Value[mid + 1] < Value[mid])
?? ??? ??? ?{
?? ??? ??? ??? ?return Value[mid + 1];
?? ??? ??? ?}
?? ??? ??? ?if (mid > low && Value[mid] < Value[mid - 1])
?? ??? ??? ?{
?? ??? ??? ??? ?return Value[mid];
?? ??? ??? ?}
?? ??? ??? ?if (Value[high] > Value[mid])
?? ??? ??? ?{
?? ??? ??? ??? ?return Min_Between(low, mid - 1);
?? ??? ??? ?}
?? ??? ??? ?return Min_Between(mid + 1, high);
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 计算(回转)数组的最大哈明距离
?? ??? ?/// </summary>
?? ??? ?/// <returns></returns>
?? ??? ?public int Maximum_Hamming_Distance()
?? ??? ?{
?? ??? ??? ?int[] brr = new int[2 * Length + 1];
?? ??? ??? ?for (int i = 0; i < Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?brr[i] = Value[i];
?? ??? ??? ?}
?? ??? ??? ?for (int i = 0; i < Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?brr[Length + i] = Value[i];
?? ??? ??? ?}
?? ??? ??? ?int maxHam = 0;
?? ??? ??? ?for (int i = 1; i < Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?int currHam = 0;
?? ??? ??? ??? ?for (int j = i, k = 0; j < (i + Length); j++, k++)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?if (brr[j] != Value[k])
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?currHam++;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
?? ??? ??? ??? ?if (currHam == Length)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?return Length;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?maxHam = Math.Max(maxHam, currHam);
?? ??? ??? ?}
?? ??? ??? ?return maxHam;
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 移动所有的 0 到数组末尾
?? ??? ?/// </summary>
?? ??? ?public void Push_Zeros_To_End()
?? ??? ?{
?? ??? ??? ?int count = 0;
?? ??? ??? ?for (int i = 0; i < Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?if (Value[i] != 0)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?Value[count++] = Value[i];
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?while (count < Length)
?? ??? ??? ?{
?? ??? ??? ??? ?Value[count++] = 0;
?? ??? ??? ?}
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// Fisher-Yates洗牌算法,听起来很高大上 :P
?? ??? ?/// Fisher–Yates shuffle Algorithm
?? ??? ?/// </summary>
?? ??? ?public void Randomize()
?? ??? ?{
?? ??? ??? ?for (int i = Length - 1; i > 0; i--)
?? ??? ??? ?{
?? ??? ??? ??? ?int j = rnd.Next(0, i + 1);
?? ??? ??? ??? ?int temp = Value[i];
?? ??? ??? ??? ?Value[i] = Value[j];
?? ??? ??? ??? ?Value[j] = temp;
?? ??? ??? ?}
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 计算第 k 个最小数
?? ??? ?/// </summary>
?? ??? ?/// <param name="k"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public int Kth_Smallest(int k)
?? ??? ?{
?? ??? ??? ?Array.Sort(Value);
?? ??? ??? ?return Value[k - 1];
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 下标 low ... high 之间的和值
?? ??? ?/// </summary>
?? ??? ?/// <param name="low"></param>
?? ??? ?/// <param name="high"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public int Sum_Between(int low, int high)
?? ??? ?{
?? ??? ??? ?int sum = 0;
?? ??? ??? ?for (int i = low; i < high; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?sum += Value[i];
?? ??? ??? ?}
?? ??? ??? ?return sum;
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 均值
?? ??? ?/// </summary>
?? ??? ?/// <returns></returns>
?? ??? ?public double Mean()
?? ??? ?{
?? ??? ??? ?double sum = 0.0;
?? ??? ??? ?for (int i = 0; i < Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?sum += Value[i];
?? ??? ??? ?}
?? ??? ??? ?return (double)sum / (double)Length;
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 中值(不是均值哦)
?? ??? ?/// </summary>
?? ??? ?/// <returns></returns>
?? ??? ?public double Median()
?? ??? ?{
?? ??? ??? ?Array.Sort(Value);
?? ??? ??? ?if ((Length % 2) != 0)
?? ??? ??? ?{
?? ??? ??? ??? ?return (double)Value[Length / 2];
?? ??? ??? ?}

?? ??? ??? ?return (double)(Value[(Length - 1) / 2] + Value[Length / 2]) * 0.5;
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 和值查找表
?? ??? ?/// </summary>
?? ??? ?private int[,] lookup { get; set; } = null;

?? ??? ?/// <summary>
?? ??? ?/// 构建和值稀疏表
?? ??? ?/// </summary>
?? ??? ?public void Build_Sparse_Table()
?? ??? ?{
?? ??? ??? ?lookup = new int[Length + 1, Length + 1];
?? ??? ??? ?for (int i = 0; i < Length; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?lookup[i, 0] = Value[i];
?? ??? ??? ?}

?? ??? ??? ?for (int j = 1; (1 << j) <= Length; j++)
?? ??? ??? ?{
?? ??? ??? ??? ?for (int i = 0; (i + (1 << j) - 1) < Length; i++)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?if (lookup[i, j - 1] < lookup[i + (1 << (j - 1)), j - 1])
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?lookup[i, j] = lookup[i, j - 1];
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?else
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?lookup[i, j] = lookup[i + (1 << (j - 1)), j - 1];
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 稀疏查表法求 low high 之间的最小值
?? ??? ?/// </summary>
?? ??? ?/// <param name="low"></param>
?? ??? ?/// <param name="high"></param>
?? ??? ?/// <returns></returns>
?? ??? ?public int Sparse_Min_Between(int low, int high)
?? ??? ?{
?? ??? ??? ?int j = (int)Math.Log(high - low + 1);
?? ??? ??? ?if (lookup[low, j] <= lookup[high - (1 << j) + 1, j])
?? ??? ??? ?{
?? ??? ??? ??? ?return lookup[low, j];
?? ??? ??? ?}
?? ??? ??? ?else
?? ??? ??? ?{
?? ??? ??? ??? ?return lookup[high - (1 << j) + 1, j];
?? ??? ??? ?}
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// 转为 M x N 的矩阵
?? ??? ?/// </summary>
?? ??? ?/// <param name="m"></param>
?? ??? ?/// <param name="n"></param>
?? ??? ?/// <returns></returns>
?? ??? ?/// <exception cref="Exception"></exception>
?? ??? ?public int[,] ToMatrix(int m, int n)
?? ??? ?{
?? ??? ??? ?if (m * n != Length)
?? ??? ??? ?{
?? ??? ??? ??? ?throw new Exception("Error matrix size!");
?? ??? ??? ?}
?? ??? ??? ?int[,] matrix = new int[m, n];
?? ??? ??? ?for (int i = 0; i < m; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?for (int j = 0; j < n; j++)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?matrix[i, j] = this[i * n + j];
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?return matrix;
?? ??? ?}

?? ??? ?/// <summary>
?? ??? ?/// ToString函数的重写
?? ??? ?/// 1 overload 重载
?? ??? ?/// 2 override 重写
?? ??? ?/// 3 new 覆写
?? ??? ?/// </summary>
?? ??? ?/// <returns></returns>
?? ??? ?public override string ToString()
?? ??? ?{
?? ??? ??? ?string r = "";
?? ??? ??? ?foreach (int x in Value)
?? ??? ??? ?{
?? ??? ??? ??? ?r += x + ", ";
?? ??? ??? ?}
?? ??? ??? ?if (r.Length == 0) return "";
?? ??? ??? ?return r.Trim().Substring(0, r.Length - 1);
?? ??? ?}
?? ?}
}


文章来源:https://blog.csdn.net/beijinghorn/article/details/124151056
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。