薛定谔不养猫 2024-04-20 21:57 采纳率: 30.8%
浏览 13

C# 提取数组中相邻元素差值的绝对值在指定范围内的元素

C# 有一个int数组A,以其中某个索引位置的元素为起点(比如下面数组从索引4位置开始),向两边扩散,提取出数组中同时满足每相邻两两元素之间差值的绝对值在指定范围内的元素(比如:<= 3),如果有不满足的元素,则从A数组中剔除该元素,生成一个新数组,再提取出数组中同时满足每相邻两两元素之间差值的绝对值在指定范围内的元素(<= 3),以此类推,最终得到的新数组中的元素每相邻两两元素之间差值的绝对值都在指定范围内的元素(<= 3)
原始数组A:

 int[] A = { 1, 2, 10, 20, 3, 15, 5, 1, 4};

int diffRange = 3; // 指定的差值的绝对值范围
解析:假设数组A从索引4的位置开始,即元素3,先向左边扩散相邻元素进行比较,前面一个元素为20,差值绝对值为17,不满足条件(<=3),将20从数组A中剔除,得到一个新数组A1 = { 1, 2, 10, 3, 15, 5, 1, 4};继续将元素3(此时该元素的索引变成了3)与前面的10进行比较,也不满足条件,则继续将10从数组中剔除,又得到一个新数组A2 = { 1, 2, 3, 15, 5, 1, 4};继续将元素3(此时的索引变成了2)与前面的2进行比较,满足条件;然后将元素2与前面的元素1进行比较,也满足条件;再将元素3与后面的元素15进行比较,不满足条件,则继续将15从数组中剔除,又得到一个新数组A3 = { 1, 2, 3, 5, 1, 4};然后将元素3与后面的元素5进行比较,满足条件;然后接着将元素5与后面的元素1进行比较,不满足条件,则继续将1从数组中剔除,又得到一个新数组A4 = { 1, 2, 3, 5, 4};然后将元素5与后面的元素4进行比较,也满足条件。
所以最终得到的新数组为:

int[] newA = { 1, 2, 3, 5, 4};  //满足条件的元素对应的索引为:0, 1, 4, 6, 8
  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-20 21:57
    关注

    引自免费微信小程序:皆我百晓生

    根据您的描述,我们可以编写一个C#方法来实现这个功能。这里是一个详细的步骤和相应的代码实现:

    首先,我们需要定义一个名为ExtractElementsWithinDifferenceRange的方法,它接受两个参数:一个整数数组inputArray和一个整数differenceRange。方法会返回一个新的数组,其中包含满足条件的元素。

    下面是完整的C#代码实现:

    using System;
    using System.Collections.Generic;
    
    class Program
    {
        static void Main()
        {
            int[] A = { 1, 2, 10, 20, 3, 15, 5, 1, 4 };
            int diffRange = 3;
    
            int[] newA = ExtractElementsWithinDifferenceRange(A, diffRange);
            
            Console.WriteLine("Original Array: ");
            PrintArray(A);
    
            Console.WriteLine("\nNew Array: ");
            PrintArray(newA);
        }
    
        static int[] ExtractElementsWithinDifferenceRange(int[] inputArray, int differenceRange)
        {
            Stack<int> indicesToCheck = new Stack<int>();
            List<int> result = new List<int>();
    
            // Start from the middle of the array and add indices to the stack
            for (int i = inputArray.Length / 2 - 1; i >= 0 && i < inputArray.Length; i++)
            {
                indicesToCheck.Push(i);
            }
    
            while (indicesToCheck.Count > 0)
            {
                int currentIndex = indicesToCheck.Pop();
                
                if (currentIndex == -1 || currentIndex == inputArray.Length)
                    continue;
    
                int leftIndex = Math.Max(0, currentIndex - 1);
                int rightIndex = Math.Min(inputArray.Length - 1, currentIndex + 1);
    
                bool isSatisfyingCondition = true;
    
                if (leftIndex != -1 && Math.Abs(inputArray[currentIndex] - inputArray[leftIndex]) > differenceRange)
                {
                    isSatisfyingCondition = false;
                }
                else if (rightIndex != inputArray.Length)
                {
                    if (Math.Abs(inputArray[currentIndex] - inputArray[rightIndex]) > differenceRange)
                    {
                        isSatisfyingCondition = false;
                    }
                    else
                    {
                        indicesToCheck.Push(rightIndex); // Add right index if it satisfies the condition
                    }
                }
    
                if (isSatisfyingCondition)
                {
                    result.Add(inputArray[currentIndex]);
                }
            }
    
            return result.ToArray();
        }
    
        static void PrintArray(int[] arr)
        {
            foreach (var item in arr)
            {
                Console.Write(item + " ");
            }
            Console.WriteLine();
        }
    }
    

    这段代码首先创建了一个Stack<int>用于存储待检查的索引,并初始化了一个列表result用于存储结果。接下来,我们从数组中间开始添加索引到栈中,然后进入循环,每次从栈中取出一个索引,检查其左侧和右侧的元素是否满足条件。如果满足条件,我们将当前元素添加到结果列表中。如果不满足条件,我们将移除该元素并可能将右侧元素添加到栈中以进一步检查。当栈为空时,我们退出循环,最后返回结果列表转换成的数组。

    运行上述代码后,您将在控制台看到原始数组和最终满足条件的新数组。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月20日

悬赏问题

  • ¥100 有偿,谁有移远的EC200S固件和最新的Qflsh工具。
  • ¥15 找一个QT页面+目标识别(行人检测)的开源项目
  • ¥15 有没有整苹果智能分拣线上图像数据
  • ¥20 有没有人会这个东西的
  • ¥15 cfx考虑调整“enforce system memory limit”参数的设置
  • ¥30 航迹分离,航迹增强,误差分析
  • ¥15 Chrome Manifest扩展引用Ajax-hook库拦截请求失败
  • ¥15 用Ros中的Topic通讯方式控制小乌龟的速度,走矩形;编写订阅器代码
  • ¥15 LLM accuracy检测
  • ¥15 pycharm添加远程解释器报错