2012-03-15 75 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

相關問題