面试题 16.15. 珠玑妙算

面试题 16.15. 珠玑妙算_第1张图片

【答案解析】:
遍历两个数组,统计猜中次数和伪猜中次数
猜中次数:若位置相同且颜色字符也相同在猜中次数计数器+1
伪猜中次数:颜色相同,但是在不同位置,这时候只需要除去猜中位置之外,统计两个数组中各个字符出现的数量,取较小的一方就是每种颜色伪猜中的数量了。
 
本人代码:
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* masterMind(char* solution, char* guess, int* returnSize)
{
    int* pa = (int*)malloc(sizeof(int) * 2);
    memset(pa, 0, sizeof(int) * 2);
    int arr1[26] = { 0 };
    int arr2[26] = { 0 };

    for (int i = 0; i < 4; i++)
    {
        if (solution[i] == guess[i])        //位置和颜色都相同
        {
            pa[0]++;
        }
        else                                            //颜色相同,各自相加
        {
            arr1[solution[i] - 'A']++;
            arr2[guess[i] - 'A']++;
        }
    }

    for (int i = 0; i < 26; i++)
    {
        pa[1] += arr1[i] > arr2[i] ? arr2[i] : arr1[i];         //两者取小
    }

    *returnSize = 2;
    return pa;
}

 

答案代码:
int* masterMind(char* solution, char* guess, int* returnSize){
*returnSize = 2;
static int arr[2] = {0};
arr[0] = 0; arr[1] = 0;//静态空间不会进行二次初始化因此每次重新初始化,可以使用memset函数
int s_arr[26] = {0};//26个字符位 solution 四种颜色数量统计
int g_arr[26] = {0};//26个字符位 guess 四种颜色数量统计
for (int i = 0; i < 4; i++) {
if (solution[i] == guess[i]) {
arr[0] += 1;//位置和颜色完全一致则猜中数量+1
}else {
//统计同一位置不同颜色的两组颜色数量,伪猜中不需要对应位置相同,只需要有对应数量的颜色就行
s_arr[solution[i]-'A'] += 1; //统计solution对应颜色字符出现次数
g_arr[guess[i]-'A'] += 1;//统计guess对应颜色字符出现次数
}
}
//在两个颜色数量统计数组中查看颜色数量,取相同位置较小的一方就是为猜中数量
for (int i = 0; i < 26; i++) {
arr[1] += s_arr[i] > g_arr[i] ? g_arr[i] : s_arr[i];
}
return arr;
}

 

 

 

你可能感兴趣的:(算法,c语言)