C# 在数组中定位值并将其向右移动

Posted

技术标签:

【中文标题】C# 在数组中定位值并将其向右移动【英文标题】:C# locate value in a array and move it to right 【发布时间】:2021-11-23 22:19:50 【问题描述】:

我的任务是在数组中找到一个与给定值相同的元素,然后在保持其他元素顺序的同时将其向右移动。一个例子(测试用例):

1, 2, 0, 1, 0, 1, 0, 3, 0, 1 for value = 0 => 1, 2, 1, 1, 3, 1, 0, 0, 0, 0

虽然我的代码可以在上面的例子中做到这一点,但它不能做的是一个非常具体的情况:如果数组中的元素等于 value 并且下一个元素也等于 value,它不会移动元素。再举个例子:

1, int.MinValue, int.MinValue, int.MaxValue, int.MinValue, -1, -3, -9, 1 , value = int.MinValue

预期结果: 1, int.MaxValue, -1, -3, -9, 1, int.MinValue, int.MinValue, int.MinValue

我的代码结果: 1, int.MinValue ,int.MaxValue, -1, -3, -9, 1, int.MinValue, int.MinValue

我认为转移是唯一的解决方案,是吗?我遇到了很多问题,我也尝试过Array.Copy,但结果总是超出范围。

我怎样才能让它在所有情况下都能正确移动/旋转?

代码:

        static void Main(string[] args)
        
            int[] source = new int[]  1, int.MinValue, int.MinValue, int.MaxValue, int.MinValue, -1, -3, -9, 1 ;
            int value = int.MinValue;

            for (int i = 0; i < source.Length; i++)
            
                if (source[i] == value)
                
                    LeftShiftArray(source, i);
                
            

            for (int i = 0; i < source.Length; i++)
            
                Console.WriteLine(source[i]);
            
        

        public static void LeftShiftArray(int[] source, int i)
        
            var temp1 = source[i];
            for (var j = i; j < source.Length - 1; j++)
            
                source[j] = source[j + 1];
            

            source[source.Length - 1] = temp1;

        

现在这个

【问题讨论】:

【参考方案1】:

我有一个简单的方法来解决这个问题。运行一个循环,您继续计算不等于您的数字的数字。并继续分配给arr[count]。然后增加count。最后,您将剩下的所有数字都分配给给定的数字。

static void MoveToEnd(int []arr, int n)

    int count = 0; 

    for (int i = 0; i < arr.Length; i++)
        if (arr[i] != n)
            arr[count++] = arr[i]; 

    while (count < arr.Length)
        arr[count++] = n;

请注意我是通过手机输入的答案,所以请避免输入错误。

【讨论】:

【参考方案2】:

这是一个经典的错误。这样想:

假设您将所有 0 移到后面 (value = 0)。当你在某个位置找到一个零时,比如 source[2],你可以从这个位置转换你的数组:

      1 1 0 0 1 1    
source[2] ^

到这里:

      1 1 0 1 1 0
source[2] ^

现在您已经移动了数组,代码中的下一步是将 i 增加 1。这意味着您进行的下一个比较将与 source[3]。在上面的数组中,它看起来像这样:

      1 1 0 1 1 0
  source[3] ^

你看到问题了吗?如果没有,请告诉我,我可以进一步解释。

PS。发布的其他代码存在一些问题,如果您将其提交给作业,可能会阻止您获得满分:)

【讨论】:

是的,是的,我知道问题所在,但是在将 source[i] == value 更改为 source[i] = source[i+1] 后,我不知道如何检查 value 是否仍然等于 value 。上面的例子非常好,一般来说轮班是我的想法,这不是任务要求,所以我只是有点过分了。 我不明白,你为什么要改成source[i+1]?您可以在问题中发布该代码吗? 我使用的修复方法是在找到匹配项时从 i 中减去 1。我还必须确保不对我移到后面的部分阵列进行分析。

以上是关于C# 在数组中定位值并将其向右移动的主要内容,如果未能解决你的问题,请参考以下文章

jQuery 将固定或绝对定位的元素向左或向右移动

如何将数组中的元素向右移动?

C#的两个控件在窗体移动。

c#中, 如何动态移动控件位置

网页定位元素

将给定数组中的所有零移动到末尾,并将每个非零元素替换为最接近的较大值(如果有)