題目:

解答:
bool is_valid_code(const char *p)
{
int i = 0;
int len = strlen(p);
for (i = 0; i < len; i++) {
if ((p[i] >= 'a' && p[i] <= 'z') ||
(p[i] >= 'A' && p[i] <= 'Z') ||
(p[i] >= '0' && p[i] <= '9') ||
(p[i] == '_'))
{
continue;
}
return false;
}
return true;
}
int business_index(const char *p)
{
int i = 0;
const char *cat[] = { "electronics", "grocery", "pharmacy", "restaurant", NULL };
for (i = 0; cat[i]; i++) {
if (!strcmp(p, cat[i])) {
return i;
}
}
return -1;
}
int mysort(const void *a, const void *b)
{
return strcmp(*(const char **)a, *(const char **)b);
}
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
char** validateCoupons(char** code, int codeSize, char** businessLine, int businessLineSize, bool* isActive, int isActiveSize, int* returnSize)
{
int i = 0;
int j = 0;
int cnt[4] = { 0 };
char **t[4] = { 0 };
char **r = calloc(codeSize, sizeof(char *));
for (i = 0; i < 4; i++) {
t[i] = calloc(codeSize + 1, sizeof(char *));
}
for (i = 0; i < codeSize; i++) {
int idx = 0;
if (code[i][0] == 0) {
continue;
}
if (isActive[i] == false) {
continue;
}
if (is_valid_code(code[i]) == false) {
continue;
}
idx = business_index(businessLine[i]);
if (idx < 0) {
continue;
}
t[idx][cnt[idx]] = calloc(sizeof(char), strlen(code[i]) + 1);
strcpy(t[idx][cnt[idx]], code[i]);
cnt[idx] += 1;
}
*returnSize = 0;
for (i = 0; i < 4; i++) {
if (cnt[i] == 0) {
continue;
}
qsort(t[i], cnt[i], sizeof(char *), mysort);
for (j = 0; t[i][j]; j++) {
r[(*returnSize)++] = t[i][j];
}
}
return r;
}