【问题标题】:Bi Directional Circular Arrays Algorithm without pointers没有指针的双向循环数组算法
【发布时间】:2013-09-08 20:00:39
【问题描述】:

我有一个包含 26 个英文字母字符的数组。说:

char a[26] = ['a','b','c','d'.......so on till ....'z']

我需要以圆形方式(可以顺时针或逆时针)移动数组中的元素。

我知道存在一种称为循环数组的数据结构,但它是单向的。

说,我想将数组中的每个元素向前移动 3 个元素,那么新数组应该是:

char new[26] = ['x','y','z','a','b'... and so on till 'w']

但是,我可能还想将元素向后移动 2 个元素,那么我的新数组应该是:

char new[26]=['c','d','e'....and so on... 'y','z','a','b']

所有这些都应该在不使用指针的情况下完成(因为我还没有读过指针)。

有什么方法可以实现吗?

我已经搜索了很多关于循环数组的内容,但我从未意识到简单数组可以用作循环数组并且可以向前和向后移动元素。有人可以告诉我是否有办法做到这一点?

数组大小是固定的。

我们用 C 编码

【问题讨论】:

  • 请向我们展示您的代码。
  • 没有什么能比得上圆形数组......你必须让你的数组表现得像这样。
  • 如果索引不是你的指针,我建议使用以 26 为模向前或向后移动的索引。

标签: c arrays algorithm circular-buffer


【解决方案1】:

您只需在数组index 上使用模数:

size_t index;
size_t move_index(int pos_or_neg_steps) {
    return (index + pos_or_neg_steps) % 26;
}

【讨论】:

    【解决方案2】:

    天真地用 O(1) 额外的内存和 O(n^2) 时间

    C 代码(天真):

    void shiftElements(int *array, int size, int shift) {
      int i,reverse;
    
      reverse = shift < 0;
      if(shift < 0)
        shift = -shift;
      if(shift > size) 
        shift %= size;
    
      for(i=0; i < shift; ++i) {
        if(reverse)
          shiftForward(array,size);
        else
          shiftBackwards(array,size);
      }
    }
    
    void shiftForward(int *array, int size) {
      int tmp = array[size-1];
      int i;
      for(i=size; i>0; --i)
        array[i] = array[i-1]; 
      array[0] = tmp;
    }
    
    void shiftBackward(int *array, int size) {
      int tmp = array[0];
      int i;
      for(i=0; i<size; ++i)
        array[i] = array[i+1]; 
      array[size-1] = tmp;
    }
    

    O(N) 额外内存和 O(N) 时间内高效

    C代码(高效):

    void shiftElements(int *array, int size, int shift) {
      int i,reverse,absVal,*tmp;
    
      reverse = shift < 0;
      absVal  = shift < 0 ? -shift : shift;
      if(shift > size) 
        shift %= size;
      *tmp = malloc(shift * sizeof *array);
    
      for(i=0; i < absVal; ++i)
        tmp[i] = array[size-shift+i];
    
      for(i=0; i < size; ++i)
        array[(i+shift)%size] = array[i];
    
      for(i=0; i < absVal; ++i)
        array[size+shift+i] = tmp[i];
      free(tmp);
    } // I still need to test some corner cases, but you should get the idea
    

    【讨论】:

      猜你喜欢
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      相关资源
      最近更新 更多