Пропуск N 'наборов элементов из массива - PullRequest
0 голосов
/ 16 марта 2012

У меня есть массив a [] с набором элементов (более 100 элементов), когда заданы входные данные 'N' и 'M', он должен пренебречь количеством элементов N в массиве 'M 'должно быть 1 или 2, чтобы пренебречь 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 ]

2 голосов
/ 16 марта 2012

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 голос
/ 16 марта 2012

Версия 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 голос
/ 16 марта 2012
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;
}
1 голос
/ 16 марта 2012

В 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, как только вы закончите с этим.

0 голосов
/ 17 марта 2012
                     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 
                                      } 
                                                                                      }

                                                                                      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...