2012-03-15 123 views
-2

我有一个数组a []和一组元素(超过100个元素),当给定输入'N'和'M'时,必须忽略'N '数组中元素的个数,'M'应该是1或2是否忽略第一组或第二组'N'个元素并继续处理直到数组结束..并将此O/P写入新数组b []。从阵列中省略'N'个元素集合

例如,如果

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'。

+2

索引做你的家庭作业自己使用阵列具有从 '1' 索引 – 2012-03-15 21:37:05

回答

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 
+0

格伦·杰克曼IM。我不能使用列表,因为依赖于这个部分的代码使用数组..你可以给我提供数组的代码,它的索引从'1'开始,而不是'0' – user1270123 2012-03-15 22:56:22

+0

@ user1270123,让我直接得到这个,你'阵列设置了{1 10 2 20 3 30 4 40 5 60 6 70 7 80 8 90 9 100}',对吗? – 2012-03-16 01:50:21

+0

是的,这是正确的。 – user1270123 2012-03-16 03:31:16

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 ED一旦你用它做。

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; 
} 

请注意,我的算法不是设计考虑到效率。

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; 
} 
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 
             } 
                         } 

                         } 
+0

在这里,我可以得到'N'个元素集,但是我放弃了最后一次迭代中的元素,如果我的数组是{1,10,2,20,3,30,40,4,40,5,50,6,60,7,70,8,80,9,90} I,元素的数量是 user1270123 2012-03-16 22:22:06

+0

你能重新格式化代码吗? – 2012-03-16 23:11:44

+0

int N = 3; (dnlink) int h = 1; (集合j = i;j≤(i + N-1); j ++)对于(int i = N;i≤(dic-1); i + =(2 * N))( ) (k <=(dic-1)){ dn [h] = dnlink [j];其中k =(i + N-1) h ++; } } } – user1270123 2012-03-17 01:13:00

相关问题