题目一:
题目描述:
珠玑妙算游戏(the game of master mind)的玩法如下。
计算机有4个槽,每个槽放一个球,颜色可能是红色(R)、黄色(Y)、绿色(G)或蓝色(B)。例如,计算机可能有RGGB 4种(槽1为红色,槽2、3为绿色,槽4为蓝色)。作为用户,你试图猜出颜色组合。打个比方,你可能会猜YRGB。要是猜对某个槽的颜色,则算一次“猜中”;要是只猜对颜色但槽位猜错了,则算一次“伪猜中”。注意,“猜中”不能算入“伪猜中”。
给定一种颜色组合solution和一个猜测guess,编写一个方法,返回猜中和伪猜中的次数answer,其中answer[0]为猜中的次数,answer[1]为伪猜中的次数。
解题思路:
先统计每种颜色出现的次数,再取guess跟solution的每种颜色出现次数的最少值之和就是猜中+伪猜中总数
代码实现:
/** * Note: The returned array must be malloced, assume caller calls free(). */ #define MAX_NUM (2) #define MAX_LENGTH (4) #define FOUND 'F' int min(int a, int b) { if (a < b) return a; return b; } int* masterMind(char* solution, char* guess, int* returnSize) { int i = 0; int count = 0; int rs = 0; int ys = 0; int gs = 0; int bs = 0; int rg = 0; int yg = 0; int gg = 0; int bg = 0; int *answer = (int*)malloc(sizeof(int)*2); answer[0] = 0; answer[1] = 0; for (i=0; i < MAX_LENGTH; i++) { if (i < MAX_LENGTH) { if (guess[i] == solution[i]) { answer[0]++; } } } for (i=0; i < MAX_LENGTH; i++) { if (solution[i] == 'R') ++rs; else if (solution[i] == 'G') ++gs; else if (solution[i] == 'B') ++bs; else if (solution[i] == 'Y') ++ys; else solution[i] == FOUND; } for (i=0; i < MAX_LENGTH; i++) { if (guess[i] == 'R') ++rg; else if (guess[i] == 'G') ++gg; else if (guess[i] == 'B') ++bg; else if (guess[i] == 'Y') ++yg; else guess[i] == FOUND; } count += min(rs, rg)+min(gs, gg)+min(bs, bg)+min(ys, yg); answer[1] = count - answer[0]; *returnSize = MAX_NUM; return answer; }
结果情况:
符合题目要求,问题得到解决。
题目二:
题目描述:
给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。
(注:返回的数组下标从1开始算起,保证target一定可以由数组里面2个数字相加得到)
解题思路:
先找第一个加数,因为第二个加数可能会是负数,且题中说了最小为-10,所以判断如果某个数减10之后还大于sum,那么必不可能是第一个加数,看下一个。
找到第一个加数之后,便从其后面开始找第二个,一轮遍历没找到,就把第一个加数换成下一个再重新找。
代码实现:
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) { int* ret = (int*)malloc(sizeof(int) *2); //为数组申请2个整型大小的空间 if (numbersLen == 0) return NULL; *returnSize = 2; //控制返回数组中元素的个数为2 int i, j; for (i = 0; i < numbersLen - 1; i++) { if (numbers[i] - 10 > target) //可能会在后面被减掉10 continue;//跳过本次for,检查下一个元素 for (j = i + 1; j < numbersLen; j++) { //从某个小于目标值的数的后一个数开始比较 if (numbers[i] + numbers[j] == target) { ret[0] = i + 1; //所求第一个加数的下标值 ret[1] = j + 1; //所求第二个加数的下标值 return ret; //返回数组首地址 } } } return ret; }
结果情况:
符合题目要求,问题得到解决。
总结:
文章到这里就要告一段落了,有更好的想法或问题,欢迎评论区留言。
希望今天的练习能对您有所收获,咱们下期见!