【问题标题】:Shifting n times algorithm移位 n 次算法
【发布时间】:2021-08-10 15:00:44
【问题描述】:

给定一个数组,从数组的开头到结尾,每当遇到数字“2”时,在其后添加另一个“2”。
这样做会删除数组中的最后一个元素,因为最终数组的大小应该与初始数组相同。

例如,如果初始数组是

[23, 2, 3, 12, 2, 2, 34, 55, 66, 79]

那么修改后的数组应该是

[23, 2, 2, 3, 12, 2, 2, 2, 2, 34]

预计时间复杂度为 O(n),您应该就地执行(仅使用恒定数量的额外内存)。

在 O(n^2) 中很容易,但在 O(n) 中???

【问题讨论】:

  • 欢迎来到 SO。请向我们展示您在 O(n) 尝试方面的尝试。你被困在哪里了?

标签: algorithm complexity-theory


【解决方案1】:

两次遍历数组

  1. 反复计算找到多少个 2,并跟踪最终数组的大小,以便知道何时停止。在您的示例中,当您到达 34 时,您应该知道最后三个元素无关紧要,因为在那之前您已经看到了三个 2。记住你停在哪里。
  2. 从您在第一轮中停止的位置向后穿过阵列。将每个元素复制到数组的末尾。如果是 2,复制两次。

有一个特殊情况需要处理,其中最后一个元素是 2,但没有空间放置它的副本。您必须在两次传递中都考虑到这一点。

【讨论】:

    【解决方案2】:
        #include<bits/stdc++.h>
    using namespace std;
    
    
    
    int main()
    {
        int arr[]={23, 2, 3, 12, 2, 2, 2, 55, 66, 79};
        int size=sizeof(arr)/sizeof(arr[0]);
        int p=size;
        int sd=size-1;
        for(int i=0;i<p;i++){
            if(arr[i]==2 && i!=p-1)
            p--;
        }
        int i=p-1;
        while(i>=0){
            if(arr[i]!=2){
                arr[sd]=arr[i];
                sd--;i--;
            }
            else if(arr[i]==2 && i==p-1){
                arr[sd]=arr[i];
                sd--;i--;
            }
            else{
                arr[sd]=arr[i];
                sd--;i--;
                arr[sd]=2;sd--;
            }
        }
    for(int i=0;i<size;i++){
           
           cout<<arr[i]<<endl;
        }
    return 0;
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      • 1970-01-01
      • 2010-10-26
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 2017-04-30
      相关资源
      最近更新 更多