I ' Я пишу функцию, которой передают указатель на массив длины 4. Этот массив будет содержать целые числа 0 <= x <= 52
, и я хотел бы создать массив длиной 48 с каждым целым числом от da Kine, который не находится в массиве. В python это было бы
# just included for specificity
cards = [card for card in deck if card not in hand]
в C, лучшее, что я могу сделать, это
int i, j, k, found_flag;
int cards[48]; /* int hand[4] is passed in */
k = 0;
for (i = 0; i < 52; i++) {
found_flag = 0;
for (j = 0; j < 4; j++) {
if (i == hand[j]) {
found_flag = 1;
break;
}
}
if (!found_flag) {
cards[k++] = i;
}
}
Это оптимально для этого обстоятельства? Как правило, это «идти» шаблон?
Конечно, ваш пример хорош для размера руки всего 4 - он достаточно ясен. В ситуациях, когда массивы были значительно больше, можно было использовать более эффективные алгоритмы, основанные на разного рода сортировках.
Например, поразрядная сортировка устраняет вложенные циклы:
int i, j;
int card_in_hand[52] = { 0 };
int cards[48]; /* int hand[4] is passed in */
for (i = 0; i < 4; i++)
card_in_hand[hand[i]] = 1;
j = 0;
for (i = 0; i < 52; i++)
if (!card_in_hand[i])
cards[j++] = i;
Можно ли это сделать таким образом?
cards_in_deck[48]={1};
for (int i=0;i<4;i++)
cards_in_deck[hand[i]]=0;
cards_in_deck — это массив со значением 1 для тех, кого нет в колоде. Это то, что вы ищете?
Вот небольшая тестовая программа, которую я собрал, чтобы решить эту проблему. Он создает набор, чтобы показать, какие карты выбраны, и сканирует набор, чтобы построить массив оставшихся карт.
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
int cardsSelected[4] = {3,7,10,49} ;
int cardsLeft[48] ;
int allCards[52] ;
memset(allCards,0,sizeof(int)*52) ;
for(int i= 0; i < 4; ++i) {
allCards[cardsSelected[i]] = 1 ;
}
int k = 0 ;
for(int i =0; i < 52; ++i) {
if (!allCards[i])
cardsLeft[k++] = i ;
}
for(int i = 0; i < 48; ++i) {
printf("%d ", cardsLeft[i]) ;
}
printf("\n") ;
return 0;
}