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

2024-01-20 10:04

本文主要是介绍C#,实用新型加强版的整数数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

三连发

加强版整数数组源代码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);}}
}

这篇关于C#,实用新型加强版的整数数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/625633

相关文章

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据