2012-03-15 13 views
-2

入力 'N'と 'M'が与えられたとき、 'N'を無視しなければならないとき、 '配列の要素の数、' M 'は1番目または2番目の' N '要素のセットを無視し、配列の終わりまでこれを進めるかどうかにかかわらず1または2でなければなりません。この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} 

iはTCLまたはCでこれをどのように操作を行うことができるかどうか? TCLコードは高く評価され、配列インデックスは '1'に設定され、 '0'には設定されません。

+2

からインデックス化されている自分の '1' からインデックスを持つ配列を使用して –

答えて

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

グレン・ジャックマンイム。私はリストを使用することはできません。この部分に依存しているコードは配列を使用しています。配列にインデックスを '0'から '1'から始まる配列で与えてください。 – user1270123

+0

@ user1270123、 '' array set a {1 10 2 20 3 30 4 40 5 60 6 70 7 80 8 90 9 100} 'があります、そうですか? –

+0

はい、それは正しいです。 – user1270123

1

Cでは、あなたはこのようにそれを行うことができます:あなたはそれを完了したら、私は、インデックス0から開始

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

注意を、ない1はまた、メモリはfree編でなければなりません。比較のため

1

JavaScriptのバージョン:私のアルゴリズムが設計されていないことを

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

注:Cバージョン(新しい長さを返し、インプレース配列を変異させる)で

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

マイテイク効率を考慮して

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}の場合、要素の数は user1270123

+0

コードを再フォーマットできますか? –

+0

int N = 3; int dic =長さ(dnlink) int h = 1; (set 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

関連する問題