从数组中省略'N'个元素集

时间:2012-03-15 21:18:39

标签: c arrays algorithm tcl

我有一个带有一组元素(超过100个元素)的数组a [],当给出输入'N'和'M'时,它必须忽略数组中'N'个元素的数量,' M'应为1或2是否忽略第一组或第二组'N'元素并继续执行直到数组结束..并将此O / P写入新数组b []。

例如,如果

a[]= {10,20,30,40,60,70,80,90,100}

if N=2, M=1
    O/p should be b[] = {30,40,80,90}

if N=2, M=2
    O/p should be b[] = {10,20,60,70,100}

我怎么能在TCL或C? TCL代码将受到高度赞赏,我将数组索引设置为“1”而不是“0”。

5 个答案:

答案 0 :(得分:2)

Tcl列表的索引编号为0。

set a [list 10 20 30 40 60 70 80 90 100]
set N 2
foreach M {1 2} {
    set b [list]
    for {set i [expr {$M==1 ? $N : 0}]} {$i < [llength $a]} {incr i [expr {2*$N}]} {
        set b [concat $b [lrange $a $i [expr {$i+$N-1}]]]
    }
    puts "$M: $b"
}

输出

1: 30 40 80 90
2: 10 20 60 70 100

答案 1 :(得分:1)

在C中,你可以这样做:

char * getShorterArray(char * my_array, size_t size, int n, int m) {
    char * res_arr;
    res_arr = malloc(sizeof(char) * (size - n)); 
    //                               ^ calculate the size of the result array
    if (res_arr == NULL)
        return res_arr;
    if (m > 0)
        memcpy(res_arr, my_array, m); // copy elements before m
    if (size - (m+n) > 0)
        memcpy(&res_arr[m], &my_array[m+n], size - (m+n)); //copy elements at the end
    return res_arr; 
}

请注意,我从索引0开始,而不是1.此外,一旦完成,内存应该free

答案 2 :(得分:1)

用于比较的JavaScript版本:

function neglect(arr, size, skip)
{
  var result = [];
  for (var i = 0; i < arr.length; i++)
    if (!(((i / size) ^ skip) & 1))
      result.push(arr[i]);
  return result;
}

我对C版本的考虑(在适当的位置改变数组,返回新的长度):

int neglect(int[] arr, int len, int size, int skip)
{
  int result = 0;
  int i;
  for (i = 0; i < len; i++)
    if (!(((i / size) ^ skip) & 1))
      arr[result++] = arr[i];
  return result;
}

请注意,我的算法在设计时没有考虑到效率。

答案 3 :(得分:1)

int neglect(int n, int m, int *a, int alen) {
    int *b = a;
    int src = 0;
    int dst = 0;

    a = (m == 1 ? a + n : a)
    alen = (m == 1 ? alen - n : alen)
    while (src < alen) {
        if (m == 2 && src % (n * 2) < n)
            b[dst++] = a[src++];
        else
            src++;
    }
    return dst;
}

答案 4 :(得分:0)

                     set N 3
                     set dic [array size dnlink]
                 set h 1    
    for { set i $N} {$i <= [expr $dic - 1] } {incr i [expr {2*$N}]} {

                    for {set j $i} {$j <= [expr {$i+$N-1}] } {incr j} {

                set k [expr {$i+$N-1}]
                                if { $k <= [expr $dic - 1] } {

                                         set dn($h) $dnlink($j) 
                     incr h 
                                      } 
                                                                                      }

                                                                                      }